docker镜像简介
docker镜像是分层的,有底层网上叠加下载。
dockerfille是以文本的方式生成镜像,他的好处在于生成镜像后可以查看生成流程。相对于docker commit,使它更加的安全可靠。
使用dockerfile时必须有一个写一个以Dockerfile名字的文件。
dockerfile的工作流程
- docker会从dockerfile文件的FROM头部指定的镜像运行一个容器
- 然后做出一条指令,对容器做出修改
- 接着执行类似于docker commit的操作,创建一个新的镜像层
- 然后在基于此镜像创建一个新的容器
- 在此镜像中依次执行dockerfile中的指令,直至指令结束
特点:Dockerfile有个好处就是他又缓存,只要不改变镜像层,他就是秒级别生成镜像。
dockerfile文件书写格式
- *FROM: 构建镜像基于哪个镜像
例如: FROM centos:7 - MAINTAINER: 镜像维护者姓名或邮箱地址
例如: MAINTAINER adam - *RUN: 构建镜像时运行的shell命令
例如:
RUN [“yum”,“install”,“httpd”] RUN yum -y install httpd - *CMD: 运行容器时执行的shell命令
例如: CMD ["/bin/bash"] - *EXPOSE: 声明容器的服务端口
例如: EXPOSE 80 443 - *ENV: 设置容器环境变量
例如: ENV MYSQL_ROOT_PASSWORD 123.com - *ADD: 拷贝文件或目录到镜像,如果是URL或压缩包会自动下载或自动解压
ADD <源文件>… <目标目录> ADD [“源文件”…“目标目录”] - *COPY: 拷贝文件或目录到镜像容器内,跟ADD类似,但不具备自动下载或解压功能
- ENTRYPOINT: 运行容器时执行的shell命令
例如: ENTRYPOINT ["/bin/bash","-c",“command”] ENTRYPOINT /bin/bash -c ‘command’ - *VOLUME: 指定容器挂载点到宿主机自动生成的目录或其他容器
例如: VOLUME ["/var/lib/mysql"] - USER: 为RUN、CMD、和ENTRYPOINT执行命令指定运行用户
- *WORKDIR: 为RUN、CMD、ENTRYPOINT、COPY和ADD设置工作目录,意思为切换目录
例如:
WORKDIR: /var/lib/mysql = cd /var/lib/mysql - HEALTHCHECK: 健康检查
- ARG: 构建时指定的一些参数
例如: FROM centos:7 ARG user USER $user
注意:
- RUN在building时运行,可以写多条。其实RUN是有条件限制的(好像是200条)。
- CMD和ENTRYPOINT在运行container时运行,只能写一条,如果写多条,最后一条生效
- CMD在run时可以被COMMAND覆盖,ENTRYPOINT不会被COMMAND覆盖,但可以指定–entrypoint覆盖。
- 如果在Dockerfile里需要往镜像内导入文件,则,此文件或目录必须在Dockerfile所在目录或子目录下。
- 一个目录下,只能有一个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