国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Flux7 Docker 系列教程(三):使用 Dockerfile 實(shí)現(xiàn)自動化

wemall / 3262人閱讀

摘要:更多的內(nèi)容可以參考深入理解一命令參考的用法咧實(shí)例的寫法已經(jīng)講述完畢,這兒有一個示例的指定系統(tǒng)我抄的他的創(chuàng)建私鑰修復(fù)登錄,否則登陸后的用戶會被秒退。

  

本系列教程翻譯自 Flux7 Docker Tutorial Series,系列共有九篇,本文譯自第三篇 Part 3: Automation is the Word Using DockerFile。
該系列所有文章將參考其他學(xué)習(xí)資料翻譯,也會加入自己的學(xué)習(xí)作為部分注解。如有錯誤,歡迎指正。

上篇文章介紹的是 15 個 Docker 基礎(chǔ)命令,在手動創(chuàng)建鏡像的時候會有用到,例如 pull,commit,push,但是當(dāng)需要執(zhí)行的命令很多時,是不太可能逐一執(zhí)行 Docker 命令進(jìn)行鏡像初始化的,于是就此產(chǎn)生了 Dockerfile。

Docker 提供的 Dockerfile 是一個類似 Makefile 的工具,主要用來自動化構(gòu)建鏡像。既然能自動化創(chuàng)建鏡像,那么我們何必去手動創(chuàng)建鏡像呢。本文用來講解 Dockerfile 的用法、語法,并且提供一個實(shí)例用以更深入地了解 Dockerfile。

注:原文 不太直觀,而且很多細(xì)節(jié)沒有講清楚,因此只取原文中有用的部分,參考其他文章總結(jié)出本文。

貼一個 Dockerfile 的實(shí)例然后開始正文:

# 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 ,例如 FROM ubuntu

所有的 Dockerfile 都用該以 FROM 開頭,FROM 命令指明 Dockerfile 所創(chuàng)建的鏡像文件以什么鏡像為基礎(chǔ),FROM 以后的所有指令都會在 FROM 的基礎(chǔ)上進(jìn)行創(chuàng)建鏡像;可以在同一個 Dockerfile 中多次使用 FROM 命令用于創(chuàng)建多個鏡像。

MAINTAINER 命令

MAINTAINER 用于指定鏡像創(chuàng)建者和聯(lián)系方式。

例如

MAINTAINER Victor Coisne victor.coisne@dotcloud.com
RUN 命令

RUN 用于容器內(nèi)部執(zhí)行命令。每個 RUN 命令相當(dāng)于在原有的鏡像基礎(chǔ)上添加了一個改動層,原有的鏡像不會有變化。

ADD 命令

ADD 用于從將 文件復(fù)制到 文件: 是相對被構(gòu)建的源目錄的相對路徑,可以是文件或目錄的路徑,也可以是一個遠(yuǎn)程的文件 url, 是容器中的絕對路徑。

CMD 命令

CMD 命令有三種格式:

CMD ["executable","param1","param2"]:推薦使用的 exec 形式。

CMD ["param1","param2"]:無可執(zhí)行程序形式

CMD command param1 param2:shell 形式。

CMD 命令用于啟動容器時默認(rèn)執(zhí)行的命令,CMD 命令可以包含可執(zhí)行文件,也可以不包含可執(zhí)行文件:不包含可執(zhí)行文件的情況下就要用 ENTRYPOINT 指定一個,然后 CMD 命令的參數(shù)就會作為ENTRYPOINT的參數(shù)。

  

一個 Dockerfile 中只能有一個CMD,如果有多個,則最后一個生效。
CMD 的 shell 形式默認(rèn)調(diào)用 /bin/sh -c 執(zhí)行命令。
CMD命令會被 Docker 命令行傳入的參數(shù)覆蓋:docker run busybox /bin/echo Hello Docker 會把 CMD 里的命令覆蓋。

ENTRYPOINT 命令

ENTRYPOINT 命令的字面意思是進(jìn)入點(diǎn),而功能也恰如其意:他可以讓你的容器表現(xiàn)得像一個可執(zhí)行程序一樣。

ENTRYPOINT 命令也有兩種格式:

ENTRYPOINT ["executable", "param1", "param2"] :推薦使用的 exec 形式

ENTRYPOINT command param1 param2 :shell 形式

  

一個 Dockerfile 中只能有一個 ENTRYPOINT,如果有多個,則最后一個生效。

關(guān)于 CMDENTRYPOINT 的聯(lián)系請看下面的例子
僅僅使用 ENTRYPOINT

FROM ubuntu
ENTRYPOINT ls -l

執(zhí)行 docker run 306cd7e8408b /etc/fstabdocker run 306cd7e8408b 結(jié)果并不會有什么差別:

命令 # 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 作為容器的入口,使用 CMDENTRYPOINT 增加默認(rèn)選項

FROM ubuntu
CMD ["-l"]
ENTRYPOINT ["ls"]

然后執(zhí)行這個容器:
不加參數(shù)便會默認(rèn)有 -l參數(shù):

命令 # 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 參數(shù)便會覆蓋原有的 -l 參數(shù):

命令 # docker run 89dc7e6d0ac1 /etc/fstab
/etc/fstab
EXPOSE 命令

EXPOSE [...] 命令用來指定對外開放的端口。
例如 EXPOSE 80 3306,開放 803306 端口。

WORKDIR命令

WORKDIR /path/to/work/dir 配合 RUNCMDENTRYPOINT 命令設(shè)置當(dāng)前工作路徑。
可以設(shè)置多次,如果是相對路徑,則相對前一個 WORKDIR 命令。默認(rèn)路徑為/

例如:

FROM ubuntu
WORKDIR /etc
WORKDIR ..
WORKDIR usr
WORKDIR lib
ENTRYPOINT pwd

docker run ID 得到的結(jié)果為:/usr/lib

USER命令

USER 為容器內(nèi)指定 CMD RUN ENTRYPOINT 命令運(yùn)行時的用戶名或UID。

VLOUME 命令

VOLUME ["/data"] 允許容器訪問容器的目錄、允許容器之間互相訪問目錄。
VOLUME 僅僅是允許將某一個目錄暴露在外面,更多的操作還需要依賴 Docker 命令實(shí)現(xiàn)。

更多的內(nèi)容可以參考 深入理解 Docker Volume(一)

ENV 命令

參考 export 的用法咧:
ENV LC_ALL en_US.UTF-8

實(shí)例

Dockerfile 的寫法已經(jīng)講述完畢,這兒有一個示例的 Dockerfile:

#Dockerfile
FROM centos6-base
#指定centos6系統(tǒng)
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
#創(chuàng)建私鑰
RUN sed "s@sessions*requireds*pam_loginuid.so@session optional pam_loginuid.so@g" -i /etc/pam.d/sshd
#修復(fù)SSH登錄,否則登陸后的用戶會被秒退。
RUN mkdir -p /root/.ssh && chown root.root /root && chmod 700 /root/.ssh
#創(chuàng)建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
#系統(tǒng)環(huán)境變量
CMD ["/usr/sbin/sshd", "-D"]
#啟動sshd
#End
最佳實(shí)踐

所有應(yīng)用都會有個最佳的方式,Dockerfile 也不例外,下面是我們總結(jié)出的最佳實(shí)現(xiàn)方式:

把維護(hù)者和更新系統(tǒng)的命令依次寫在最上方

使用標(biāo)簽管理 Dockerfile

避免映射公共端口

使用類似 array 形式的 CMDENTRYPOINT

  

注:映射端口并不屬于 Dockerfile 的工作范圍。

下篇文章將會介紹 Docker Registry 和 Workflows。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/26394.html

相關(guān)文章

  • Flux7 Docker 系列教程):使用 Dockerfile 實(shí)現(xiàn)動化

    摘要:更多的內(nèi)容可以參考深入理解一命令參考的用法咧實(shí)例的寫法已經(jīng)講述完畢,這兒有一個示例的指定系統(tǒng)我抄的他的創(chuàng)建私鑰修復(fù)登錄,否則登陸后的用戶會被秒退。 本系列教程翻譯自 Flux7 Docker Tutorial Series,系列共有九篇,本文譯自第三篇 Part 3: Automation is the Word Using DockerFile。 該系列所有文章將參考其他學(xué)...

    CoffeX 評論0 收藏0
  • Flux7 Docker 系列教程(九):用于鏡像操作的 10 個 Docker Remote AP

    摘要:本系列教程翻譯自,系列共有九篇,本文譯自原教程最后一篇。本文介紹十個專門用于操作鏡像的。用法獲取名叫的鏡像。操作中帶有的情況下,是需要非常小心的。或者不傳入,而是用參數(shù)指定一個,這種情況下不要求格式。 本系列教程翻譯自 Flux7 Docker Tutorial Series,系列共有九篇,本文譯自原教程最后一篇 Part 9: 10 Docker Remote API Comm...

    inapt 評論0 收藏0
  • Flux7 Docker 系列教程(九):用于鏡像操作的 10 個 Docker Remote AP

    摘要:本系列教程翻譯自,系列共有九篇,本文譯自原教程最后一篇。本文介紹十個專門用于操作鏡像的。用法獲取名叫的鏡像。操作中帶有的情況下,是需要非常小心的。或者不傳入,而是用參數(shù)指定一個,這種情況下不要求格式。 本系列教程翻譯自 Flux7 Docker Tutorial Series,系列共有九篇,本文譯自原教程最后一篇 Part 9: 10 Docker Remote API Comm...

    SmallBoyO 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<