0


使用DockerFile来制作镜像

DockerFile介绍

DockerFile是用来构建docker镜像的文件,它相当于是一个命令参数脚本。

构建步骤

1、编写一个dockerfile文件

2、docker build 构建成为一个镜像

3、docker run 运行制作好的镜像

4、docker push 发布镜像(Docker Hub、阿里云镜像仓库)

这里也可以先查看一下官方的做法:



DockerFile构建过程

基础知识:

  1. 每个保留关键字(指令)都必须是大写字母
  2. 执行从上到下顺序执行
  3. 表示注释

  4. 每一个指令都会创建提交一个新的镜像层,并提交

DockerFile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单,使用DockerFile创建镜像逐渐成为企业交付的标准。

DockerFile常用指令

FROM             指明构建的新镜像是来自于哪个基础镜像
MAINTAINER       指明镜像维护者及其联系方式(姓名+邮箱)
RUN                 制作镜像的时候需要运行的命令,RUN后面接linux里的命令,这个命令是在制作镜像的时候使用的
WORKDIR             镜像的工作目录,docker exec 命令执行的时候进入的目录
VOLUME             向镜像创建的容器中添加数据卷,数据卷可以在容器之间共享和重用
EXPOSE             指明容器运行的时候暴露的端口
ONBUILD             当构建一个被继承DockerFile的时候,就会运行ONBUILD指令,触发指令
ENV                 设置镜像环境变量
ADD                ADD和COPY作用相似,可以从一个URL地址下载内容复制到容器的文件系统中,还可以将压缩打包格式的文件解压后复制到指定位置
COPY             COPY指令用来将本地的文件或者文件夹复制到镜像的指定路径下
# 文件复制均使用 COPY 指令,在需要自动解压缩的场合使用 ADD 指令
CMD                 指定这个容器启动的时候要运行的命令
                 Dockerfile只允许使用一次CMD指令,一般都是脚本中最后一条指令
ENTRYPOINT         指定这个容器启动的时候要运行的命令,可以追加命令
# 如果docker run后面出现与CMD指定的相同的命令,那么CMD就会被覆盖。而ENTRYPOINT会把容器名后面的所有内容都当成参数传递给其指定的命令

CMD和ENTRYPOINT的区别

CMD                # 指定这个容器启动的时候要运行的命令
                # Dockerfile只允许使用一次CMD指令,一般都是脚本中最后一条指令

ENTRYPOINT        # 指定这个容器启动的时候要运行的命令,可以追加命令

如果docker run后面出现与CMD指定的相同的命令,那么CMD就会被覆盖。而ENTRYPOINT会把容器名后面的所有内容都当成参数传递给其指定的命令

测试CMD

[root@docker dockerfile]# vim docker-cmd-test
FROM centos
CMD ["ls","-a"]

# 构建镜像
[root@docker dockerfile]# docker build -f docker-cmd-test -t cmd-test .

# run运行,发现 ls -a 命令生效
[root@docker dockerfile]# docker run 0fc923b4a51d
.
..
.dockerenv
bin
dev
etc
home
lib
lib64

# 想追加一个命令 -l (ls -al),发现报错
[root@docker dockerfile]# docker run 0fc923b4a51d -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.

# cmd的情况下,—l替换了CMD ["ls","-a"],-l不是命令所以报错

测试ENTRYPOINT

[root@docker dockerfile]# vim docker-cmd-entrypoint
FROM centos
ENTRYPOINT ["ls","-a"]

# 构建镜像
[root@docker dockerfile]# docker build -f docker-cmd-entrypoint -t entrypoint-test .

# run运行,发现 ls -a 命令生效
[root@docker dockerfile]# docker run 7281b1d891b0
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

# 我们的追加命令,直接拼接在 ENTRYPOINT 命令的后面
[root@docker dockerfile]# docker run 7281b1d891b0 -l
total 0
drwxr-xr-x.   1 root root   6 Aug 31 06:05 .
drwxr-xr-x.   1 root root   6 Aug 31 06:05 ..
-rwxr-xr-x.   1 root root   0 Aug 31 06:05 .dockerenv
lrwxrwxrwx.   1 root root   7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x.   5 root root 340 Aug 31 06:05 dev
drwxr-xr-x.   1 root root  66 Aug 31 06:05 etc
drwxr-xr-x.   2 root root   6 Nov  3  2020 home
lrwxrwxrwx.   1 root root   7 Nov  3  2020 lib -> usr/lib
lrwxrwxrwx.   1 root root   9 Nov  3  2020 lib64 -> usr/lib64
drwx------.   2 root root   6 Dec  4  2020 lost+found
drwxr-xr-x.   2 root root   6 Nov  3  2020 media
drwxr-xr-x.   2 root root   6 Nov  3  2020 mnt
drwxr-xr-x.   2 root root   6 Nov  3  2020 opt
dr-xr-xr-x. 164 root root   0 Aug 31 06:05 proc
dr-xr-x---.   2 root root 162 Dec  4  2020 root
drwxr-xr-x.  11 root root 163 Dec  4  2020 run
lrwxrwxrwx.   1 root root   8 Nov  3  2020 sbin -> usr/sbin
drwxr-xr-x.   2 root root   6 Nov  3  2020 srv
dr-xr-xr-x.  13 root root   0 Aug 30 23:31 sys
drwxrwxrwt.   7 root root 145 Dec  4  2020 tmp
drwxr-xr-x.  12 root root 144 Dec  4  2020 usr
drwxr-xr-x.  20 root root 262 Dec  4  2020 var

实战测试

Docker Hub 中 99% 的镜像都是从 scratch 这个基础镜像过来的,然后配置需要的软件和配置来进行构建。

创建一个centos镜像

# 1、编写DockerFile文件
[root@docker dockerfile]# cat mydockerfile-centos 
FROM centos
MAINTAINER huyuxuan<[email protected]>

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum install vim -y
RUN yum install net-tools -y

EXPOSE 80

CMD echo $MYPATH
CMD ECHO "----end----"
CMD /bin/bash

# 2、通过这个文件构建镜像
[root@docker dockerfile]# docker build -f mydockerfile-centos -t mycentos:0.1 .

# 镜像构建成功
Successfully built bd65b5005d54
Successfully tagged mycentos:0.1

# 3、测试运行
[root@docker dockerfile]# docker run -it mycentos:0.1
[root@16070a4f7397 local]# pwd         # 官方的centos的工作目录默认是根目录
/usr/local
[root@16070a4f7397 local]# ifconfig    # 官方的centos是没有ifconfig和vim命令的
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.5  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:05  txqueuelen 0  (Ethernet)
        RX packets 9  bytes 726 (726.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

我们还可以通过docker history 列出本地镜像的变更历史。

[root@docker dockerfile]# docker history bd65b5005d54
IMAGE          CREATED         CREATED BY                                      SIZE      COMMENT
bd65b5005d54   7 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B        
9c40364b8e4a   7 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "ECHO…   0B        
b593d09fca86   7 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
78b2ea117a6b   7 minutes ago   /bin/sh -c #(nop)  EXPOSE 80                    0B        
1e1620cb13f8   7 minutes ago   /bin/sh -c yum install net-tools -y             29.5MB    
8302771eb989   7 minutes ago   /bin/sh -c yum install vim -y                   68.1MB    
b48359e428bd   7 minutes ago   /bin/sh -c #(nop) WORKDIR /usr/local            0B        
43e8d8a528ff   7 minutes ago   /bin/sh -c #(nop)  ENV MYPATH=/usr/local        0B        
150f4e234915   7 minutes ago   /bin/sh -c #(nop)  MAINTAINER huyuxuan<98253…   0B        
300e315adb2f   8 months ago    /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B        
<missing>      8 months ago    /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B        
<missing>      8 months ago    /bin/sh -c #(nop) ADD file:bd7a2aed6ede423b7…   209MB
标签: docker linux 运维

本文转载自: https://blog.csdn.net/weixin_44411385/article/details/123963194
版权归原作者 _SmallTownKid_ 所有, 如有侵权,请联系我们删除。

“使用DockerFile来制作镜像”的评论:

还没有评论