docker 實踐(四)dockerfile 說明

一、dockfile 說明

docker 運行一個自定義的image時,就需要自己來定義,這時候就需要dockfile了。

二、docker commit生成新鏡像

2.1.運行容器

# docker run -it centos /bin/bash

2.2.安裝vim

# yum install vim

2.3.將容器打包成新鏡像

# docker commit 07929e3af3ef cent-vim

2.4.查看新鏡像

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
cent-vim            latest              4659d1ec001d        7 seconds ago       225MB
centos              latest              1e1148e4cc2c        8 days ago          202MB
nginx               latest              568c4670fa80        2 weeks ago         109MB
ubuntu              latest              93fd78260bd1        3 weeks ago         86.2MB
busybox             latest              59788edf1f3e        2 months ago        1.15MB

這樣操作,非常不便,切容易出錯,如何有更好方式來定義鏡像呢?這就需要dockfile了


三、dockfile

3.1.編輯dockfile文件

# vim Dockerfile 
FROM centos
RUN yum update && yum install vim -y


3.2.build構建鏡像

# docker build -t centos-vim .   #-t 將新鏡像命名爲centos-vim
Sending build context to Docker daemon   16.9kB
Step 1/2 : FROM centos  #鏡像來源
 ---> 1e1148e4cc2c
Step 2/2 : RUN yum update && yum install vim -y  #構建時執行的命令
 ---> Running in d7a98cfdffb7
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
 * base: centos.ustc.edu.cn
 * extras: mirrors.aliyun.com
 * updates: mirrors.cn99.com
No packages marked for update
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: centos.ustc.edu.cn
 * extras: mirrors.aliyun.com
 * updates: mirrors.cn99.com
Resolving Dependencies
--> Running transaction check
---> Package vim-enhanced.x86_64 2:7.4.160-5.el7 will be installed
....
Removing intermediate container d7a98cfdffb7
 ---> 82fd472e3387
Successfully built 82fd472e3387  #構建成功,鏡像ID爲82fd472e3387
Successfully tagged centos-vim:latest #爲鏡像添加一個TAG

查看鏡像:

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos-vim          latest              82fd472e3387        2 minutes ago       327MB
cent-vim            latest              4659d1ec001d        About an hour ago   225MB
centos              latest              1e1148e4cc2c        8 days ago          202MB
nginx               latest              568c4670fa80        2 weeks ago         109MB
ubuntu              latest              93fd78260bd1        3 weeks ago         86.2MB
busybox             latest              59788edf1f3e        2 months ago        1.15MB

3.3.構建鏡像時拷貝文件

3.3.1.文件內容:

# cat ckl.txt 
The narcissus bloom every year.

3.3.2.dockfile 內容

# vim Dockerfile 
FROM centos
RUN yum update && yum install vim -y
COPY ckl.txt /

3.3.3.構建鏡像

# docker build -t cent-ckl-vim .
# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
cent-ckl-vim        latest              fc090867ce91        42 seconds ago      327MB
centos-vim          latest              82fd472e3387        16 minutes ago      327MB
cent-vim            latest              4659d1ec001d        About an hour ago   225MB
centos              latest              1e1148e4cc2c        8 days ago          202MB
nginx               latest              568c4670fa80        2 weeks ago         109MB
ubuntu              latest              93fd78260bd1        3 weeks ago         86.2MB
busybox             latest              59788edf1f3e        2 months ago        1.15MB

3.3.4.運行容器查看內容

# docker run -it cent-ckl-vim
[root@050821c80ca8 /]# 
[root@050821c80ca8 /]# 
[root@050821c80ca8 /]# ls
anaconda-post.log  bin  ckl.txt  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@050821c80ca8 /]# 
[root@050821c80ca8 /]# 
[root@050821c80ca8 /]# cat ckl.txt 
The narcissus bloom every year.  #拷貝的文件
[root@050821c80ca8 /]# 
[root@050821c80ca8 /]# 
[root@050821c80ca8 /]# vim 1.txt #vim 已經按照

3.3.5.拷貝容器的另一種方式

# vim Dockerfile 
FROM centos
RUN yum update && yum install vim -y
ADD nginx-1.12.2.tar.gz /

構建鏡像:

# docker build -t centos-ckl-ng .
Sending build context to Docker daemon      1MB
Step 1/3 : FROM centos  
 ---> 1e1148e4cc2c
Step 2/3 : RUN yum update && yum install vim -y
 ---> Using cache  #之前已經構建過了以上步驟,所以這裏使用了緩存
 ---> 82fd472e3387
Step 3/3 : ADD nginx-1.12.2.tar.gz /
 ---> 248da05fb49e
Successfully built 248da05fb49e
Successfully tagged centos-ckl-ng:latest

查看鏡像:

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos-ckl-ng       latest              248da05fb49e        23 seconds ago      333MB
centos-vim          latest              82fd472e3387        24 minutes ago      327MB
cent-vim            latest              4659d1ec001d        About an hour ago   225MB
centos              latest              1e1148e4cc2c        8 days ago          202MB
nginx               latest              568c4670fa80        2 weeks ago         109MB
ubuntu              latest              93fd78260bd1        3 weeks ago         86.2MB
busybox             latest              59788edf1f3e        2 months ago        1.15MB

運行鏡像容器:

# docker run -it centos-ckl-ng  
[root@a7bdc5e9ecf4 /]# 
[root@a7bdc5e9ecf4 /]# 
[root@a7bdc5e9ecf4 /]# ls
anaconda-post.log  bin  dev  etc  home  lib  lib64  media  mnt  nginx-1.12.2  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

#tar 包已經被解壓,COPY則不會


3.3.6.構建鏡像啓動後運行命令CMD

編輯文件:

# vim Dockerfile 
RUN yum install -y httpd
RUN yum install -y httpd
FROM centos
RUN yum update && yum install vim -y
ADD nginx-1.12.2.tar.gz /
RUN yum install -y httpd && yum -y install initscripts pm-utils
CMD ["service","httpd","start"]

構建鏡像:

# docker build -t cent-ckl-http .

查看鏡像:

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
cent-ckl-http       latest              d848cf5482e6        4 seconds ago       443MB
centos-ckl-ng       latest              248da05fb49e        22 minutes ago      333MB
centos-vim          latest              82fd472e3387        About an hour ago   327MB
cent-vim            latest              4659d1ec001d        2 hours ago         225MB
centos              latest              1e1148e4cc2c        8 days ago          202MB
nginx               latest              568c4670fa80        2 weeks ago         109MB
ubuntu              latest              93fd78260bd1        3 weeks ago         86.2MB
busybox             latest              59788edf1f3e        2 months ago        1.15MB


運行鏡像的容器:

# docker run -it cent-ckl-http 
Redirecting to /bin/systemctl start httpd.service  #已經執行了CMD的命令
Failed to get D-Bus connection: Operation not permitted

這個的原因是因爲dbus-daemon沒能啓動。其實systemctl並不是不可以使用。將你的CMD或者entrypoint設置爲/usr/sbin/init即可。會自動將dbus等服務啓動起來。 

然後就可以使用systemctl了。


# docker run -it --privileged cent-ckl-http init
[FAILED] Failed to start LSB: Bring up/down networking.
See 'systemctl status network.service' for details.

沒有搞定!!!

3.3.7.構建鏡像設置環境變量及目錄

修改dockfile文件

# vim Dockerfile 
FROM centos
RUN yum update && yum install vim -y && mkdir /tmp/soft
ADD nginx-1.12.2.tar.gz /tmp/soft
WORKDIR /tmp/soft/nginx-1.12.2
ENV NAME=ckl
RUN yum install -y httpd && yum -y install initscripts pm-utils
CMD ["service","httpd","start"]
CMD ["echo","$NAME"]


構建鏡像文件:

# docker build -t cent-ckl-http .

啓動鏡像容器:

# docker run -it cent-ckl-http /bin/bash
[root@355cc5d1501e nginx-1.12.2]#    #當前目錄
[root@355cc5d1501e nginx-1.12.2]# 
[root@355cc5d1501e nginx-1.12.2]# echo $NAME   #變量
ckl

三、dockfile 參數說明

Dockerfile 一般分爲四部分:基礎鏡像信息、維護者信息、鏡像操作指令和容器啓動時執行指令
FROM:指定基礎鏡像,必須爲第一個命令
MAINTAINER: 維護者信息
RUN:構建鏡像時執行的命令
ADD:將本地文件添加到容器中,tar類型文件會自動解壓,可以訪問網絡資源,類似wget
COPY:功能類似ADD,但是是不會自動解壓文件,也不能訪問網絡資源
CMD:構建容器後調用,也就是在容器啓動時才進行調用。
ENTRYPOINT:配置容器,使其可執行化。配合CMD可省去"application",只使用參數。
LABEL:用於爲鏡像添加元數據
ENV:設置環境變量
EXPOSE:指定於外界交互的端口
VOLUME:用於指定持久化目錄
WORKDIR:工作目錄,類似於cd命令
USER:指定運行容器時的用戶名或 UID,後續的 RUN 也會使用指定用戶。使用USER指定用戶時,可以使用用戶名、UID或GID,或是兩者的組合。當服務不需要管理員權限時,可以通過該命令指定運行用戶。並且可以在之前創建所需要的用戶
ARG:用於指定傳遞給構建運行時的變量
ONBUILD:用於設置鏡像觸發器
來源參考:https://www.cnblogs.com/panwenbin-logs/p/8007348.html

四、配置nginx安裝示例

4.1.編輯dockfile文件

vim Dockerfile 
FROM centos
MAINTAINER ckl
RUN yum update && yum -y install vim zlib zlib-devel openssl openssl-devel gcc-c++ pcre pcre-devel initscripts pm-utils
RUN mkdir /tmp/soft
RUN adduser ckl
ADD nginx-1.12.2.tar.gz /tmp/soft
WORKDIR /tmp/soft/nginx-1.12.2
RUN ./configure --prefix=/usr/local/nginx --user=ckl --group=ckl --with-http_ssl_module && make && make install
ENV PATH /usr/local/nginx/sbin:$PATH 
EXPOSE 80
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

4.2.構建鏡像

docker build -t nginx-centos .

4.3.啓動鏡像容器:

docker run -p 80 --name 'ckl-ng' -d nginx-centos

4.4.已經啓動了nginx

# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
4f68eeb38e28        nginx-centos        "/usr/local/nginx/sb…"   7 minutes ago       Up 7 minutes        0.0.0.0:32768->80/tcp   ckl-ng

4.5.訪問:

# curl http://172.17.0.3
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章