docker進(jìn)階使用

使用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,成功

參考資料

Docker學(xué)習(xí)筆記 — Docker私有倉庫搭建

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容