Docker学习笔记五——Docker镜像构建及Dockerfile

1.Docker镜像构建

  •  手动构建进入容器内部,安装所需软件,然后build镜像

1.查看所有容器
[root@linux-node1 ~]# docker ps -a -q
2aa0474e0031
1dfa8b80b45a
1aa90409ee55
e1cfab8fe686
0b7ad717a6f7
63ed68ac35a3
23451135be94
e40f77f4a2ad

2.杀死所有正在运行的容器
[root@linux-node1 ~]# docker kill $(docker ps -a -q)


3.删除所有容器
[root@linux-node1 ~]# docker rm $(docker ps -a -q)
2aa0474e0031
1dfa8b80b45a
1aa90409ee55
e1cfab8fe686
0b7ad717a6f7
63ed68ac35a3
23451135be94
e40f77f4a2ad
[root@linux-node1 ~]# docker ps -a
CONTAINER ID   IMAGE   COMMAND    CREATED    STATUS   PORTS   NAMES


4.手动构建镜像
[root@linux-node1 ~]# docker run --name mynginx -it centos #用centos镜像启动一个mynginx容器
[root@47c6ac17b2aa /]# rpm -ivh
https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm    #安装epel源
[root@47c6ac17b2aa /]# yum install nginx    #yum安装nginx,也可以编译安装
[root@47c6ac17b2aa /]# vi /etc/nginx/nginx.conf    #编辑nginx配置文件,让其在前台运行
# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/
daemon off;    #添加此行
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid....
[root@47c6ac17b2aa /]# exit

5.构建镜像
[root@linux-node1 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
47c6ac17b2aa        centos              "/bin/bash"         34 minutes ago      Exited (0) 39 seconds ago                       mynginx
[root@linux-node1 ~]# docker commit -m "My Nginx" 47c6ac17b2aa anzhihe/mynginx:v1 #-m加描述
sha256:abaf7c060d180807800caa078efb9a9749e52e600b84a14a55e6d314a5a2a805
[root@linux-node1 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
anzhihe/mynginx     v1                  abaf7c060d18        47 seconds ago      358.2 MB
mynginx             v2                  777e0635d4e5        6 months ago        278.9 MB
docker.io/centos    latest              980e0e4c79ec        6 months ago        196.7 MB
docker.io/nginx     latest              4efb2fcdb1ab        6 months ago        183.4 MB
#基于mynginx镜像构建容器,然后执行nginx命令,
[root@linux-node1 ~]# docker run --name mynginx-test -d -p 81:80 anzhihe/mynginx:v1 nginx
359c9ee5aef14c0f72e76a32c2f9d0225108a6fc838d37141d32dde891e9c634
[root@linux-node1 ~]# docker ps
CONTAINER ID        IMAGE                COMMAND             CREATED             STATUS              PORTS                NAMES
359c9ee5aef1        anzhihe/mynginx:v1   "nginx"             3 minutes ago       Up 3 minutes        0.0.0.0:81->80/tcp   mynginx-test

Docker学习笔记五——Docker镜像构建及Dockerfile

  •  Dockerfile构建使用Dockerfile构建镜像

1.创建Dockerfile
[root@linux-node1 ~]# mkdir /opt/dockerfile/nginx
[root@linux-node1 /opt/dockerfile/nginx]# vim Dockerfile    #D必须大写,Dockerfile中不要有中文注释,

2.编辑Dockerfile文件,定义构建容器的步骤
#Study Dockerfile

# Base image
From centos #设置基础镜像,第一条命令必须是From

# Maintainer
MAINTAINER ZHIHE AN anzhihe@xxx.com #维护者信息

# Commands
RUN rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
RUN yum install -y nginx && yum clean all
RUN echo "daemon off;" >> /etc/nginx/nginx.conf #修改nginx配置文件
ADD index.html /usr/share/nginx/html/index.html #添加首页文件到nginx容器,index.html需与Dockerfile放在同一目录下
EXPOSE 80       #对外暴露80端口
CMD ["nginx"]   #容器启动运行的命令

3.执行Dockerfile文件
[root@linux-node1 /opt/dockerfile/nginx]# docker build -t mynginx:v2 .    
#执行Dockerfile文件,后边的点不能省略,docker会在当前目录查找Dockerfile文件
Sending build context to Docker daemon 4.096 kB
Step 1 : FROM centos
---> 980e0e4c79ec
Step 2 : MAINTAINER ZHIHE AN anzhihe@xxx.com
---> Running in b0126209ccf7
---> e97a17db80d0
Removing intermediate container b0126209ccf7
Step 3 : RUN rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
---> Running in b76a56f0fcfb
warning: /var/tmp/rpm-tmp.0yRuhF: Header V3 RSA/SHA256 Signature, key ID 352c64e5: NOKEY
Retrieving https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
Preparing...                          ########################################
Updating / installing...
epel-release-7-9                      ########################################
---> 8ffd06fbd502
Removing intermediate container b76a56f0fcfb
Step 4 : RUN yum install -y nginx && yum clean all
---> Running in 04eee1ba5f92
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
* base: mirror.bit.edu.cn
* epel: mirrors.tuna.tsinghua.edu.cn
* extras: mirrors.btte.net
* updates: mirrors.btte.net
Resolving Dependencies
--> Running transaction check
---> Package nginx.x86_64 1:1.10.2-1.el7 will be installed
......省略,安装内容太多
Step 5 : RUN echo "daemon off;" >> /etc/nginx/nginx.conf
---> Running in f6685450fcc5
---> 759984d48425
Removing intermediate container f6685450fcc5
Step 6 : ADD index.html /usr/share/nginx/html/index.html
---> 4404d657bd19
Removing intermediate container bd062ea67b50
Step 7 : EXPOSE 80
---> Running in 28a4a363fcf3
---> 8f3732779de8
Removing intermediate container 28a4a363fcf3
Step 8 : CMD nginx
---> Running in dd8df55c3cf7
---> 18a9a2e53ed2
Removing intermediate container dd8df55c3cf7
Successfully built 18a9a2e53ed2   #构建成功,将Dockerfile中定义和命令一条一条执行,易于传播共享。

[root@linux-node1 /opt/dockerfile/nginx]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mynginx             v2                  19bb19e98618        17 seconds ago      282.8 MB


[root@linux-node1 /opt/dockerfile/nginx]# docker run --name mynginx-v2 -d -p 82:80 mynginx:v2
e3ccfed3ff8199631854427fabfdd8196694ced586ea0345b30955352ecf0919

Docker学习笔记五——Docker镜像构建及Dockerfile


3.Dockerfile详解

  • 一张图看懂Dockerfile(图转自赵班长)

Docker学习笔记五——Docker镜像构建及Dockerfile

  • FROM

    语法:FROM <image>[:<tag>]
    
    解释:设置要制作的镜像基于哪个镜像,FROM指令必须是整个Dockerfile的第一个指令,如果指定的镜像不存在默认会自动从Docker Hub上下载。


  • MAINTAINER

    语法:MAINTAINER <name>
    
    解释:MAINTAINER指令允许你给将要制作的镜像设置作者信息
  • RUN

    语法: ①RUN <command>       
           #将会调用/bin/sh -c <command>
           ②RUN ["executable", "param1", "param2"]   
           #将会调用exec执行,以避免有些时候shell方式执行时的传递参数问题,而且有些基础镜像可能不包含/bin/sh
    
    解释:RUN指令会在一个新的容器中执行任何命令,然后把执行后的改变提交到当前镜像,提交后的镜像会被用于Dockerfile中定义的下一步操作,RUN中定义的命令会按顺序执行并提交,这正是Docker廉价的提交和可以基于镜像的任何一个历史点创建容器的好处,就像版本控制工具一样。
  • CMD

    语法:①CMD ["executable", "param1", "param2"]    
          #将会调用exec执行,首选方式
          ②CMD ["param1", "param2"]        
          #当使用ENTRYPOINT指令时,为该指令传递默认参数
          ③CMD <command> [ <param1>|<param2> ]        
          #将会调用/bin/sh -c执行
    
    解释:CMD指令中指定的命令会在镜像运行时执行,在Dockerfile中只能存在一个,如果使用了多个CMD指令,则只有最后一个CMD指令有效。当出现ENTRYPOINT指令时,CMD中定义的内容会作为ENTRYPOINT指令的默认参数,也就是说可以使用CMD指令给ENTRYPOINT传递参数。
    
    注意:RUN和CMD都是执行命令,他们的差异在于RUN中定义的命令会在执行docker build命令创建镜像时执行,而CMD中定义的命令会在执行docker run命令运行镜像时执行,另外使用第一种语法也就是调用exec执行时,命令必须为绝对路径。
  • EXPOSE

    语法:EXPOSE <port> [ ...]
    
    解释:EXPOSE指令用来告诉Docker这个容器在运行时会监听哪些端口,Docker在连接不同的容器(使用–link参数)时使用这些信息。
  • ENV

    语法:ENV <key> <value>
    
    解释:ENV指令用于设置环境变量,在Dockerfile中这些设置的环境变量也会影响到RUN指令,当运行生成的镜像时这些环境变量依然有效,如果需要在运行时更改这些环境变量可以在运行docker run时添加–env <key>=<value>参数来修改。
    
    注意:最好不要定义那些可能和系统预定义的环境变量冲突的名字,否则可能会产生意想不到的结果。
  • ADD

    语法:ADD <src> <dest>
    
    解释:ADD指令用于从指定路径拷贝一个文件或目录到容器的指定路径中,<src>是一个文件或目录的路径,也可以是一个url,路径是相对于该Dockerfile文件所在位置的相对路径,<dest>是目标容器的一个绝对路径,例如/home/yooke/Docker/Dockerfile这个文件中定义的,那么ADD /data.txt /db/指令将会尝试拷贝文件从/home/yooke/Docker/data.txt到将要生成的容器的/db/data.txt,且文件或目录的属组和属主分别为uid和gid为0的用户和组,如果是通过url方式获取的文件,则权限是600。
    
    注意:①如果执行docker build – < somefile即通过标准输入来创建时,ADD指令只支持url方式,另外如果url需要认证,则可以通过RUN wget …或RUN curl …来完成,ADD指令不支持认证。
          ②<src>路径必须与Dockerfile在同级目录或子目录中,例如不能使用ADD ../somepath,因为在执行docker build时首先做的就是把Dockerfile所在目录包含子目录发送给docker的守护进程。
          ③如果<src>是一个url且<dest>不是以”/“结尾,则会下载文件并重命名为<dest>。
          ④如果<src>是一个url且<dest>以“/”结尾,则会下载文件到<dest>/<filename>,url必须是一个正常的路径形式,“http://example.com”像这样的url是不能正常工作的。
          ⑤如果<src>是一个本地的压缩包且<dest>是以“/”结尾的目录,则会调用“tar -x”命令解压缩,如果<dest>有同名文件则覆盖,但<src>是一个url时不会执行解压缩。
  • COPY

    语法:COPY <src> <dest>
    
    解释:用法与ADD相同,不过<src>不支持使用url,所以在使用docker build – < somefile时该指令不能使用。
  • ENTRYPOINT

    语法:①ENTRYPOINT ["executable", "param1", "param2"]        
          #将会调用exec执行,首选方式
          ②ENTRYPOINT command param1 param2             
          #将会调用/bin/sh -c执行
    
    解释:ENTRYPOINT指令中指定的命令会在镜像运行时执行,在Dockerfile中只能存在一个,如果使用了多个ENTRYPOINT指令,则只有最后一个指令有效。ENTRYPOINT指令中指定的命令(exec执行的方式)可以通过docker run来传递参数,例如docker run <images> -l启动的容器将会把-l参数传递给ENTRYPOINT指令定义的命令并会覆盖CMD指令中定义的默认参数(如果有的话),但不会覆盖该指令定义的参数,例如ENTRYPOINT ["ls","-a"],CMD ["/etc"],当通过docker run <image>启动容器时该容器会运行ls -a /etc命令,当使用docker run <image> -l启动时该容器会运行ls -a -l命令,-l参数会覆盖CMD指令中定义的/etc参数。
    
    注意:①当使用ENTRYPOINT指令时生成的镜像运行时只会执行该指令指定的命令。
          ②当出现ENTRYPOINT指令时CMD指令只可能(当ENTRYPOINT指令使用exec方式执行时)被当做ENTRYPOINT指令的参数使用,其他情况则会被忽略。
  • VOLUME

    语法:VOLUME ["samepath"]
    
    解释:VOLUME指令用来设置一个挂载点,可以用来让其他容器挂载以实现数据共享或对容器数据的备份、恢复或迁移,具体用法请参考其他文章。
  • USER

    语法:USER [username|uid]
    
    解释:USER指令用于设置用户或uid来运行生成的镜像和执行RUN指令。
  • WORKDIR

    语法:WORKDIR /path/to/workdir
    
    解释:WORKDIR指令用于设置Dockerfile中的RUN、CMD和ENTRYPOINT指令执行命令的工作目录(默认为/目录),该指令在Dockerfile文件中可以出现多次,如果使用相对路径则为相对于WORKDIR上一次的值,例如WORKDIR /data,WORKDIR logs,RUN pwd最终输出的当前目录是/data/logs。
  • ONBUILD

    语法:ONBUILD [INSTRUCTION]
    
    解释:ONBUILD指令用来设置一些触发的指令,用于在当该镜像被作为基础镜像来创建其他镜像时(也就是Dockerfile中的FROM为当前镜像时)执行一些操作,ONBUILD中定义的指令会在用于生成其他镜像的Dockerfile文件的FROM指令之后被执行,上述介绍的任何一个指令都可以用于ONBUILD指令,可以用来执行一些因为环境而变化的操作,使镜像更加通用。
    
    注意:①ONBUILD中定义的指令在当前镜像的build中不会被执行。
          ②可以通过查看docker inspeat <image>命令执行结果的OnBuild键来查看某个镜像ONBUILD指令定义的内容。
          ③ONBUILD中定义的指令会当做引用该镜像的Dockerfile文件的FROM指令的一部分来执行,执行顺序会按ONBUILD定义的先后顺序执行,如果ONBUILD中定义的任何一个指令运行失败,则会使FROM指令中断并导致整个build失败,当所有的ONBUILD中定义的指令成功完成后,会按正常顺序继续执行build。
          ④ONBUILD中定义的指令不会继承到当前引用的镜像中,也就是当引用ONBUILD的镜像创建完成后将会清除所有引用的ONBUILD指令。
          ⑤ONBUILD指令不允许嵌套,例如ONBUILD ONBUILD ADD . /data是不允许的。
          ⑥ONBUILD指令不会执行其定义的FROM或MAINTAINER指令。

设置环境变量除了ENV 外对容器还可能用以下两种方式 :

docker exec -i CONTAINER_ID /bin/bash -c "export DOCKER_HOST=tcp://localhost:port"

echo 'export DOCKER_HOST=tcp://localhost:port' >> ~/.bashrc

◎参考:

Dockerfile编写最佳实践指南

https://hujb2000.gitbooks.io/docker-flow-evolution/content/cn/basis/dockerfiledetail.html



anzhihe 安志合个人博客,版权所有 丨 如未注明,均为原创 丨 转载请注明转自:https://chegva.com/1657.html | ☆★★每天进步一点点,加油!★★☆ | 

您可能还感兴趣的文章!

发表评论

电子邮件地址不会被公开。 必填项已用*标注