使用Dockerfile生成鏡像
1. 查詢?nèi)萜餍薷臍v史
docker diff [容器名]
如果docker diff webserver
查看之前的容器修改歷史嚎研,你會(huì)發(fā)現(xiàn)除了用vi修改過(guò)的/usr/share/nginx/html/index.html文件外蓖墅,還有其他很多文件被修改或者改動(dòng)了,這是因?yàn)楹芏嗝畹膱?zhí)行雖然沒(méi)有指定文件临扮,但也會(huì)對(duì)必要的文件做修改
2. 刪除指定鏡像
docker rmi [鏡像ID]
由于鏡像ID具有隨機(jī)性论矾,基本上重復(fù)度很小,因此docker rmi [鏡像ID前四位]
也可以刪除符合參數(shù)的鏡像
可能你會(huì)疑惑萬(wàn)一剛好就有ID前四位重復(fù)的鏡像怎么辦
沒(méi)關(guān)系杆勇,就算ID全部重復(fù)的情況都可能出現(xiàn)贪壳,之后會(huì)講如何刪除這種鏡像
3. 建立Dockerfile
在一個(gè)空白目錄中建一個(gè)名為Dockerfile的空白文檔
mkdir mynginx
cd mynginx
touch Dockerfile
創(chuàng)建名為mynginx的空目錄
進(jìn)入這個(gè)目錄
創(chuàng)建名為Dockerfile的空文件
4. 修改Dockerfile
vi Dockerfile
如果像
FROM nginx
RUN echo '<h1 href="newpage.html">Hello, Dockerfile!</h1>' > /usr/share/nginx/html/index.html
RUN touch /usr/share/nginx/html/newpage.html
RUN echo '<h1 herf="index.html>Newpage!</h1>' > /usr/share/nginx/html/newpage.html
這樣寫會(huì)導(dǎo)致每使用一次RUN就會(huì)建立一層鏡像
要避免這種情況應(yīng)改為像下面這樣
FROM nginx
RUN echo '1' > /usr/share/nginx/html/index.html \ && echo '<a href="newpage.html">to the moon </a>' > /usr/share/nginx/html/index.html \ && touch /usr/share/nginx/html/newpage.html \ && echo '<a href="index.html">back</a>' > /usr/share/nginx/html/newpage.html
表示在同一層鏡像中進(jìn)行操作完成之后再commit
如果你想在生成的鏡像中提前安裝vim,可以把
FROM nginx
下面一句改為RUN apt-get update && apt-get install vim -y \ && echo '1' > /usr/share/nginx/html/index.html \ && echo '<a href="newpage.html">to the moon </a>' > /usr/share/nginx/html/index.html \ && touch /usr/share/nginx/html/newpage.html \ && echo '<a href="index.html">back</a>' > /usr/share/nginx/html/newpage.html
5. 在Dockerfile文件所在目錄構(gòu)建鏡像并執(zhí)行
docker build -t nginx:v2 .
注意最后有個(gè)點(diǎn)蚜退,代表在當(dāng)前文件夾操作
6. 生成容器
docker run --name webserver -d -p 80:80 nginx:v2
7. 進(jìn)入容器并修改內(nèi)容
docker exec -it webserver bash
echo '<a href="newpage.html">go to newpage</a>' > /usr/share/nginx/html/index.html
如果你已經(jīng)在此鏡像中安裝了vim也可以在進(jìn)入容器后用vim編輯
vi /usr/share/nginx/html/index.html
8. 刪除容器鏡像重新開(kāi)始
如果中途誤操作導(dǎo)致沒(méi)有達(dá)到想要的效果闰靴,可以選擇刪除鏡像重新開(kāi)始
docker images
docker rmi [imageID前四位]
如果刪除鏡像時(shí)出現(xiàn)images is referenced in multiple repositories
的提示信息彪笼,是因?yàn)橐獎(jiǎng)h的鏡像打了tag,所以有重復(fù)ID的鏡像蚂且,刪除這種鏡像應(yīng)該刪名字而不是ID配猫,即
docker rmi [imageName]
配置私有倉(cāng)庫(kù)
如果想讓自己的鏡像在別的終端上可以使用,可以push到官方倉(cāng)庫(kù)杏死,也可以搭建一個(gè)個(gè)人倉(cāng)庫(kù)
這里只講如何搭建自己的倉(cāng)庫(kù)服務(wù)
1. 下載registry鏡像
docker pull registry
2. 通過(guò)registry鏡像啟動(dòng)容器
如果你像這樣生成容器的話
docker run -d -p 5000:5000 registry
默認(rèn)情況下泵肄,會(huì)將倉(cāng)庫(kù)存放于容器內(nèi)的/tmp/registry目錄下
這樣一來(lái)如果容器被刪除,則存放于容器中的鏡像也會(huì)丟失
所以我們一般來(lái)說(shuō)會(huì)指定本地一個(gè)目錄掛載到容器內(nèi)的/tmp/registry下识埋,像下面這樣
docker run --name registry -d -p 5000:5000 --restart=always -v `pwd`/data:/var/lib/registry registry:2
3. 查看端口是否已經(jīng)啟用
netstat -nltp
5000端口就是默認(rèn)的registry監(jiān)聽(tīng)端口
4. 測(cè)試registry
將虛擬機(jī)切換為橋接網(wǎng)絡(luò)凡伊,使用ifconfig
查看虛擬機(jī)的IP并作為鏡像倉(cāng)庫(kù)的IP
docker tag nginx:v2 <虛擬機(jī)的IP>:5000/nginx:v2
使用docker images
可以看到打上tag的這個(gè)鏡像,ID和沒(méi)打tag的鏡像是一樣的
5. 嘗試上傳
嘗試把這個(gè)鏡像傳到你的registry服務(wù)上
docker push <虛擬機(jī)的IP>:5000/nginx:v2
會(huì)出現(xiàn)報(bào)錯(cuò)server gave HTTP response to HTTPS client
因?yàn)镈ocker從1.3.X之后窒舟,與docker registry交互默認(rèn)使用的是https
然而此處搭建的私有倉(cāng)庫(kù)只提供http服務(wù)系忙,所以當(dāng)與私有倉(cāng)庫(kù)交互時(shí)就會(huì)報(bào)上面的錯(cuò)誤
需要在啟動(dòng)docker server時(shí)增加啟動(dòng)參數(shù)為默認(rèn)使用http訪問(wèn)
修改docker啟動(dòng)配置文件
sudo vi /etc/init/docker.conf
在其中# modify these in /etc/default/$UPSTART_JOB (/etc/default/docker)
找到exec "$DOCKERD" $DOCKER_OPTS --raw-logs
這一行
在DOCKER_OPTS
和--raw-logs
之間增加--insecure-registry <虛擬機(jī)的IP>:5000
6. 重啟服務(wù)之后再試一次
sudo service docker restart
docker push <虛擬機(jī)的IP>:5000/nginx:v2
可以看到push成功,則鏡像文件已經(jīng)成功傳到倉(cāng)庫(kù)服務(wù)中
之后再開(kāi)一臺(tái)虛擬機(jī)惠豺,保證兩臺(tái)虛擬機(jī)能夠ping通银还,就可以在新虛擬機(jī)中把之前上傳的文件拉取下來(lái)了
如果第二臺(tái)虛擬機(jī)出現(xiàn)報(bào)錯(cuò)server gave HTTP response to HTTPS client
說(shuō)明沒(méi)有增加啟動(dòng)參數(shù)為默認(rèn)使用http訪問(wèn)
也做一遍就可以了,最后嘗試?yán)?/p>
docker pull <虛擬機(jī)的IP>:5000/nginx:v2
downloading洁墙,成功