BAT大廠面試Docker拿高薪,有它完全hold住
相信經過前兩章的”內功“、”招式“,我們現在已經對Docker比較熟悉了,接下來我們就要學習如何構建私有映象以及私有映象倉庫,從而使我們所學的docker知識更方便的運用在工作之中。
** Docker映象製作**
我們在日常的工作中,常常需要製作公司自己的專案的容器,還要有一個屬於自己公司的私有倉庫,去儲存和隨時拉取映象。
而製作容器有兩種方式docker commit
以及Dockerfile
,接下來就瞭解一下這兩種方式吧
製作容器方法一:Docker commit:Docker commit
Mac下使用命令為:
docker commit 容器名 新映象名:tag
製作好之後我們看圖片發現映象製作時間為20s之前,就是我們commit映象的時間。
使用這種方式的缺點是
-
對外不可解釋,假設映象出了問題,使用映象的人不好排查問題
-
第二個缺點是,可維護性差,因為對映象的操作沒有記錄。一個理想的映象製作過程應當如同編碼的過程一樣,可以通過閱讀程式碼或者註釋的方式,能夠知道映象的操作過程。所以我們一般更偏向於使用
Dockerfile
的方式
製作容器方法二:Dockerfile
建立一個Dockerfile,一般檔名約定的名稱為Dockerfile
Dockerfile中一些常用欄位的含義
實戰演示
Dockerfile指令碼
使用build
命令構建映象,要注意Dockerfile要在當前目錄下
,才可以直接執行docker
build。如果在別的路徑下面則需要新增-f
如下圖所示,在執行命令時,我們會發現會將執行命令打印出來
如果我們需要將外部檔案copy到映象中供映象使用,則需要ADD
命令。而ENTRYPOINT
命令則是指定容器啟動指令碼。
首先,建立Dockerfile
並在與Dockerfile同個目錄下建立一個run.sh
指令碼。
我們進入容器內部可以發現,PID
為1的就是我們在Dockerfile中寫的run.sh
,而程序號為1的程序是所有程序的父程序,如果run.sh
程序結束,則其他程序也會一併結束,所以如果目的是啟動一個線上服務的容器
為run.sh新增許可權
chmod 777 run.sh
在build映象成功之後,我們就可以執行製作好的映象。
docker build -t test:v1.2 .
docker run -d --name=wayyt_test test:v1.2
接下來我們就可以進入映象,驗證run.sh映象是否copy到了映象內部
docker exec -it wayyt_test bash
結果是,成功!
接下來繼續為大家演示env
引數
我們在Dockerfile中填加一行ENV DOCKER_HOME=/usr/local/docker
,並在啟動指令碼中新增env
用來列印環境變數
啟動之後我們檢視日誌docker logs -f wayyt2
發現新增的環境變數成功列印了出來
ENV
的作用就是注入一些絕對固定的環境變數,這樣我們就不用在每次啟動後固定再去注入一些環境變數
如果,echo “hello world” >> /root/hello.log
前方有坑,注意避讓:
在使用以上配置方式配置Dockerfile時,我們常常會發現使用ssh協議連線容器的時候,明明在dockerfile中指定了環境變數,但是在執行中依然找不到環境變數
?
因為在任何使用者登入的時候,都會去找.bashrc
,執行其中的命令。如果在容器中,我們希望指定的環境變數在ssh協議中依然能夠生效。我們需要做的就是用echo
命令寫到bashrc
中。
如圖這樣子配置Dockerfile,將環境變數寫入bashrc,這樣通過jenkins或者ssh 協議的連線才能連線到
WORKDIR
的作用是指定容器的啟動目錄,只要在Dockerfile中指定一個已存在目錄WORKDIR /root/workdir
那麼當容器執行起來後,進入容器我們會發現,會直接進入WORKDIR
的指定路徑
** Docker私有倉庫**
在工作中,為了資訊保安,我們是不可能將私有的映象傳到dockerhub中使用,那如果要多個機器共享,又能怎麼辦呢?
所以每個公司/每個部門,都會有一個私有的映象倉庫供工作使用。私有倉庫,也就是在本地(區域網)搭建的一個類似公共倉庫的東西,搭建好之後,我們可以將映象提交到私有倉庫中。
接下來我們就教大家,如果搭建docker的私有映象倉庫。在學習docker的過程中,我們一定要養成多看官方文件的好習慣。
官方文件的地址:https://hub.docker.com/_/registry
我們分為兩個部分去試驗私有映象倉庫是否搭建成功。第一個部分是部署私有倉庫,第二個部分是向私有倉庫推送映象,並測試能否拉取成功
部署私有倉庫
- 拉取官方團隊映象
docker pull registry
- 啟動registry映象
docker run -d -p 5000:5000 -v /usr/local/registry:/var/lib/registry --restart=always --name registry registry:2
--restart=always
:如果容器出現意外停止,會自動進行重啟
3. 檢視當前倉庫的映象
curl http://localhost:5000/v2/_catalog
可以看到當前映象倉庫鏡沒有任何映象
推送並測試拉取映象
- 下載任意一個映象
docker pull busybox
- 為這個打一層tag
docker tag busybox:latest 映象倉庫ip:5000/busybox:v1
busybox:lastest 這是源映象,也是剛才pull下來的映象檔案;
映象倉庫ip:5000/busybox:v1:這是目標映象,也是registry私有映象伺服器的IP地址和埠;
- 將打好tag的映象推送到
映象倉庫ip:5000
倉庫中
docker push 映象倉庫ip:5000/busybox:v1
注意
在這個地方,可能會出現報錯http: server gave HTTP response to HTTPS client
,我們需要https的方法才能上傳,我們可以修改下daemon.json來解決:
vim /etc/docker/daemon.json
在daemon.json檔案中新增下面的內容,儲存後要重啟docker服務systemctl restart docker
{
"registry-mirrors": [ "https://registry.docker-cn.com"],
"insecure-registries": [ "172.18.18.90:5000"]
}
- 再次去
服務端映象倉庫
檢視倉庫的映象,發現多了一個busybox的映象
curl http://localhost:5000/v2/_catalog
- 將本地映象清空,然後拉取
服務端映象倉庫
映象
docker rmi -f $(docker images -aq)
docker images
docker pull 映象倉庫ip:5000/busybox:v1
從圖片中可以看出這次映象就拉取成功啦~
相信學習完這次的Docker內功研習、招式修煉、加上最後的內外結合,一定能讓你對Docker的理解”融會貫通“,更上一層樓。
本文為霍格沃茲測試學院學院助教WayytAD的學習筆記,想系統掌握測試乾貨,可新增小助手微信。
回覆“ 測試開發 ”入群諮詢
** _
來霍格沃茲測試開發學社,學習更多軟體測試與測試開發的進階技術,知識點涵蓋web自動化測試 app自動化測試、介面自動化測試、測試框架、效能測試、安全測試、持續整合/持續交付/DevOps,測試左移、測試右移、精準測試、測試平臺開發、測試管理等內容,課程技術涵蓋bash、pytest、junit、selenium、appium、postman、requests、httprunner、jmeter、jenkins、docker、k8s、elk、sonarqube、jacoco、jvm-sandbox等相關技術,全面提升測試開發工程師的技術實力