飲冰三年-人工智慧-Docker-52-Docker映象
上一節:飲冰三年-人工智慧-Docker-51-Docker常用命令
五、映象
1:什麼是Docker映象
映象是一種輕量級、可執行的獨立軟體包,用來打包軟體執行環境和基於執行環境開發的軟體,它包含執行某個軟體所需的所有內容,包括程式碼、執行時、庫、環境變數和配置檔案。
UnionFS(聯合檔案系統):Union檔案系統(UnionFS)是一種分層、輕量級並且高效能的檔案系統,它支援對檔案系統的修改作為一次提交來一層層的疊加,同時可以將不同目錄掛載到同一個虛擬檔案系統下(unite several directories into a single virtual filesystem)。Union 檔案系統是 Docker 映象的基礎。映象可以通過分層來進行繼承,基於基礎映象(沒有父映象),可以製作各種具體的應用映象。
Docker映象載入原理:
docker的映象實際上由一層一層的檔案系統組成,這種層級的檔案系統UnionFS。
bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引導載入kernel, Linux剛啟動時會載入bootfs檔案系統,在Docker映象的最底層是bootfs。這一層與我們典型的Linux/Unix系統是一樣的,包含boot載入器和核心。當boot載入完成之後整個核心就都在記憶體中了,此時記憶體的使用權已由bootfs轉交給核心,此時系統也會解除安裝bootfs。
rootfs (root file system) ,在bootfs之上
。
最大的一個好處就是 - 共享資源
比如:有多個映象都從相同的 base 映象構建而來,那麼宿主機只需在磁碟上儲存一份base映象,
同時記憶體中也只需載入一份 base 映象,就可以為所有容器服務了。而且映象的每一層都可以被共享。
2:Docker映象常用的命令
具體命令可參考上一節相關內容
dockerrun -it -p 8080:8080tomcat
dockerrun -it -Ptomcat 隨機分配的埠
3:構建映象之commit命令
我們並不推薦使用通過 docker commit 命令,而是應該使用更加靈活、更加強大的Dockerfile來構建Docker映象。不過,為了對docker有一個更全面的瞭解,我們還是會先介紹一下如何是使用 docker commit 構建Docker映象。
3.1 建立 Docker Hub 賬號
首先在 https://hub.docker.com/ 上註冊一個賬號。並登入成功!
3.2從 Hub上下載 tomcat 映象到本地把那個執行成功
dockerrun -it -p 8080:8080tomcat
ps:解決docker啟動tomcat容器訪問埠顯示404的問題,頁面顯示 源伺服器未能找到目標資源的表示或者是不願公開一個已經存在
- 1:先檢視防火牆狀況
# 關閉防火牆
systemctl stop firewalld.service
# 禁止防火牆開機啟動
systemctl disable firewalld.service
# 啟動docker
systemctl start docker
# 重啟docker
systemctl restart docker
關閉防火牆,重啟容器
- 2:那麼使用如下命名進入tomcat的目錄
docker exec -it 559f370266d5 /bin/bash
檢視當前資料夾內的所有檔案ls
進入webapps資料夾下,如果顯示total 0,我們就需要把webapps.dist中的內容複製到webapps資料夾下
cd webapps rm -f webapps cp -r webapps.dist webapps
- 3:如果使用的阿里雲的雲伺服器,別忘記設定相應的安全組規則
3.3 自定製容器
一般來說:我們不是真正的建立新映象,而是基於一個已有的基礎映象,進行修改,從而構建一個新映象而已。
修改上一步映象產生tomcat文件,(將docs修改為docs2)即當前的tomcat執行例項是一個沒有文件內容的容器
效果如下:
3.4 提交定製容器
docker commit -a="楊小可" -m="沒有說明文件的tomcat" 559f370266d5 2012094016/tomcat20200905
3.5 推送到遠端
建功立業、名垂青史的時候到了
docker push 2012094016/tomcat20200905
4:構建映象之Dockerfile檔案
Dockerfile是用來構建Docker映象的構建檔案,是由一系列命令和引數構成的指令碼
構建三部曲
- 編寫 Dockerfile檔案
- dockerbuild
- dockerrun
4.1 自定義mycentos映象
自定義mycentos目的使我們自己的映象具備如下:
- 登陸後的預設路徑
- vim編輯器
- 檢視網路配置ifconfig支援
步驟:
1:編寫
mkdir mydocker
cd mydocker
touch Dockerfile
chmod 755 Dockerfile
vim Dockerfile
FORM centos MAINTAINER yangke<1692134188@qq.com> ENV MYPATH /usr/local WORKDIR $MYPATH RUN yum -y install vim RUN yum -y install net-tools EXPOSE 80 CMD echo $MYPATH CMD echo "success----------ok" CMD /bin/bashDockerfile
2:構建
dockerbuild -t新映象名字:TAG .
docker build -t yangocnetos:20200905 . #會看到 docker build 命令最後有一個 . . 表示當前目錄
3:執行
dockerrun -it新映象名字:TAG
docker run-t yangocnetos:20200905
5:構建映象
5.1用 Dockerfile構建映象
建立一個示例倉庫
mkdir static_web cd static_web touch Dockerfile
我們建立了一個名為static_web 的目錄用來儲存 Dockerfile ,這個目錄就是我們的構建環境(buildenvironment ),Docker 稱此環境為上下文(context)或者構建上下文(buildcontext)。Docker會在構建映象時將構建上下文和該上下文中的檔案和目錄上傳到Docker守護程序。這樣Docker守護程序就能直接訪問使用者想在映象中儲存的任何程式碼、檔案或者其他資料。
#基於 node 映象 FROM node #指定維護者資訊 MAINTAINER yango 842221695@qq.com #指定下一條命令的執行目錄 WORKDIR /usr/local #新建路徑 RUN mkdir work #在 /usr/local 的基礎上指定執行目錄,所以當前目錄為:/usr/local/work WORKDIR work #安裝必要的元件 RUN npm install express RUN npm install express-generator -g RUN npm install supervisor -g RUN express myapp -e #將當前目錄下的檔案,複製到 /usr/local/work/ 下 #COPY . /usr/local/work/ WORKDIR /usr/local/work/myapp RUN npm install WORKDIR /usr/local/work/myapp #啟動 express 應用 CMD supervisor ./bin/www #暴露容器 3000 埠 EXPOSE 3000Dockerfile
Dockerfile由一系列指令和引數組成。每條指令,如 FROM,都必須為大寫字母,且後面要跟一個引數。
Dockerfile中的指令會按照順序從上到下執行,所以要根據需求合理安排指令的順序。
Dockerfile中的第一條指令必須是FROM。FROM指令指定一個已存在的映象,後續指令都將基於該映象進行,這個映象被稱為基礎映象(baseimage)
5.3 基於 Dockerfile構建新映象
cd static_web. sudo docker build -t="2012094016/static_web" .
執行dockerbuild命令時,Dockerfile中所有的指令都會被執行並且提交,並在該命令成功結束後返回一個新映象。
Sending build context to Docker daemon 2.56kB Step 1/14 : FROM node ---> 40ce906a3734 Step 2/14 : MAINTAINER yango 842221695@qq.com ---> Running in 411df953b1dc Removing intermediate container 411df953b1dc ---> dd524617272d Step 3/14 : WORKDIR /usr/local ---> Running in 366b3dab3633 Removing intermediate container 366b3dab3633 ---> 1794d0794b80 Step 4/14 : RUN mkdir work ---> Running in 07d6faaab03c Removing intermediate container 07d6faaab03c ---> f498bb2bed9b Step 5/14 : WORKDIR work ---> Running in dcd075746ec5 Removing intermediate container dcd075746ec5 ---> f1d39eb4051a Step 6/14 : RUN npm install express ---> Running in 8fd07342f96d npm WARN saveError ENOENT: no such file or directory, open '/usr/local/work/package.json' npm notice created a lockfile as package-lock.json. You should commit this file. npm WARN enoent ENOENT: no such file or directory, open '/usr/local/work/package.json' npm WARN work No description npm WARN work No repository field. npm WARN work No README data npm WARN work No license field. + express@4.17.1 added 50 packages from 37 contributors and audited 50 packages in 28.567s found 0 vulnerabilities Removing intermediate container 8fd07342f96d ---> ca9775afd524 Step 7/14 : RUN npm install express-generator -g ---> Running in 8fe89d188667 npm WARN deprecated mkdirp@0.5.1: Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.) /usr/local/bin/express -> /usr/local/lib/node_modules/express-generator/bin/express-cli.js + express-generator@4.16.1 added 10 packages from 13 contributors in 49.516s Removing intermediate container 8fe89d188667 ---> fe72518947f4 Step 8/14 : RUN npm install supervisor -g ---> Running in 9a21e1c0723e /usr/local/bin/node-supervisor -> /usr/local/lib/node_modules/supervisor/lib/cli-wrapper.js /usr/local/bin/supervisor -> /usr/local/lib/node_modules/supervisor/lib/cli-wrapper.js + supervisor@0.12.0 added 1 package from 28 contributors in 3.83s Removing intermediate container 9a21e1c0723e ---> 514a9bf1c6f3 Step 9/14 : RUN express myapp -e ---> Running in b30e0423ec6d warning: option `--ejs' has been renamed to `--view=ejs' create : myapp/ create : myapp/public/ create : myapp/public/javascripts/ create : myapp/public/images/ create : myapp/public/stylesheets/ create : myapp/public/stylesheets/style.css create : myapp/routes/ create : myapp/routes/index.js create : myapp/routes/users.js create : myapp/views/ create : myapp/views/error.ejs create : myapp/views/index.ejs create : myapp/app.js create : myapp/package.json create : myapp/bin/ create : myapp/bin/www change directory: $ cd myapp install dependencies: $ npm install run the app: $ DEBUG=myapp:* npm start Removing intermediate container b30e0423ec6d ---> 025262ae1892 Step 10/14 : WORKDIR /usr/local/work/myapp ---> Running in a8f9a77bf10c Removing intermediate container a8f9a77bf10c ---> eef7c2dc3c63 Step 11/14 : RUN npm install ---> Running in 09bc61f003f3 npm notice created a lockfile as package-lock.json. You should commit this file. added 54 packages from 38 contributors and audited 55 packages in 10.527s found 0 vulnerabilities Removing intermediate container 09bc61f003f3 ---> cc1224956b03 Step 12/14 : WORKDIR /usr/local/work/myapp ---> Running in b60b122ae810 Removing intermediate container b60b122ae810 ---> 29283effe59e Step 13/14 : CMD supervisor ./bin/www ---> Running in f0f32604001c Removing intermediate container f0f32604001c ---> 03ba7fc15b4c Step 14/14 : EXPOSE 3000 ---> Running in f8808b2e2fdd Removing intermediate container f8808b2e2fdd ---> f466127aa033 Successfully built f466127aa033 Successfully tagged 2012094016/static_web:latest映象build過程
我們使用了douckerbuild命令來構建新映象。我們通過 -t選項為新映象指定設定了倉庫和名稱。本例中倉庫為:2012094016,映象名為:static_web。
還可以在構建映象時為映象設定標籤
sudo docker build -t="2012094016/static_web:V1" .
如果沒有指定標籤,Docker 會自動為映象設定一個 latest 標籤。
上面命令中最後的.告訴Docker到本地目錄中去找 Dockerfile 檔案。也可以指定一個Git倉庫地址來指定Dockerfile位置。
sudo docker build -t="2012094016/static_web:V1" [email protected]:2012094016/docker-static_web
5.4 指令失敗會怎樣
假設,我們將Dockerfile中的安裝包名稱寫錯
會提示報錯的