1. 程式人生 > 實用技巧 >飲冰三年-人工智慧-Docker-52-Docker映象

飲冰三年-人工智慧-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之上

包含的就是典型 Linux 系統中的 /dev, /proc, /bin, /etc 等標準目錄和檔案。rootfs就是各種不同的作業系統發行版,比如Ubuntu,Centos等等。

最大的一個好處就是 - 共享資源

比如:有多個映象都從相同的 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映象的構建檔案,是由一系列命令和引數構成的指令碼

  構建三部曲

  1. 編寫 Dockerfile檔案
  2. dockerbuild
  3. dockerrun

  4.1 自定義mycentos映象

自定義mycentos目的使我們自己的映象具備如下:

  1. 登陸後的預設路徑
  2. vim編輯器
  3. 檢視網路配置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/bash
Dockerfile

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 3000
Dockerfile

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中的安裝包名稱寫錯

會提示報錯的