1. 程式人生 > >dockerfile介紹與實例演示

dockerfile介紹與實例演示

dockerfile介紹與實例演示

1 Dockerfile(總結)

首先來看下什麽是dockerfile:Dockfile是一種被Docker程序解釋的腳本,Dockerfile由一條一條的指令組成,每條指令對應Linux下面的一條命令。Docker程序將這些Dockerfile指令翻譯真正的Linux命令。Dockerfile有自己書寫格式和支持的命令,Docker程序解決這些命令間的依賴關系,類似於Makefile。Docker程序將讀取Dockerfile,根據指令生成定制的image。相比image這種黑盒子,Dockerfile這種顯而易見的腳本更容易被使用者接受,它明確的表明image是怎麽產生的。有了Dockerfile,當我們需要定制自己額外的需求時,只需在Dockerfile上添加或者修改指令,重新生成image即可,省去了敲命令的麻煩。

- 先來看下dockerfile怎麽創建鏡像?先來介紹它的語法吧。

- FROM //指定基於哪個基礎鏡像

> FROM指定一個基礎鏡像, 一般情況下一個可用的 Dockerfile一定是 FROM為第一個指令。至於image則可以是任何合理存在的image鏡像。

FROM 一定是首個非註釋指令 Dockerfile.

FROM 可以在一個 Dockerfile中出現多次,以便於創建混合的images。

如果沒有指定 tag,latest將會被指定為要使用的基礎鏡像版本。

1. 格式 FROM <image> 或者 FROM <image>:<tag> 比如

FROM centos

FROM centos:latest

- MAINTAINER //指定鏡像制作者的信息

格式 MAINTAIN <name>,比如

MAINTAINER chy [email protected]

- RUN //鏡像操作指令

> RUN命令將在當前image中執行任意合法命令並提交執行結果。命令執行提交後,就會自動執行Dockerfile中的下一個指令。

層級 RUN 指令和生成提交是符合Docker核心理念的做法。它允許像版本控制那樣,在任意一個點,對image 鏡像進行定制化構建。

RUN 指令緩存不會在下個命令執行時自動失效。比如 RUN apt-get dist-upgrade -y 的緩存就可能被用於下一個指令. --no-cache 標誌可以被用於強制取消緩存使用。

1. 格式為 RUN <command> 或者 RUN [“executable”, “param1”, “param2”],比如

RUN yum install httpd

RUN ["/bin/bash", "-c", "echo hello"]

- CMD //有三種格式

> Dockerfile.中只能有一個CMD指令。 如果你指定了多個,那麽最後個CMD指令是生效的。

CMD指令的主要作用是提供默認的執行容器。這些默認值可以包括可執行文件,也可以省略可執行文件

當你使用shell或exec格式時,CMD會自動執行這個命令。

1. CMD ["executable", "param1", "param2"]

2. CMD command param1 param2

3. CMD ["param1", "param2"]

4. RUN和CMD看起來挺像,但是CMD用來指定容器啟動時用到的命令,只能有一條。比如

CMD ["/bin/bash", "/usr/local/nginx/sbin/nginx", "-c","/usr/local/nginx/conf/nginx.conf"]

- EXPOSE //指令指定在docker允許時指定的端口進行轉發。

格式為 EXPOSE <port> [<port>...] , 比如

EXPOSE 22 80 8443

> 這個用來指定要映射出去的端口,比如容器內部我們啟動了sshd和nginx,所以我們需要把22和80端口暴漏出去。這個需要配合-P(大寫)來工作,也就是說在啟動容器時,需要加上-P,讓它自動分配。如果想指定具體的端口,也可以使用-p(小寫)來指定。

- ENV

> ENV 指令可以用於為docker容器設置環境變量

ENV設置的環境變量,可以使用 docker inspect命令來查看。同時還可以使用docker run --env <key>=<value>來修改環境變量

1. 格式 ENV <key> <value>, 比如

ENV PATH /usr/local/mysql/bin:$PATH

它主要是為後續的RUN指令提供一個環境變量,我們也可以定義一些自定義的變量如下:

ENV MYSQL_version 5.6

- ADD //ADD 將文件從路徑 <src> 復制添加到容器內部路徑 <dest>。

><src> 必須是相對於源文件夾的一個文件或目錄,也可以是一個遠程的url。<dest> 是目標容器中的絕對路徑。

所有的新文件和文件夾都會創建UID 和 GID。事實上如果 <src> 是一個遠程文件URL,那麽目標文件的權限將會是600。

1. 格式 add <src> <dest> 將本地的一個文件或目錄拷貝到容器的某個目錄裏。 其中src為Dockerfile所在目錄的相對路徑,它也可以是一個url。比如

ADD <conf/vhosts> </usr/local/nginx/conf>

- COPY //COPY 將文件從路徑 <src> 復制添加到容器內部路徑 <dest>

1. 格式同add (使用方法和add一樣,不同的是,它不支持url

- ENTRYPOINT //是指定 Docker image 運行成 instance (也就是 Docker container) 時,要執行的命令或者文件。

註意:

1. 容器啟動時要執行的命令,它和CMD很像,也是只有一條生效,如果寫多個只有最後一條有效。和CMD不同是:

2. CMD 是可以被 docker run 指令覆蓋的,而ENTRYPOINT不能覆蓋。比如,容器名字為aming

我們在Dockerfile中指定如下CMD:

CMD ["/bin/echo","test"]

啟動容器的命令是 docker run aming 這樣會輸出 test

假如啟動容器的命令是 docker run -it chy /bin/bash 什麽都不會輸出

ENTRYPOINT不會被覆蓋,而且會比CMD或者docker run指定的命令要靠前執行ENTRYPOINT ["echo", "test"]

docker run -it aming 123

則會輸出 test 123 ,這相當於要執行命令 echo test 123

- VOLUME //創建一個可以從本地主機或其他容器掛載的掛載點,一般用來存放數據庫和需要保持的數據等。

格式 VOLUME ["/data"] ( 創建一個可以從本地主機或其他容器掛載的掛載點)

- USER //USER 用來切換運行屬主身份的。Docker 默認是使用 root,但若不需要,建議切換使用者身分,畢竟 root 權限太大了,使用上有安全的風險。

格式 USER daemon

指定運行容器的用戶

- WORKDIR

> WORKDIR 用來切換工作目錄的。Docker 默認的工作目錄是/,只有 RUN 能執行 cd 命令切換目錄,而且還只作用在當下下的 RUN,也就是說每一個 RUN 都是獨立進行的。如果想讓其他指令在指定的目錄下執行,就得靠 WORKDIR。WORKDIR 動作的目錄改變是持久的,不用每個指令前都使用一次 WORKDIR

1. 格式 WORKDIR /path/to/workdir

為後續的RUN、CMD或者ENTRYPOINT指定工作目錄


2 Dockerfile示例(安裝nginx總結)

如上我們介紹了dockerfile的語法與格式,接下來我們就試試實際的操作是怎樣的吧以nginx為例:

[root@chy ~]# vim Dockerfile 
 //創建一個Dockerfile
## Set the base image to CentOS
FROM centos //基於centos的鏡像
# File Author / Maintainer
MAINTAINER chy [email protected] //作者的信息
# Install necessary tools
RUN yum install -y pcre-devel wget net-tools gcc zlib zlib-devel make openssl-devel //用run安裝一下依賴的包
# Install Nginx
ADD http://nginx.org/download/nginx-1.8.0.tar.gz . //安裝nginx的源碼包
RUN tar zxvf nginx-1.8.0.tar.gz
RUN mkdir -p /usr/local/nginx //創建一個目錄
RUN cd nginx-1.8.0 && ./configure --prefix=/usr/local/nginx && make && make install 
RUN rm -fv  /usr/local/nginx/conf/nginx.conf
ADD http://www.apelearn.com/study_v2/.nginx_conf  /usr/local/nginx/conf/nginx.conf //將配置文件下載到/usr/local/nginx/conf/nginx.conf下去
# Expose ports
EXPOSE 80
# Set the default command to execute when creating a new container
ENTRYPOINT /usr/local/nginx/sbin/nginx && tail -f /etc/passwd //這裏需要註意下如果不加tail -f /etc/passwd 這個當執行完第一個命令之後就會容器就會停止,當加了後面的tail -f後就執行不完這個容器一直執行著
[root@chy ~]# docker build -t centos7_1 . //創建鏡像 -t用來指定新的容器的名稱
[root@chy ~]# docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
centos7_1                     latest              89cc1360adab        28 seconds ago      347MB
<none>                        <none>              8c39f4925009        About an hour ago   569MB
發現有新創建的鏡像
[root@chy ~]# docker run -itd -p 81:80 centos7_1 bash //運行新的容器
1101ab2618a483fffb8902952f82331361c8ca82db8132c6ef362642bf27a204
[root@chy ~]# docker exec -it 1101ab261  bash
[root@1101ab2618a4 /]# ps aux |grep nginx
root          1  0.1  0.0  11640  1336 pts/0    Ss+  23:35   0:00 /bin/sh -c /usr/local/nginx/sbin/nginx && tail -f /etc/passwd bash
root          6  0.0  0.0  24840   792 ?        Ss   23:35   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody        8  0.0  0.2  27284  3376 ?        S    23:35   0:00 nginx: worker process
nobody        9  0.0  0.2  27284  3376 ?        S    23:35   0:00 nginx: worker process
root         23  0.0  0.0   9048   660 pts/1    S+   23:36   0:00 grep --color=auto nginx

希望看過的童鞋多多指教,謝謝!技術分享技術分享

dockerfile介紹與實例演示