1. 程式人生 > 其它 >BAT大廠面試Docker拿高薪,有它完全hold住

BAT大廠面試Docker拿高薪,有它完全hold住

相信經過前兩章的”內功“、”招式“,我們現在已經對Docker比較熟悉了,接下來我們就要學習如何構建私有映象以及私有映象倉庫,從而使我們所學的docker知識更方便的運用在工作之中。


** Docker映象製作**

我們在日常的工作中,常常需要製作公司自己的專案的容器,還要有一個屬於自己公司的私有倉庫,去儲存和隨時拉取映象。

而製作容器有兩種方式docker commit以及Dockerfile,接下來就瞭解一下這兩種方式吧

製作容器方法一:Docker commit:Docker commit

Mac下使用命令為:

docker commit 容器名 新映象名:tag  

製作好之後我們看圖片發現映象製作時間為20s之前,就是我們commit映象的時間。
使用這種方式的缺點是

  1. 對外不可解釋,假設映象出了問題,使用映象的人不好排查問題

  2. 第二個缺點是,可維護性差,因為對映象的操作沒有記錄。一個理想的映象製作過程應當如同編碼的過程一樣,可以通過閱讀程式碼或者註釋的方式,能夠知道映象的操作過程。所以我們一般更偏向於使用Dockerfile的方式

製作容器方法二:Dockerfile

建立一個Dockerfile,一般檔名約定的名稱為Dockerfile

Dockerfile中一些常用欄位的含義

實戰演示

Dockerfile指令碼

使用build命令構建映象,要注意Dockerfile要在當前目錄下,才可以直接執行docker
build。如果在別的路徑下面則需要新增-f

引數指定Dockerfile的路徑。但是在實際的工作中,我們更加提倡一個目錄管理一個Docker及一些配置檔案

如下圖所示,在執行命令時,我們會發現會將執行命令打印出來

如果我們需要將外部檔案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

我們分為兩個部分去試驗私有映象倉庫是否搭建成功。第一個部分是部署私有倉庫,第二個部分是向私有倉庫推送映象,並測試能否拉取成功

部署私有倉庫

  1. 拉取官方團隊映象
docker pull registry  
  1. 啟動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  

可以看到當前映象倉庫鏡沒有任何映象

推送並測試拉取映象

  1. 下載任意一個映象
docker pull busybox  
  1. 為這個打一層tag
docker tag busybox:latest 映象倉庫ip:5000/busybox:v1  

busybox:lastest 這是源映象,也是剛才pull下來的映象檔案;
映象倉庫ip:5000/busybox:v1:這是目標映象,也是registry私有映象伺服器的IP地址和埠;

  1. 將打好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"]  
}  
  1. 再次去服務端映象倉庫檢視倉庫的映象,發現多了一個busybox的映象
curl http://localhost:5000/v2/_catalog
  1. 將本地映象清空,然後拉取服務端映象倉庫映象
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等相關技術,全面提升測試開發工程師的技術實力

點選獲取更多資訊