docker镜像简介

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

docker 镜像发布 docker 做镜像_深度学习

dockerfille是以文本的方式生成镜像,他的好处在于生成镜像后可以查看生成流程。相对于docker commit,使它更加的安全可靠。

使用dockerfile时必须有一个写一个以Dockerfile名字的文件。

docker 镜像发布 docker 做镜像_docker_02

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