成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Docker(二):Dockerfile使用介紹

企業動態
Docker 鏡像是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些為運行時準備的一些配置參數(如匿名卷、環境變量、用戶等)。鏡像不包含任何動態數據,其內容在構建之后也不會被改變。

上一篇文章Docker(一):Docker入門教程介紹了 Docker 基本概念,其中鏡像、容器和 Dockerfile 。我們使用 Dockerfile 定義鏡像,依賴鏡像來運行容器,因此 Dockerfile 是鏡像和容器的關鍵,Dockerfile 可以非常容易的定義鏡像內容,同時在我們后期的微服務實踐中,Dockerfile 也是重點關注的內容,今天我們就來一起學習它。

[[226685]]

首先通過一張圖來了解 Docker 鏡像、容器和 Dockerfile 三者之間的關系。

通過上圖可以看出使用 Dockerfile 定義鏡像,運行鏡像啟動容器。

Dockerfile 概念

Docker 鏡像是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些為運行時準備的一些配置參數(如匿名卷、環境變量、用戶等)。鏡像不包含任何動態數據,其內容在構建之后也不會被改變。

鏡像的定制實際上就是定制每一層所添加的配置、文件。如果我們可以把每一層修改、安裝、構建、操作的命令都寫入一個腳本,用這個腳本來構建、定制鏡像,那么之前提及的無法重復的問題、鏡像構建透明性的問題、體積的問題就都會解決。這個腳本就是 Dockerfile。

Dockerfile 是一個文本文件,其內包含了一條條的指令(Instruction),每一條指令構建一層,因此每一條指令的內容,就是描述該層應當如何構建。有了 Dockerfile,當我們需要定制自己額外的需求時,只需在 Dockerfile 上添加或者修改指令,重新生成 image 即可,省去了敲命令的麻煩。

Dockerfile 文件格式

Dockerfile文件格式如下:

  1. ##  Dockerfile文件格式 
  2.  
  3. # This dockerfile uses the ubuntu image 
  4. # VERSION 2 - EDITION 1 
  5. # Author: docker_user 
  6. # Command format: Instruction [arguments / command] .. 
  7.   
  8. # 1、***行必須指定 基礎鏡像信息 
  9. FROM ubuntu 
  10.   
  11. # 2、維護者信息 
  12. MAINTAINER docker_user docker_user@email.com 
  13.   
  14. # 3、鏡像操作指令 
  15. RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list 
  16. RUN apt-get update && apt-get install -y nginx 
  17. RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf 
  18.   
  19. # 4、容器啟動執行指令 
  20. CMD /usr/sbin/nginx 

Dockerfile 分為四部分:基礎鏡像信息、維護者信息、鏡像操作指令、容器啟動執行指令。一開始必須要指明所基于的鏡像名稱,接下來一般會說明維護者信息;后面則是鏡像操作指令,例如 RUN 指令。每執行一條RUN 指令,鏡像添加新的一層,并提交;***是 CMD 指令,來指明運行容器時的操作命令。

構建鏡像

docker build 命令會根據 Dockerfile 文件及上下文構建新 Docker 鏡像。構建上下文是指 Dockerfile 所在的本地路徑或一個URL(Git倉庫地址)。構建上下文環境會被遞歸處理,所以構建所指定的路徑還包括了子目錄,而URL還包括了其中指定的子模塊。

將當前目錄做為構建上下文時,可以像下面這樣使用docker build命令構建鏡像:

  1. docker build . 
  2. Sending build context to Docker daemon  6.51 MB 
  3. ... 

說明:構建會在 Docker 后臺守護進程(daemon)中執行,而不是CLI中。構建前,構建進程會將全部內容(遞歸)發送到守護進程。大多情況下,應該將一個空目錄作為構建上下文環境,并將 Dockerfile 文件放在該目錄下。

在構建上下文中使用的 Dockerfile 文件,是一個構建指令文件。為了提高構建性能,可以通過.dockerignore文件排除上下文目錄下不需要的文件和目錄。

在 Docker 構建鏡像的***步,docker CLI 會先在上下文目錄中尋找.dockerignore文件,根據.dockerignore 文件排除上下文目錄中的部分文件和目錄,然后把剩下的文件和目錄傳遞給 Docker 服務。

Dockerfile 一般位于構建上下文的根目錄下,也可以通過-f指定該文件的位置:

  1. docker build -f /path/to/a/Dockerfile . 

構建時,還可以通過-t參數指定構建成鏡像的倉庫、標簽。

鏡像標簽

  1. docker build -t nginx/v3 . 

如果存在多個倉庫下,或使用多個鏡像標簽,就可以使用多個-t參數:

  1. docker build -t nginx/v3:1.0.2 -t nginx/v3:latest . 

在 Docker 守護進程執行 Dockerfile 中的指令前,首先會對 Dockerfile 進行語法檢查,有語法錯誤時會返回:

  1. docker build -t nginx/v3 . 
  2. Sending build context to Docker daemon 2.048 kB 
  3. Error response from daemon: Unknown instruction: RUNCMD 

緩存

Docker 守護進程會一條一條的執行 Dockerfile 中的指令,而且會在每一步提交并生成一個新鏡像,***會輸出最終鏡像的ID。生成完成后,Docker 守護進程會自動清理你發送的上下文。 Dockerfile文件中的每條指令會被獨立執行,并會創建一個新鏡像,RUN cd /tmp等命令不會對下條指令產生影響。 Docker 會重用已生成的中間鏡像,以加速docker build的構建速度。以下是一個使用了緩存鏡像的執行過程:

  1. $ docker build -t svendowideit/ambassador . 
  2. Sending build context to Docker daemon 15.36 kB 
  3. Step 1/4 : FROM alpine:3.2 
  4.  ---> 31f630c65071 
  5. Step 2/4 : MAINTAINER SvenDowideit@home.org.au 
  6.  ---> Using cache 
  7.  ---> 2a1c91448f5f 
  8. Step 3/4 : RUN apk update &&      apk add socat &&        rm -r /var/cache/ 
  9.  ---> Using cache 
  10.  ---> 21ed6e7fbb73 
  11. Step 4/4 : CMD env | grep _TCP= | (sed 's/.*_PORT_\([0-9]*\)_TCP=tcp:\/\/\(.*\):\(.*\)/socat -t 100000000 TCP4-LISTEN:\1,fork,reuseaddr TCP4:\2:\3 \&/' && echo wait) | sh 
  12.  ---> Using cache 
  13.  ---> 7ea8aef582cc 
  14. Successfully built 7ea8aef582cc 

構建緩存僅會使用本地父生成鏈上的鏡像,如果不想使用本地緩存的鏡像,也可以通過--cache-from指定緩存。指定后將不再使用本地生成的鏡像鏈,而是從鏡像倉庫中下載。

尋找緩存的邏輯

Docker 尋找緩存的邏輯其實就是樹型結構根據 Dockerfile 指令遍歷子節點的過程。下圖可以說明這個邏輯。

  1.    FROM base_image:version           Dockerfile: 
  2.            +----------+                FROM base_image:version 
  3.            |base image|                RUN cmd1  --> use cache because we found base image 
  4.            +-----X----+                RUN cmd11 --> use cache because we found cmd1 
  5.                 / \ 
  6.                /   \ 
  7.        RUN cmd1     RUN cmd2           Dockerfile: 
  8.        +------+     +------+           FROM base_image:version 
  9.        |image1|     |image2|           RUN cmd2  --> use cache because we found base image 
  10.        +---X--+     +------+           RUN cmd21 --> not use cache because there's no child node 
  11.           / \                                        running cmd21, so we build a new image here 
  12.          /   \ 
  13. RUN cmd11     RUN cmd12 
  14. +-------+     +-------+ 
  15. |image11|     |image12| 
  16. +-------+     +-------+ 

大部分指令可以根據上述邏輯去尋找緩存,除了 ADD 和 COPY 。這兩個指令會復制文件內容到鏡像內,除了指令相同以外,Docker 還會檢查每個文件內容校驗(不包括***修改時間和***訪問時間),如果校驗不一致,則不會使用緩存。

除了這兩個命令,Docker 并不會去檢查容器內的文件內容,比如 RUN apt-get -y update,每次執行時文件可能都不一樣,但是 Docker 認為命令一致,會繼續使用緩存。這樣一來,以后構建時都不會再重新運行apt-get -y update。

如果 Docker 沒有找到當前指令的緩存,則會構建一個新的鏡像,并且之后的所有指令都不會再去尋找緩存。

簡單示例

接下來用一個簡單的示例來感受一下 Dockerfile 是如何用來構建鏡像啟動容器。我們以定制 nginx 鏡像為例,在一個空白目錄中,建立一個文本文件,并命名為 Dockerfile:

  1. mkdir mynginx 
  2. cd mynginx 
  3. vi Dockerfile 

構建一個 Dockerfile 文件內容為:

  1. FROM nginx 
  2. RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html 
  3. vi Dockerfile 

這個 Dockerfile 很簡單,一共就兩行涉及到了兩條指令:FROM 和 RUN,FROM 表示獲取指定基礎鏡像,RUN 執行命令,在執行的過程中重寫了 nginx 的默認頁面信息,將信息替換為:Hello, Docker!。

在 Dockerfile 文件所在目錄執行:

  1. docker build -t nginx:v1 . 

命令***有一個. 表示當前目錄

構建完成之后,使用 docker images 命令查看所有鏡像,如果存在 REPOSITORY 為 nginx 和 TAG 是 v1 的信息,就表示構建成功。

  1. docker images 
  2. REPOSITORY                      TAG                 IMAGE ID            CREATED             SIZE 
  3. nginx                           v1                  8c92471de2cc        6 minutes ago       108.6 MB 

接下來使用 docker run 命令來啟動容器

  1. docker run  --name docker_nginx_v1   -d -p 80:80 nginx:v1 

這條命令會用 nginx 鏡像啟動一個容器,命名為docker_nginx_v1,并且映射了 80 端口,這樣我們可以用瀏覽器去訪問這個 nginx 服務器:http://192.168.0.54/,頁面返回信息:

這樣一個簡單使用 Dockerfile 構建鏡像,運行容器的示例就完成了!

修改容器內容

容器啟動后,需要對容器內的文件進行進一步的完善,可以使用docker exec -it xx bash命令再次進行修改,以上面的示例為基礎,修改 nginx 啟動頁面內容:

  1. docker exec -it docker_nginx_v1   bash 
  2. root@3729b97e8226:/# echo '<h1>Hello, Docker neo!</h1>' > /usr/share/nginx/html/index.html 
  3. root@3729b97e8226:/# exit 
  4. exit 

以交互式終端方式進入 docker_nginx_v1 容器,并執行了 bash 命令,也就是獲得一個可操作的 Shell。然后,我們用<h1>Hello, Docker neo!</h1>覆蓋了 /usr/share/nginx/html/index.html 的內容。

再次刷新瀏覽器,會發現內容被改變。

修改了容器的文件,也就是改動了容器的存儲層,可以通過 docker diff 命令看到具體的改動。

  1. docker diff docker_nginx_v1  
  2. ...  

這樣 Dockerfile 使用方式就為大家介紹完了,下期為大家介紹 Dockerfile 命令的詳細使用。

【本文為51CTO專欄作者“純潔的微笑”的原創稿件,轉載請通過微信公眾號聯系作者獲取授權】

戳這里,看該作者更多好文

 

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2022-10-14 07:07:46

架構

2015-07-21 12:43:58

Dockerfile命令實例

2022-08-04 18:30:59

DockerfileDocker 鏡像Linux

2021-09-07 09:53:45

鴻蒙HarmonyOS應用

2015-01-09 11:29:45

DockerDockerFile創建鏡像

2014-11-18 10:37:15

dockerlinux技巧

2018-04-24 15:15:51

Dockerfile命令Docker

2022-05-25 16:48:25

數據卷Docker

2023-09-12 08:03:49

容器鏡像

2022-11-01 07:23:55

Dockernetcore程序

2022-03-10 08:24:17

Docker容器SaaS

2021-05-13 23:54:12

DockerDockerfile鏡像

2023-08-04 08:20:56

DockerfileDocker工具

2024-03-06 18:11:06

Docker鏡像技術

2011-03-21 11:01:54

2010-03-05 16:44:52

Linux終端命令

2009-09-25 13:55:05

Hibernate使用

2021-01-29 18:09:05

DockerCgroupsLinux

2022-10-27 07:09:58

容器通信

2014-06-23 09:11:01

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 福利视频一区二区三区 | 日本在线精品视频 | 久久99精品国产 | 激情视频中文字幕 | 日韩av在线一区 | 狠狠操操| 成人一区二区视频 | 国产精品免费在线 | 欧洲亚洲视频 | 国产乱码精品一区二区三区五月婷 | 欧美精品一区在线发布 | 日韩一区二区在线视频 | 在线超碰 | 国产精品日韩高清伦字幕搜索 | 欧美一级片在线播放 | 国产黄色网址在线观看 | 日韩免费看片 | 亚洲精品一区二三区不卡 | 一区二区视频在线 | 毛片网站在线观看视频 | 亚洲91av| 日日干天天操 | 国产精品久久久久久久久久久久久 | 成人国产在线视频 | 91视频.| 国产99热精品 | 韩日一区 | 国产精品永久免费 | 日韩毛片| 国产成人av在线播放 | 欧美一区二区三区四区五区无卡码 | 亚洲欧美综合精品久久成人 | 91精品国产91久久久久久吃药 | 国产乱码精品一区二区三区忘忧草 | 羞羞视频网页 | 国产欧美日韩综合精品一 | 国产精品久久国产精品 | a亚洲精品 | 日韩在线一区二区 | 久久精品播放 | 亚洲综合字幕 |