使用Dockerfile生成鏡像
1. 查詢?nèi)萜餍薷臍v史
docker diff [容器名]
如果docker diff webserver
查看之前的容器修改歷史,你會發(fā)現(xiàn)除了用vi修改過的/usr/share/nginx/html/index.html文件外,還有其他很多文件被修改或者改動了,這是因為很多命令的執(zhí)行雖然沒有指定文件,但也會對必要的文件做修改
2. 刪除指定鏡像
docker rmi [鏡像ID]
由于鏡像ID具有隨機性,基本上重復(fù)度很小,因此docker rmi [鏡像ID前四位]
也可以刪除符合參數(shù)的鏡像
可能你會疑惑萬一剛好就有ID前四位重復(fù)的鏡像怎么辦
沒關(guān)系,就算ID全部重復(fù)的情況都可能出現(xiàn),之后會講如何刪除這種鏡像
3. 建立Dockerfile
在一個空白目錄中建一個名為Dockerfile的空白文檔
mkdir mynginx
cd mynginx
touch Dockerfile
創(chuàng)建名為mynginx的空目錄
進(jìn)入這個目錄
創(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
這樣寫會導(dǎo)致每使用一次RUN就會建立一層鏡像
要避免這種情況應(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 .
注意最后有個點,代表在當(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. 刪除容器鏡像重新開始
如果中途誤操作導(dǎo)致沒有達(dá)到想要的效果,可以選擇刪除鏡像重新開始
docker images
docker rmi [imageID前四位]
如果刪除鏡像時出現(xiàn)images is referenced in multiple repositories
的提示信息,是因為要刪的鏡像打了tag,所以有重復(fù)ID的鏡像,刪除這種鏡像應(yīng)該刪名字而不是ID,即
docker rmi [imageName]
配置私有倉庫
如果想讓自己的鏡像在別的終端上可以使用,可以push到官方倉庫,也可以搭建一個個人倉庫
這里只講如何搭建自己的倉庫服務(wù)
1. 下載registry鏡像
docker pull registry
2. 通過registry鏡像啟動容器
如果你像這樣生成容器的話
docker run -d -p 5000:5000 registry
默認(rèn)情況下,會將倉庫存放于容器內(nèi)的/tmp/registry目錄下
這樣一來如果容器被刪除,則存放于容器中的鏡像也會丟失
所以我們一般來說會指定本地一個目錄掛載到容器內(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)聽端口
4. 測試registry
將虛擬機切換為橋接網(wǎng)絡(luò),使用ifconfig
查看虛擬機的IP并作為鏡像倉庫的IP
docker tag nginx:v2 <虛擬機的IP>:5000/nginx:v2
使用docker images
可以看到打上tag的這個鏡像,ID和沒打tag的鏡像是一樣的
5. 嘗試上傳
嘗試把這個鏡像傳到你的registry服務(wù)上
docker push <虛擬機的IP>:5000/nginx:v2
會出現(xiàn)報錯server gave HTTP response to HTTPS client
因為Docker從1.3.X之后,與docker registry交互默認(rèn)使用的是https
然而此處搭建的私有倉庫只提供http服務(wù),所以當(dāng)與私有倉庫交互時就會報上面的錯誤
需要在啟動docker server時增加啟動參數(shù)為默認(rèn)使用http訪問
修改docker啟動配置文件
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 <虛擬機的IP>:5000
6. 重啟服務(wù)之后再試一次
sudo service docker restart
docker push <虛擬機的IP>:5000/nginx:v2
可以看到push成功,則鏡像文件已經(jīng)成功傳到倉庫服務(wù)中
之后再開一臺虛擬機,保證兩臺虛擬機能夠ping通,就可以在新虛擬機中把之前上傳的文件拉取下來了
如果第二臺虛擬機出現(xiàn)報錯server gave HTTP response to HTTPS client
說明沒有增加啟動參數(shù)為默認(rèn)使用http訪問
也做一遍就可以了,最后嘗試?yán)?/p>
docker pull <虛擬機的IP>:5000/nginx:v2
downloading,成功