一、简介
- Docker 镜像原理、容器转成镜像
- 随便找个案例,进入 https://hub.docker.com/ 搜索
centos
,然后随便找个版本(例如:centos7
)点击一下,就会进入centos7
的dockerfile
文件:
// 空镜像 scratch // 通常使用 Docker 镜像时会以一个已存在的镜像为基础,在其上进行定制,这个已存在的镜像就是基础镜像。 // 在 DockerFile 中必须指定基础镜像,FROM 指令就是用于指定基础镜像,因此一个 Dockerfile 中 FROM 是必备的指令,并且必须是第一条指令。 // Docker 还存在一个特殊的镜像,名为 scratch。这个镜像是虚拟的概念,并不实际存在,它表示一个空白的镜像。在 Dockerfile 中以 scratch 为基础镜像 (FROM scratch),意味着不以任何镜像为基础,接下来所写的指令将作为镜像第一层开始存在。 // 对于 Linux 下静态编译的程序来说,并不需要有操作系统提供运行时支持,所需的一切库都已经在可执行文件里了,因此直接 FROM scratch 会让镜像体积更加小巧。使用 Go 语言开发的应用很多会使用这种方式来制作镜像,这也是为什么有人认为 Go 是特别适合容器微服务架构的语言的原因之一。 FROM scratch // 将 centos-7-x86_64 的压缩包添加到了根目录下,'/' 是根目录 ADD centos-7-x86_64-docker.tar.xz / // 标签信息,一个镜像支持多个label LABEL \ org.label-schema.schema-version="1.0" \ org.label-schema.name="CentOS Base Image" \ org.label-schema.vendor="CentOS" \ org.label-schema.license="GPLv2" \ org.label-schema.build-date="20201113" \ org.opencontainers.image.title="CentOS Base Image" \ org.opencontainers.image.vendor="CentOS" \ org.opencontainers.image.licenses="GPL-2.0-only" \ org.opencontainers.image.created="2020-11-13 00:00:00+00:00" // 指定进入容器时使用的默认解释器类型,当创建容器时尾部如果不指定解释器类型就会使用默认的 CMD ["/bin/bash"]
二、语法与指令
dockerfile
是用来构建docker
镜像的构建文件,是由一系列命令和参数构成的脚本- 构建的三步骤:
编写 dockerfile 文件
→build 构建
→docker run
dockerfile
指令:
FROM:当前新镜像是基于那镜像 MAINTAINER:镜像作者 RUN:容器需要运行的命令 EXPOSE:对外端口号 WORKDIR:指定终端进入的工作目录 ENV:设置环境变量 ADD:将宿主机目录下的文件拷贝进镜像,ADD 命令会自动处理 URL 和解压压缩包 COPY:将宿主机目录下的文件拷贝进镜像 VOLUME:容器数据卷 CMD:指定一个容器运行时要运行的文件(可以有很多 CMD 命令,但只有最后一个生效) ENTRYPOINT:指定一个容器运行时要运行的文件 OMBUILD:构建一个被继承的 dockerfile 时运行命令,父镜像在子镜像继承之后,父镜像 onbuild 被 cufa 触发 HEALTHCHECK:Docker 1.12 版本后引入的判断容器运行状态是否正常。
三、案例
- 案例一:
// 基于 centos 镜像 FEOM centos // 作者信息 dzm MAINTAINER dzm // 自定义环境变量 ENV mypath /usr/local // 定义工作目录 WORKDIR /usr // 添加 jdk×86 到 /usr/loca COPY jkd-8u171-linux-×86.tar.gz /usr/local // 添加并解压 jdk×64 到 /usr/local ADD jkd-8u171-linux-×64.tar.gz /usr/local // 添加并解压 tomcat 到 /usr/local ADD apache-tomcat-9.0.6.tar.gz /usr/local # 配置 java 与 tomcat 的环境变量 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CLASS_HOME /usr/local/apache-tomcat-9.0.6 ENV CLASS_BASE /usr/local/apache-tomcat-9.0.6 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin // 加入三个容器卷 VOLUME ["/mydata1","/mydata2","/mydata3"] // 安装 vim 组件 RUN yum -y instatll vim // 安装网络组件 RUN yun -y install net-tool // 监听端口 EXPOSE 80 // 指定 CMD CMD bin/bash
- 案例二:
// 基于 nginx:1.17.9 镜像构建 FROM nginx:1.17.9 // 指定信息 LABEL maintainer="hogwarts@testing-studio.com>" // 设置环境变量 ENV NGINX_VERSION 1.17.9 // 切换 root 用户 USER root // 执行命令,安装 curl 软件,设置软链接把 nginx 服务的日志显示到终端输出上。 RUN apt-get -yq update && apt-get install -y curl && \ ln -sf /dev/stdout /var/log/nginx/access.log && \ ln -sf /dev/stderr /var/log/nginx/error.log // 设置容器内 /data 目录为匿名卷 VOLUME ["/data"] // 设置工作目录 WORKDIR /data/html/ // 复制 index.html 文件到 WORKDIR 目录下 COPY index.html . // 映射 80 端口 EXPOSE 80 // 此处 CMD 作为 ENTRYPOINT 的参数。 // CMD ["nginx", "-g", "daemon off;"] CMD ["-g", "daemon off;"] // 设置容器启动的命令 ENTRYPOINT ["nginx"] // 检查容器健康,通过访问 Nginx 服务 80 端口,来判断容器服务是否运行正常。 HEALTHCHECK --interval=5s --timeout=3s \ CMD curl -fs http://localhost/ || exit 1
- 写好
dockerfile
后,则需要构建镜像(附:Docker build 命令详解)
# -f:指定要使用的 Dockerfile 路径 # -t:镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签 $ docker build -f /home/dockerfile -t centos_tomcat 或 # .:Dockerfile 路径为当前目录 $ docker build -t centos_tomcat .
- 有了镜像后,则需要创建容器(附:Docker 常用命令与指令参数)
$ docker run --name dzmtest -p 8080:80 centos_tomcat