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>


猜你喜欢

转载自blog.51cto.com/ckl893/2331369