摘要:更多的內容可以參考深入理解一命令參考的用法咧實例的寫法已經講述完畢,這兒有一個示例的指定系統我抄的他的創建私鑰修復登錄,否則登陸后的用戶會被秒退。
本系列教程翻譯自 Flux7 Docker Tutorial Series,系列共有九篇,本文譯自第三篇 Part 3: Automation is the Word Using DockerFile。
該系列所有文章將參考其他學習資料翻譯,也會加入自己的學習作為部分注解。如有錯誤,歡迎指正。
上篇文章介紹的是 15 個 Docker 基礎命令,在手動創建鏡像的時候會有用到,例如 pull,commit,push,但是當需要執行的命令很多時,是不太可能逐一執行 Docker 命令進行鏡像初始化的,于是就此產生了 Dockerfile。
Docker 提供的 Dockerfile 是一個類似 Makefile 的工具,主要用來自動化構建鏡像。既然能自動化創建鏡像,那么我們何必去手動創建鏡像呢。本文用來講解 Dockerfile 的用法、語法,并且提供一個實例用以更深入地了解 Dockerfile。
注:原文 不太直觀,而且很多細節沒有講清楚,因此只取原文中有用的部分,參考其他文章總結出本文。
貼一個 Dockerfile 的實例然后開始正文:
# Memcached # # VERSION 2.2 # use the ubuntu base image provided by dotCloud FROM ubuntu MAINTAINER Victor Coisne victor.coisne@dotcloud.com # make sure the package repository is up to date RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list RUN apt-get update # install memcached RUN apt-get install -y memcached # Launch memcached when launching the container ENTRYPOINT ["memcached"] # run memcached as the daemon user USER daemon # expose memcached port EXPOSE 11211格式
Dockerfile 中所有的命令都是以下格式:INSTRUCTION argument
指令(INSTRUCTION)不分大小寫,但是推薦大寫。
FROM 命令FROM
所有的 Dockerfile 都用該以 FROM 開頭,FROM 命令指明 Dockerfile 所創建的鏡像文件以什么鏡像為基礎,FROM 以后的所有指令都會在 FROM 的基礎上進行創建鏡像;可以在同一個 Dockerfile 中多次使用 FROM 命令用于創建多個鏡像。
MAINTAINER 命令MAINTAINER
例如
MAINTAINER Victor Coisne victor.coisne@dotcloud.comRUN 命令
RUN
ADD
CMD 命令有三種格式:
CMD ["executable","param1","param2"]:推薦使用的 exec 形式。
CMD ["param1","param2"]:無可執行程序形式
CMD command param1 param2:shell 形式。
CMD 命令用于啟動容器時默認執行的命令,CMD 命令可以包含可執行文件,也可以不包含可執行文件:不包含可執行文件的情況下就要用 ENTRYPOINT 指定一個,然后 CMD 命令的參數就會作為ENTRYPOINT的參數。
ENTRYPOINT 命令一個 Dockerfile 中只能有一個CMD,如果有多個,則最后一個生效。
CMD 的 shell 形式默認調用 /bin/sh -c 執行命令。
CMD命令會被 Docker 命令行傳入的參數覆蓋:docker run busybox /bin/echo Hello Docker 會把 CMD 里的命令覆蓋。
ENTRYPOINT 命令的字面意思是進入點,而功能也恰如其意:他可以讓你的容器表現得像一個可執行程序一樣。
ENTRYPOINT 命令也有兩種格式:
ENTRYPOINT ["executable", "param1", "param2"] :推薦使用的 exec 形式
ENTRYPOINT command param1 param2 :shell 形式
一個 Dockerfile 中只能有一個 ENTRYPOINT,如果有多個,則最后一個生效。
關于 CMD 和 ENTRYPOINT 的聯系請看下面的例子
僅僅使用 ENTRYPOINT:
FROM ubuntu ENTRYPOINT ls -l
執行 docker run 306cd7e8408b /etc/fstab 和 docker run 306cd7e8408b 結果并不會有什么差別:
命令 # docker run 306cd7e8408b /etc/fstab total 64 drwxr-xr-x 2 root root 4096 Mar 20 05:22 bin drwxr-xr-x 2 root root 4096 Apr 10 2014 boot drwxr-xr-x 5 root root 360 Apr 24 02:52 dev drwxr-xr-x 64 root root 4096 Apr 24 02:52 etc drwxr-xr-x 2 root root 4096 Apr 10 2014 home ……
但是我們通常使用 ENTRYPOINT 作為容器的入口,使用 CMD 給 ENTRYPOINT 增加默認選項:
FROM ubuntu CMD ["-l"] ENTRYPOINT ["ls"]
然后執行這個容器:
不加參數便會默認有 -l參數:
命令 # docker run 89dc7e6d0ac1 total 64 drwxr-xr-x 2 root root 4096 Mar 20 05:22 bin drwxr-xr-x 2 root root 4096 Apr 10 2014 boot drwxr-xr-x 5 root root 360 Apr 24 02:47 dev drwxr-xr-x 64 root root 4096 Apr 24 02:47 etc drwxr-xr-x 2 root root 4096 Apr 10 2014 home drwxr-xr-x 12 root root 4096 Mar 20 05:21 lib drwxr-xr-x 2 root root 4096 Mar 20 05:20 lib64 drwxr-xr-x 2 root root 4096 Mar 20 05:19 media drwxr-xr-x 2 root root 4096 Apr 10 2014 mnt drwxr-xr-x 2 root root 4096 Mar 20 05:19 opt dr-xr-xr-x 386 root root 0 Apr 24 02:47 proc drwx------ 2 root root 4096 Mar 20 05:22 root drwxr-xr-x 7 root root 4096 Mar 20 05:21 run drwxr-xr-x 2 root root 4096 Apr 21 22:18 sbin drwxr-xr-x 2 root root 4096 Mar 20 05:19 srv dr-xr-xr-x 13 root root 0 Apr 24 02:47 sys drwxrwxrwt 2 root root 4096 Mar 20 05:22 tmp drwxr-xr-x 11 root root 4096 Apr 21 22:18 usr drwxr-xr-x 12 root root 4096 Apr 21 22:18 var
加了 /etc/fstab 參數便會覆蓋原有的 -l 參數:
命令 # docker run 89dc7e6d0ac1 /etc/fstab /etc/fstabEXPOSE 命令
EXPOSE
例如 EXPOSE 80 3306,開放 80 和 3306 端口。
WORKDIR /path/to/work/dir 配合 RUN,CMD,ENTRYPOINT 命令設置當前工作路徑。
可以設置多次,如果是相對路徑,則相對前一個 WORKDIR 命令。默認路徑為/。
例如:
FROM ubuntu WORKDIR /etc WORKDIR .. WORKDIR usr WORKDIR lib ENTRYPOINT pwd
docker run ID 得到的結果為:/usr/lib
USER命令USER
VOLUME ["/data"] 允許容器訪問容器的目錄、允許容器之間互相訪問目錄。
VOLUME 僅僅是允許將某一個目錄暴露在外面,更多的操作還需要依賴 Docker 命令實現。
更多的內容可以參考 深入理解 Docker Volume(一)
ENV 命令參考 export 的用法咧:
ENV LC_ALL en_US.UTF-8
Dockerfile 的寫法已經講述完畢,這兒有一個示例的 Dockerfile:
#Dockerfile FROM centos6-base #指定centos6系統 MAINTAINER zhou_mfk最佳實踐#我抄的他的 Dockerfile RUN ssh-keygen -q -N "" -t dsa -f /etc/ssh/ssh_host_dsa_key RUN ssh-keygen -q -N "" -t rsa -f /etc/ssh/ssh_host_rsa_key #創建私鑰 RUN sed "s@sessions*requireds*pam_loginuid.so@session optional pam_loginuid.so@g" -i /etc/pam.d/sshd #修復SSH登錄,否則登陸后的用戶會被秒退。 RUN mkdir -p /root/.ssh && chown root.root /root && chmod 700 /root/.ssh #創建root用戶的ssh文件夾 EXPOSE 22 #開放端口 RUN echo "root:redhat" | chpasswd #root用戶改密碼為redhat RUN yum install -y yum-priorities && rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm && rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6 RUN yum install tar gzip gcc vim wget screen -y #安裝epel和安裝一些軟件 ENV LANG en_US.UTF-8 ENV LC_ALL en_US.UTF-8 #系統環境變量 CMD ["/usr/sbin/sshd", "-D"] #啟動sshd #End
所有應用都會有個最佳的方式,Dockerfile 也不例外,下面是我們總結出的最佳實現方式:
把維護者和更新系統的命令依次寫在最上方
使用標簽管理 Dockerfile
避免映射公共端口
使用類似 array 形式的 CMD 和 ENTRYPOINT
注:映射端口并不屬于 Dockerfile 的工作范圍。
下篇文章將會介紹 Docker Registry 和 Workflows。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/7916.html
摘要:更多的內容可以參考深入理解一命令參考的用法咧實例的寫法已經講述完畢,這兒有一個示例的指定系統我抄的他的創建私鑰修復登錄,否則登陸后的用戶會被秒退。 本系列教程翻譯自 Flux7 Docker Tutorial Series,系列共有九篇,本文譯自第三篇 Part 3: Automation is the Word Using DockerFile。 該系列所有文章將參考其他學...
摘要:本系列教程翻譯自,系列共有九篇,本文譯自原教程最后一篇。本文介紹十個專門用于操作鏡像的。用法獲取名叫的鏡像。操作中帶有的情況下,是需要非常小心的。或者不傳入,而是用參數指定一個,這種情況下不要求格式。 本系列教程翻譯自 Flux7 Docker Tutorial Series,系列共有九篇,本文譯自原教程最后一篇 Part 9: 10 Docker Remote API Comm...
摘要:本系列教程翻譯自,系列共有九篇,本文譯自原教程最后一篇。本文介紹十個專門用于操作鏡像的。用法獲取名叫的鏡像。操作中帶有的情況下,是需要非常小心的。或者不傳入,而是用參數指定一個,這種情況下不要求格式。 本系列教程翻譯自 Flux7 Docker Tutorial Series,系列共有九篇,本文譯自原教程最后一篇 Part 9: 10 Docker Remote API Comm...
閱讀 1884·2021-11-17 09:33
閱讀 6470·2021-10-12 10:20
閱讀 2299·2021-09-22 15:50
閱讀 1783·2021-09-22 15:10
閱讀 615·2021-09-10 10:51
閱讀 618·2021-09-10 10:50
閱讀 3021·2021-08-11 11:19
閱讀 1776·2019-08-30 15:55