主要内容:
容器的镜像编排,commit简单镜像创建,Dockerfile制作服务镜像(语法、创建镜像)、创建复杂镜像(Docker微服务架构、示例:NGINX+PHP)、私有仓库
一、简单镜像创建
1、自定义镜像原理
① 镜像采用分层设计
Docker镜像采用分层设计,每一层都是一个只读的文件系统层。这些层可以被多个镜像共享,从而节省存储空间并提高镜像的构建效率。每一层都代表了对文件系统的增量修改。
② 创建读写层
当您启动一个容器时,Docker会在镜像的最上层添加一个读写层。这个读写层允许您在容器中进行修改,而不会影响底层的只读层。
③ 修改配置
在容器中,您可以进行各种自定义修改,例如安装软件包、修改配置文件、添加或删除文件等。这些修改都会记录在读写层中。
④ 重新打包(commit)
当您完成自定义修改后,可以使用 docker commit 命令将当前容器的读写层和底层的只读层打包成一个新的镜像。这个新镜像包含了您所做的所有修改。
2、使用Commit创建镜像
原理:使用 docker commit 命令可以将一个正在运行的容器的状态保存为一个新的镜像。这个过程包括将容器的读写层和底层的只读层打包成一个新的镜像层。
格式:docker commit 容器id 新镜像名称:标签
容器ID:您要提交的容器的ID。
新镜像名称:您要创建的新镜像的名称。
标签:新镜像的标签,通常用于版本控制。
例如:假设有一个正在运行的容器,其ID为 abcd1234,您希望将其保存为一个新的镜像,名称为 my-custom-image,标签为 v1.0。您可以使用以下命令:
docker commit abcd1234 my-custom-image:v1.0
示例:通过Commit创建(打包)自定义镜像
① 使用centos镜像启动容器
[root@docker-0001 ~]# docker run -it centos:latest
② 自定义修改:配置Yum源(华为云YUM源),安装软件
[root@6f239a4d0fc3 /]# rm -f /etc/yum.repos.d/*.repo
[root@6f239a4d0fc3 /]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.myhuaweicloud.com/repo/CentOS-Base-7.repo
[root@6f239a4d0fc3 /]# yum install -y net-tools vim-enhanced tree bash-completion iproute psmisc && yum clean all
[root@6f239a4d0fc3 /]# exit
exit
③ 创建自定义镜像(对容器进行打包制作新镜像)
[root@docker-0001 ~]# docker commit 6f239a4d0fc3 myos:latest
sha256:8ee6a9acdcd19ed70e78d74ead608fde5a4bdb12faa147f6fd3acd257179fb76
④ 验证镜像
[root@docker-0001 ~]# docker images
[root@docker-0001 ~]# docker run -it myos:latest //基于新镜像运行容器
[root@183f4b606ff2 /]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
[root@docker-0001 ~]# docker history myos:latest //查看容器制作历史
补充:打包完成新镜像后,可将制作镜像的容器删除,以及基于的centos镜像删除,都不会影响现有的新镜像;
[root@docker-0001 ~]# docker rm 6f239a4d0fc3
6f239a4d0fc3
[root@docker-0001 ~]# docker rmi centos:latest
Untagged: centos:latest
二、Dockerfile概述
Dockerfile 是一个文本文件,包含了一系列指令,用于定义如何构建 Docker 镜像。每个指令都会在镜像中创建一个新的层,从而实现分层构建。
1、docker commit 的局限性
虽然 docker commit 命令可以快速创建自定义镜像,但它有一些明显的局限性:
- 难以管理复杂配置:对于复杂的镜像,例如需要设置默认的启动命令、环境变量、开放特定端口等,docker commit 很难满足需求。
- 缺乏版本控制:使用 docker commit 创建的镜像缺乏版本控制,难以追踪和管理不同版本的镜像。
- 不可重复性:每次使用 docker commit 创建的镜像都是基于当前容器的快照,难以保证每次构建的结果一致。
2、Dockerfile 的优势
Dockerfile 是一种更强大、更灵活的镜像制作方式,它允许您通过编写类似脚本的文件来定义镜像的构建过程。以下是 Dockerfile 的主要优势:
- 可重复性:Dockerfile 允许您定义镜像的构建步骤,确保每次构建的结果一致。
- 版本控制:Dockerfile 可以与版本控制系统(如 Git)结合使用,方便追踪和管理不同版本的镜像。
- 复杂配置管理:Dockerfile 支持设置默认的启动命令、环境变量、开放端口等复杂配置,使得镜像的构建更加灵活和可控。
- 依赖管理:Dockerfile 可以明确指定镜像的依赖关系,确保构建过程中所需的软件包和库都能正确安装。
- 自动化构建:Dockerfile 可以与 CI/CD 工具集成,实现自动化构建和部署。
3、Dockerfile 的基本结构
1)FROM
指定构建镜像的基础镜像:所有 Dockerfile 都必须以 FROM 指令开始。
FROM ubuntu:20.04
2)LABEL
指定镜像的维护者信息:添加元数据,如维护者信息、版本号等。
LABEL maintainer="[email protected]"
3)ENV
设置环境变量:
ENV MY_VAR="my-value"
4)WORKDIR
指定工作目录:后续的 RUN、CMD、ENTRYPOINT、COPY 和 ADD 指令都会在该目录下执行。
WORKDIR /app
5)COPY
将本地文件拷贝到镜像中:
COPY . /app
6)RUN
安装所需的软件包:在镜像中执行命令。每个 RUN 指令都会创建一个新的层。
RUN apt-get update && apt-get install -y \
package1 \
package2
7)EXPOSE
指定镜像需要暴露的端口:
EXPOSE 8080
8)CMD
设置默认的启动命令:一个 Dockerfile 中只能有一个 CMD 指令。
CMD ["python", "app.py"]
9)ADD
类似于 COPY,但支持从 URL 下载文件并解压缩 tar 文件。
ADD https://example.com/file.tar.gz /app/
10)ENTRYPOINT
设置容器启动时执行的命令,通常用于设置可执行文件。CMD
可以作为参数传递给 ENTRYPOINT
。
ENTRYPOINT ["python"]
CMD ["app.py"]
11)VOLUME
创建一个挂载点,用于持久化数据。
VOLUME /data
12)USER
设置运行后续指令的用户。
USER myuser
13)ARG
定义构建时传递的参数。
ARG MY_ARG="default-value"
14)ONBUILD
设置当该镜像被用作基础镜像时,自动执行的指令。
ONBUILD COPY . /app
4、使用 Dockerfile 构建镜像
工作流程:
① 创建目录(例如:mkdir mybuild);
② 在目录中编写Dockfile文件;
③ 生成镜像;
在编写好 Dockerfile 后,可以使用 docker build 命令来构建镜像:
- 格式:docker build -t 镜像名称:标签 Dockerfile所在目录
docker build -t my-custom-image:v1.0 .
- -t 参数用于指定新镜像的名称和标签。
- . 表示 Dockerfile 所在的当前目录。
- CMD指令 可以查看 service 文件的启动命令 ExecStart(/lib/systemd/system/httpd.service)
- ENV 环境变量查询服务文件中的环境变量配置文件 EnvironmentFile 指定的文件内容
示例:通过Dockerfile制作apache+php服务镜像
# 提前拷贝webhome.tar.gz到192.168.1.31(参考:/web_install/files/webhome.tar.gz)
[root@ecs-proxy ~]# scp /root/other/web_install/files/webhome.tar.gz 192.168.1.31:/root
① 创建并切换apache目录
[root@docker-0001 ~]# mkdir apache
[root@docker-0001 ~]# cp webhome.tar.gz /root/apache/ //需放到同Dockerfile相同目录
[root@docker-0001 ~]# cd apache
② 编写Dockerfile文件
[root@docker-0001 apache]# vim Dockerfile
FROM myos:latest //指定基础镜像myos:latest
RUN yum install -y httpd php //执行命令:安装Apache、php服务
ENV LANG=C //设置环境变量
ADD webhome.tar.gz /var/www/html/ //ADD复制压缩包到镜像并自动解压
WORKDIR /var/www/html/ //指定工作目录
EXPOSE 80 //声明开放的端口
CMD ["/usr/sbin/httpd", "-DFOREGROUND"] //容器启动命令(参考service文件)
③ 使用docker build对Dockerfile内容生成镜像
[root@docker-0001 apache]# docker build -t myos:httpd . //【.】为Dockerfile所在目录
…
Successfully built 5adb6e780c95
Successfully tagged myos:httpd
④ 查看镜像,并基于myos: httpd镜像,启动容器并验证服务
[root@docker-0001 apache]# docker images
[root@docker-0001 ~]# docker run -itd myos:httpd //启动容器并放入后台运行
73985edea