Docker制作镜像的方法

Posted Firm陈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker制作镜像的方法相关的知识,希望对你有一定的参考价值。

docker镜像简介

docker镜像是分层的,由底层网上叠加下载。

dockerfille是以文本的方式生成镜像,他的好处在于生成镜像后可以查看生成流程。相对于docker commit,使它更加的安全可靠。使用dockerfile时必须有一个以Dockerfile名字的文件。

dockerfile的工作流程

1、docker会从dockerfile文件的FROM头部指定的镜像运行一个容器
2、然后做出一条指令,对容器做出修改
3、接着执行类似于docker commit的操作,创建一个新的镜像层
4、然后在基于此镜像创建一个新的容器
5、在此镜像中依次执行dockerfile中的指令,直至指令结束

特点:Dockerfile有个好处就是他有缓存,只要不改变镜像层,他就是秒级别生成镜像。

dockerfile文件书写格式

1、*FROM: 构建镜像基于哪个镜像
例如: FROM centos:7
2、MAINTAINER: 镜像维护者姓名或邮箱地址
例如: MAINTAINER adam
3、*RUN: 构建镜像时运行的shell命令
例如:
RUN [“yum”,“install”,“httpd”] RUN yum -y install httpd
4、*CMD: 运行容器时执行的shell命令
例如: CMD [“/bin/bash”]
5、*EXPOSE: 声明容器的服务端口
例如: EXPOSE 80 443
6、*ENV: 设置容器环境变量
例如: ENV mysql_ROOT_PASSWORD 123.com
7、*ADD: 拷贝文件或目录到镜像,如果是URL或压缩包会自动下载或自动解压
ADD <源文件>… <目标目录> ADD [“源文件”…“目标目录”]
8、*COPY: 拷贝文件或目录到镜像容器内,跟ADD类似,但不具备自动下载或解压功能
9、ENTRYPOINT: 运行容器时执行的shell命令
例如: ENTRYPOINT [“/bin/bash”,“-c”,“command”] ENTRYPOINT /bin/bash -c ‘command’
10、*VOLUME: 指定容器挂载点到宿主机自动生成的目录或其他容器
例如: VOLUME [“/var/lib/mysql”]
11、USER: 为RUN、CMD、和ENTRYPOINT执行命令指定运行用户
12、*WORKDIR: 为RUN、CMD、ENTRYPOINT、COPY和ADD设置工作目录,意思为切换目录
例如:
WORKDIR: /var/lib/mysql = cd /var/lib/mysql
13、HEALTHCHECK: 健康检查
14、ARG: 构建时指定的一些参数
例如: FROM centos:7 ARG user USER $user

注意:
1、RUN在building时运行,可以写多条。其实RUN是有条件限制的(好像是200条)。
2、CMD和ENTRYPOINT在运行container时运行,只能写一条,如果写多条,最后一条生效
3、CMD在run时可以被COMMAND覆盖,ENTRYPOINT不会被COMMAND覆盖,但可以指定–entrypoint覆盖。
4、如果在Dockerfile里需要往镜像内导入文件,则,此文件或目录必须在Dockerfile所在目录或子目录下。
5、一个目录下,只能有一个Dockerfile文件,并且名称的大小写严格按照要求: Dockerfile.

实验

使用dockerfile制作一个镜像。
第一步;创建一个专用的文件加,我喜欢创建在根下,应为好找。
第二步:创建一个Dockerfile的文件,注意开头一定要大写。
第三步:写入要执行的内容,这是在docker容器中运行的。
第四步:运行命令

命令格式:命令 - 参数 - 选项 - 镜像新的名称 - 当前目录
第一步:
[root@bogon centos7]# mkdir /centos7
第二步:
[root@bogon centos7]# vim Dockerfile
第三步:
FROM centos7
RUN yum -y  install wget
RUN  wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
RUN yum clean all
RUN  yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
COPY nginx-1.21.1.tar.gz /
RUN tar xf nginx-1.21.1.tar.gz -C /usr/src
RUN useradd -M -s /sbin/nologin nginx
WORKDIR /usr/src/nginx-1.21.1
RUN ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
RUN make && make install
RUN ln -s /usr/local/nginx/sbin/* /usr/local/sbin/
RUN nginx -t
RUN nginx
EXPOSE 80
第四步:
[root@bogon centos7]# docker build -t centos7.23 .
Sending build context to Docker daemon  612.7MB
Step 1/15 : FROM centos7
 ---> 7e6257c9f8d8
Step 2/15 : RUN yum -y  install wget
 ---> Using cache
 ---> 1a2feeacb848
Step 3/15 : RUN  wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
 ---> Using cache
 ---> 60c79176858e
静静的等待容器制作完成即可。制作完成后镜像是保存在docker中的。

docker commit制作

这种方法制作出的镜像就更佳的简单了,一条命令直接运行,缺点是无法查看制作步骤。

命令格式:命令 - 参数 - 已存在的容器 - 新镜像名称
[root@bogon centos7]# docker commit test1 testss
sha256:1d4227113442d943a17e20404028e66061775eb1141a326c4c5b25859a999394
[root@bogon centos7]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
testss              latest              1d4227113442        12 seconds ago      462MB
test1_test          latest              968dc0f28dd1        11 hours ago        462MB
centos7.1           latest              ec601049a17a        17 hours ago        601MB

以上是关于Docker制作镜像的方法的主要内容,如果未能解决你的问题,请参考以下文章

Docker 镜像制作方法

Docker:dockerfile构建php项目 [八]

Docker笔记三 Docker镜像制作

Docker笔记三 Docker镜像制作

docker如何制作自己的镜像

Docker制作镜像的方法