ad如何镜像器件_使用 Dockerfile 制作镜像
前面幾篇文章已經給大家介紹了 Docker 的基本概念,相信大家也會使用 Docker 運行自己想要的容器了。但是只有學會制作鏡像,才能將 Docker 應用到我們的項目中去。下面我們就來學習如何使用 Dockerfile 來制作鏡像。
Dockerfile 是一個文本文件,里面的內容是一條條的指令,每一條指令將會構建一層,因此每條指令的內容就是在描述該層應當如何創建。
編寫 Dockerfile
接下來以 nginx 鏡像為例,定制一個簡單的鏡像,首先創建一個目錄 mynginx,進入目錄再創建一個文本文件,名字為 Dockerfile。
$ mkdir mynginx $ cd mynginx $ touch Dockerfile把以下內容寫到 Dockerfile 中
FROM nginx RUN echo '<h1>Hello, Docker!<h1>' > /usr/share/nginx/html/index.html其中 FROM 用來指定基礎鏡像,上面的例子是以 nginx 為基礎鏡像。
RUN 命令則表示執行一個 shell 命令,將文本寫進 index.html。
構建命令詳解
編寫完 Dockerfile 之后就可以用來構建鏡像。構建 docker 鏡像的命令如下:
$ docker build [OPTIONS] PATH | URL | -選項的說明如下:
--build-arg=[] 設置鏡像創建時的變量--cpu-shares 設置 CPU 使用權重--cpu-period 限制 CPU CFS 周期--cpu-quota 限制 CPU CFS 配額--cpuset-cpus 指定使用的 CPU--cpuset-mems 指定使用的內存 id--disable-content-trust 忽略檢驗,默認開啟-f 指定要使用的 Dockerfile 路徑--force-rm 設置鏡像過程中刪除中間容器--isolation 使用容器隔離技術--label=[] 設置鏡像使用的元數據-m 設置內存最大最--memory-swap 設置 Swap 的最大值為內存 + swap,'-1' 表示不限 swap--no-cache 創建鏡像的過程中不適用緩存--pull 嘗試更新鏡像的新版本--quiet,-q 安靜模式,成功后只輸出鏡像 ID--rm 設置鏡像成功后刪除中間容器--shm-size 設置 /dev/shm 的大小,默認值是 64M--ulimit Ulimit 配置--tag,-t 鏡像的名字及標簽,通常 name:tag 或者 name 格式,可以在一次構建中為一個鏡像設置多個標簽--network 默認 default。在構建期間設置 RUN 指令的網絡模式下面舉幾個例子,說明選項的用法
- 使用當前目錄的 Dockerfile 創建鏡像,標簽為 fedevelop/example:v1
- 使用 URL http://github.com/ad-feiben/qc-remind 的 Dockerfile 創建鏡像
- 通過 -f Dockerfile 文件的位置
回到 mynginx 目錄中執行下面的命令
$ docker build -t nginx:v2 . Sending build context to Docker daemon 2.048kB Step 1/2 : FROM nginx---> f949e7d76d63 Step 2/2 : RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html---> Running in 88dc64292fa7 Removing intermediate container 88dc64292fa7---> 5d1e253d361c Successfully built 5d1e253d361c Successfully tagged nginx:v2注意不要漏了最后的 .,. 代表將當前目錄設置為鏡像構建上下文(Context)。
例如 Dockerfile 的內容如下:
COPY ./requirements.txt /app/意思為復制上下文目錄下的 requirements.txt,與 Dockerfile、執行 docker build 所在的目錄無關。
構建完成后,我們可以通過 Docker images 查看我們構建的鏡像
$ docker images docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx v2 5d1e253d361c About a minute ago 126MB nginx latest f949e7d76d63 4 weeks ago 126MB接下來用我們定制的鏡像來啟動一個容器看看,其中 5d1e253d361c 替換為你的鏡像 id
$ docker run -it -p 80:80 5d1e253d361c瀏覽器打開 http://localhost/ 可以看到頁面顯示的是 Hello, Docker!,說明我們的 Dockerfile 中的命令生效了。
指令詳解
FROM 指定基礎鏡像
FROM 是用來指定基礎鏡像,這個命令是 Dockerfile 中必備的指令,并且必須是第一條指令。
假如不需要基礎鏡像,可以使用空白鏡像 scratch 作為基礎鏡像。scratch 這個鏡像是虛擬的,實際并不存在。
FROM scratch ...RUN 執行命令
從上面的例子中可以看到 RUN 可以執行一個 shell 命令,除了此之外還有另一種格式。
exec 格式:RUN ["可執行文件", "參數"]。
我們在編寫 Dockerfile 的時候需要盡可能將指令鏈接起來,因為 Dockerfile 中的每一條指令都會建立一層,如果建立太多層,不僅會使得鏡像非常臃腫,也會增加構建時間。
# 錯誤示范 FROM debian:stretchRUN apt-get update RUN apt-get install -y gcc libc6-dev make wget RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" RUN mkdir -p /usr/src/redis RUN tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 RUN make -C /usr/src/redis RUN make -C /usr/src/redis install正確的寫法如下,使用 && 將多條命令合并為一條,并且刪除不必要的文件、清理 apt 緩存等,盡量保持容器干凈。如果沒有做清理工作的話,這些冗余的文件等將會帶到下一層,并且會一直跟隨鏡像。
FROM debian:stretchRUN buildDeps='gcc libc6-dev make wget' && apt-get update && apt-get install -y $buildDeps && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" && mkdir -p /usr/src/redis && tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 && make -C /usr/src/redis && make -C /usr/src/redis install && rm -rf /var/lib/apt/lists/* && rm redis.tar.gz && rm -r /usr/src/redis && apt-get purge -y --auto-remove $buildDepsWORKDIR 指定工作目錄
WORKDIR 的格式為 WORKDIR <工作目錄路徑>
當使用 WORKDIR 指定工作路徑后,以后的每一層的當前目錄都會被改為工作目錄,如果目錄不存在,WORKDIR 會幫助我們創建目錄。
如果需要改變以后各層的工作目錄的位置,只需要再使用 WORKDIR 指令即可。
COPY 復制文件
COPY 的格式為 COPY [--chown=<user>:<group>] <源路徑>... <目標路徑>
源路徑可以是多個,也可以使用通配符,例如下面這樣:
COPY hom* /mydir/ COPY hom?.txt /mydir/目標路徑可以是容器內的絕對路徑,也可以相對工作目錄的相對路徑。目標路徑不需要我們創建,如果目標路徑不存在會在復制文件前先行創建缺失的目錄。
使用 COPY 復制文件時,會保留文件的元數據,比如讀寫權限,文件變更的時間等。如果需要修改文件的所屬用戶及所屬組,可以通過添加 --chown=<user>:<group> 選項進行修改。
CMD 容器啟動命令
shell 格式為 CMD <命令>
exec 格式為 CND ["可執行文件", "參數1", "參數2"]
使用 shell 格式的話,實際的命令會被包裝成 sh -c 的形式進行執行,比如:
CMD echo $HOME 在實際執行中,將會變成 CMD [ "sh", "-c", "echo $HOME" ]
所以在使用 CMD 的時候一般推薦使用 exec 的格式,需要注意的是 exec 的格式會被解析成 JSON 數組,所以只能夠使用雙引號,而不能使用單引號。
Dockerfile 的指令不止這么幾個,感興趣的小伙伴可以到 https://yeasy.gitbooks.io/docker_practice/image/dockerfile/ 自行查看。
示例
下面將通過我的 Python 項目來演示,怎么編寫一個 Dockerfile,文件地址在 https://raw.githubusercontent.com/AD-feiben/qc-remind/master/Dockerfile
文件的內容如下:
# 指定基礎鏡像 FROM python:3.7.4# 設置鏡像作者 MAINTAINER feiben <feiben.dev@gmail.com># 設置工作目錄 WORKDIR /app# 復制上下文的文件到容器的 app 目錄下 # 不需要復制到鏡像的文件可以使用 .dockerignore 進行忽略 COPY . /app# 執行下面命令,同步時區,安裝依賴 RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone && pip install -r requirements.txt# 啟動容器 CMD ["python", "main.py", "--log-file-prefix", "qc-remind.log"]當我們的代碼編寫完成后,就可以執行 docker build -t <name>:<tag> . 將代碼打包成一個 Docker 鏡像,再 push 到鏡像倉庫中。
部署
按照傳統的方式部署項目,通常需要在服務器安裝一套運行環境,而且常常會遇到環境不一致導致本地開發沒問題,一到線上部署就出現各種問題的情況。并且一旦服務器到期,遷移的工作量也是十分巨大。
而使用 Docker,我們只需要再服務器安裝一個 Docker 環境即可,部署項目只需要執行 docker run xxx。不僅減少了安裝環境的時間,也保證了環境的一致性。
如果你喜歡我的文章,希望可以關注一下我的公眾號【前端develop】
前端develop總結
以上是生活随笔為你收集整理的ad如何镜像器件_使用 Dockerfile 制作镜像的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gm怎么刷东西 rust_Rust语言:
- 下一篇: python对初学者的看法_python