改镜像_镜像制作大法
鏡像制作大法
一、前言
上一節(jié)《程序員背鍋救星-docker》中,我們講述了docker最基本的概念以及鏡像、容器以及倉(cāng)庫(kù)的概念和使用,還包含了實(shí)踐內(nèi)容,我們通過拉取centos鏡像,創(chuàng)建容器并且進(jìn)入容器對(duì)linux系統(tǒng)進(jìn)行操作;但是那只是利用了倉(cāng)庫(kù)中的鏡像,然后創(chuàng)建容器進(jìn)行操作的,那我們?nèi)绻枰约旱溺R像改怎么做呢?這次就和大家一起看看鏡像是怎么制作的~
二、制作鏡像
一般制作鏡像有兩種方式,一種是基于commit命令,另外一種是基于dockerfile創(chuàng)建鏡像;
過程如下圖所示:
對(duì)于這兩種創(chuàng)建鏡像的方式,我們會(huì)實(shí)地操作一下,并且會(huì)區(qū)分一下兩種鏡像創(chuàng)建的優(yōu)點(diǎn)缺點(diǎn);
一般在工作中,會(huì)采用第二種方式,至于為什么不采用第一種,后面細(xì)說~
<1>基于commit命令
基于commit命令
命令:
docker commit :從容器創(chuàng)建一個(gè)新的鏡像。
docker?commit?[OPTIONS]?CONTAINER?[REPOSITORY[:TAG]]OPTIONS說明:
- -a :提交的鏡像作者;
- -c :使用Dockerfile指令來創(chuàng)建鏡像;
- -m :提交時(shí)的說明文字;
- -p :在commit時(shí),將容器暫停。
實(shí)踐:
按照之前《程序員背鍋救星-docker》中的實(shí)例,我們把這個(gè)容器制作成一個(gè)新的鏡像;
1、拉取鏡像
docker?pull?centos:centos72、運(yùn)行鏡像
docker?run?-itd?--name?centos-test?centis:centos73、進(jìn)入容器并安裝gcc、vim
4、在vim中編寫C代碼并編譯運(yùn)行
#include?int?main(){
????printf("this?is?test\n");
????return?0;
}
5、退出容器
exit6、獲取容器
docker?pa?-a7、從容器中制作鏡像
docker?image?10ba02adb18f8、再次制作容器
docker?run?-it?--name?test?mycentos:V1?/bin/bash進(jìn)去發(fā)現(xiàn),我們之前所有的環(huán)境都存在,證明我們的鏡像制作的很成功
以上就是使用commit制作docker進(jìn)行全部過程啦~
<2>基于dockerfile
基于dockerfile
1、dockerfile概念
Dockerfile是由一系列命令和參數(shù)構(gòu)成的腳本,這些命令應(yīng)用于基礎(chǔ)鏡像并最終創(chuàng)建一個(gè)新的鏡像。它們簡(jiǎn)化了從頭到尾的流程并極大的簡(jiǎn)化了部署工作。Dockerfile從FROM命令開始,緊接著跟隨者各種方法,命令和參數(shù)。其產(chǎn)出為一個(gè)新的可以用于創(chuàng)建容器的鏡像。
Dockerfile由一行行命令語句組成,支持#注釋。一般分為四個(gè)部分:基礎(chǔ)鏡像,維護(hù)者信息,鏡像操作指令和容器啟動(dòng)時(shí)執(zhí)行指令
2、Dockerfile 命令
下面簡(jiǎn)單的介紹幾個(gè)命令:
FROM
指明構(gòu)建的新鏡像是來自于基礎(chǔ)鏡像是什么,比如:
FROM?gcc:latestRUN
用于執(zhí)行后面跟著的命令行命令,有兩種格式:
shell 格式:RUN (終端操作命令一樣),例如:
RUN?mkdir?tmpexec 格式:RUN ["可執(zhí)行文件", "參數(shù)1", "參數(shù)2"],例如:
RUN?["./test"]
COPY
拷貝文件或目錄到鏡像中,COPY...,例如:
COPY?test.cpp?/home/CPP
ADD
拷貝文件或目錄到鏡像中,ADD...例如:
ADD?test.cpp?/home/CPP如果是URL或壓縮包,會(huì)自動(dòng)下載或自動(dòng)解壓。
WORKDIR
為RUN、CMD、ENTRYPOINT以及COPY和AND設(shè)置工作目錄,例如:
WORKDIR?/home/CPP
CMD
啟動(dòng)容器時(shí)執(zhí)行的Shell命令,例如:
CMD?[“./test”]注:如果 Dockerfile 中如果存在多個(gè) CMD 指令,僅最后一個(gè)生效。
- CMD 在docker run 時(shí)運(yùn)行。
- RUN 是在 docker build。
ENV
設(shè)置環(huán)境變量,定義了環(huán)境變量,那么在后續(xù)的指令中,就可以使用這個(gè)環(huán)境變量。
格式:
ENV??
基本的命令就是這些了,對(duì)于我們構(gòu)建一個(gè)鏡像也差不多了,后續(xù)需要其他命令,可以自行學(xué)習(xí)~
實(shí)踐
構(gòu)建一個(gè)運(yùn)行C++程序的鏡像
1、編寫C++代碼
#include?#include?
using?namespace?std;
int?main()
{
????while(1)
????{
????????sleep(1);
????????cout<<"this?is?test"<????}
????return?0;
}
2、編寫dockerfile
FROM?codenvy/cpp_gccRUN?mkdir?/home/test
ADD?test.cpp?/home/test
WORKDIR?/home/test
RUN?g++?test.cpp
CMD?["./a.out"]
3、創(chuàng)建鏡像
執(zhí)行命令:
docker?build?-f?./test_dockerfile?-t?test_cpp_dockerfile?.如果提示下面的錯(cuò)誤:
?--->?Running?in?de73d0b0da3emkdir:?cannot?create?directory?‘/home/test’:?Permission?denied
The?command?'/bin/sh?-c?mkdir?/home/test'?returned?a?non-zero?code:?1
需要在dockerflie中加上
USER?root5、查看鏡像是否創(chuàng)建成功
docker?images6、運(yùn)行容器
docker?run?test_cpp_dockerfile我們會(huì)發(fā)現(xiàn)我們的程序運(yùn)行正常,沒有異常。
三、總結(jié)
這就是我們一般使用這兩種方式構(gòu)建鏡像,但是我們一般使用**Dockerfile **進(jìn)行創(chuàng)建,原因如下:(采用網(wǎng)絡(luò)資料)
使用docker commit命令雖然可以比較直觀的幫助理解鏡像分層存儲(chǔ)的概念,但是實(shí)際環(huán)境中并不會(huì)這樣使用。
首先,如果在安裝軟件,編譯構(gòu)建,那會(huì)有大量的無關(guān)內(nèi)容被添加進(jìn)來,如果不小心清理,將會(huì)導(dǎo)致鏡像及其臃腫。
此外,使用docker commit 意味著所有對(duì)鏡像的操作都是黑箱操作,生成的鏡像也被稱為黑箱鏡像,換句話說,就是除了制定鏡像的人知道執(zhí)行過什么命令,怎么生成的鏡像,別人根本無從得知,而且,即使是這個(gè)制作鏡像的人,過一段時(shí)間后也無法記清具體的操作的。雖然docker diff或許可以得到一點(diǎn)線索,但是遠(yuǎn)遠(yuǎn)不到可以確保生成一致鏡像的地步。這種黑箱鏡像的維護(hù)工作是非常痛苦的。
而且,任何修改的結(jié)果僅僅是在當(dāng)前層進(jìn)行標(biāo)記,添加,修改,而不會(huì)改動(dòng)上一層。如果使用docker commit制作鏡像,以及后期修改的話,每一次修改都會(huì)讓鏡像更加臃腫一次,所刪除的上一層的東西并不會(huì)丟失,會(huì)一直如影隨形的跟著這個(gè)鏡像,即使根本無法訪問到,這會(huì)使鏡像更加臃腫。
docker commit有一些特殊的應(yīng)用場(chǎng)合,比如被入侵后保存現(xiàn)場(chǎng)等。但是,不要使用docker commmit定制鏡像,定制行為應(yīng)該使用Dockerfile來完成。
祝大家早日熟練使用docker相關(guān)命令~
程序員背鍋救星-docker
重溫TCP協(xié)議
探索靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的“奧秘”
禁止拷貝構(gòu)造,禁止bug
微信公眾號(hào) : 后臺(tái)服務(wù)器開發(fā)
語言:C++ JAVA ?python
●?掃碼關(guān)注我們
點(diǎn)點(diǎn)在看行不行
總結(jié)
以上是生活随笔為你收集整理的改镜像_镜像制作大法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓APP破解利器之FRIDA
- 下一篇: 作业30-首页列表显示全部问答,完成问答