一、Docker 概述
1. Docker 的诞生背景
随着计算机技术的飞速发展,软件开发人员面临着维护庞大的开发、测试和生产环境的难题。不同环境下的依赖差异、配置冲突等问题严重影响了开发和部署效率。Docker 容器技术应运而生,它提供了简单、灵活、高效的解决方案,无需大幅改变现有使用习惯,还能与 OpenStack 等工具良好配合,成为通往云计算的必经之路。
2. 什么是 Docker
Docker 是目前主流的容器技术,属于轻量级虚拟化技术。它可以将应用程序及其依赖项打包在一个独立单元中运行,实现应用的隔离、可移植性和资源的高效利用。
形象地说,容器就像一个独立的 “盒子”,里面装着运行某个应用所需的所有东西,包括代码、运行时环境、系统工具、系统库等。不同容器之间相互隔离,拥有独立的文件系统、进程空间和网络接口,就像在不同机器上运行一样,但实际上共享宿主机的操作系统内核。
3. Docker 的优势
- 启动速度快:容器启动和停止可在秒级实现,而传统虚拟机需要分钟级。
- 资源占用少:容器共享宿主机内核,只包含应用及其依赖项,基本不消耗额外系统资源,一台主机可同时运行数千个容器,而传统虚拟机因每个都有完整操作系统,资源占用大,单机只能运行几十个。
- 性能损耗小:容器直接运行在宿主机内核上,性能接近原生应用;虚拟机存在额外虚拟化层,性能损耗约 50%。
- 操作方便:通过 Dockerfile 配置文件支持灵活的自动化创建和部署。
- 隔离性:不同容器相互隔离,一个容器的故障或异常不影响其他容器,提高了应用的稳定性和安全性。
- 可移植性:容器将应用及其依赖项打包成独立单元,可在不同环境(开发、测试、生产)无缝迁移,避免 “在我的机器上能运行,在你的机器上不行” 的问题。
- 资源高效利用:共享宿主机操作系统内核,减少资源浪费,提高服务器利用率。
- 快速部署和扩展:启动速度快,可快速创建和销毁容器,便于应用的快速部署和弹性扩展。
4. Docker 与传统虚拟化技术的对比
特性 | Docker 容器 | 虚拟机 |
---|---|---|
启动速度 | 秒级 | 分钟级 |
计算能力损耗 | 几乎无 | 损耗 50% 左右 |
性能 | 接近原生 | 有较大损耗 |
系统支持量(单机) | 上千个 | 几十个 |
隔离性 | 资源限制 | 完全隔离 |
5. Docker 的应用场景
- 开发环境管理:开发人员使用容器创建一致的开发环境,确保团队成员环境一致,提高开发效率。
- 持续集成和持续部署(CI/CD):在 CI/CD 流程中,容器帮助实现应用的快速打包、测试和部署,实现自动化软件开发流程。
- 微服务架构:每个微服务可打包成独立容器,独立开发、测试和部署,提高系统的可伸缩性和容错性。
- 云计算:云服务提供商利用容器技术为用户提供更高效、灵活的计算资源,用户可根据需求快速创建和管理容器化应用。
6. Docker 核心概念
Docker 的三大核心概念是镜像、容器和仓库。
- 镜像:是创建容器的基础,类似虚拟机的快照,是面向 Docker 容器引擎的只读模板。例如,一个完整的 CentOS 操作系统环境可称为 CentOS 镜像,安装了 MySQL 的应用程序可称为 MySQL 镜像。用户可自己创建和更新镜像,也可从网上下载使用。
- 容器:是从镜像创建的运行实例,可启动、停止和删除。每个容器相互隔离、互不可见,是保证安全性的平台,可看作简易版 Linux 环境,用于运行和隔离应用。
- 仓库:是集中保存镜像的地方,创建镜像后可使用 push 命令上传到公有仓库或私有仓库。使用时从仓库获取。仓库注册服务器是存放仓库的地方,包含多个仓库,每个仓库集中存放某类镜像,用不同标签区分。目前最大的公共仓库是 Docker Hub。
二、Docker 安装(CentOS7 版)
1. 安装准备
Docker 支持 Windows、Linux、MacOS 等主流操作系统,目前最新的 RHEL、CentOS、Ubuntu 系统官方软件源默认自带 Docker 包,可直接安装,也可配置 Docker 自己的 YUM 源。需注意,Docker 只能支持 64 位系统。
2. 安装步骤(使用阿里软件仓库)
步骤 1:添加软件源信息
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
步骤 2:安装必要的系统工具
yum install -y yum-utils
步骤 3:安装 Docker-CE
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum clean all
yum makecache
yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
步骤 4:添加国内镜像站
由于工信部网络政策调整,docker.io、gcr.io 等国际镜像站访问受限,需设置国内镜像站:
mkdir /etc/docker/
cat >/etc/docker/daemon.json<<EOF
{
"exec-opts":["native.cgroupdriver=systemd"],
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://docker.imgdb.de",
"https://docker-0.unsee.tech",
"https://docker.hlmirror.com"
]
}
EOF
步骤 5:开启 Docker 服务
systemctl daemon-reload
systemctl restart docker
systemctl enable docker
docker version
步骤 6:优化内核参数
cat>>/etc/sysctl.conf<<EOF
net.ipv4.ip_forward=1
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
EOF
sysctl -P
三、Docker 镜像操作
1. 获取镜像
使用docker pull
命令从 Docker 镜像仓库(默认是 Docker Hub)拉取镜像到本地。
docker pull nginx
命令语法
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
参数说明
- -a, --all-tags:拉取指定仓库中的所有标签的镜像。
- --disable-content-trust:默认值为 true,禁用镜像内容验证,不验证镜像签名。
- NAME:要拉取的镜像名称,可包含仓库地址和命名空间信息。官方镜像直接写镜像名,如 nginx;用户或组织的镜像格式为用户名 / 镜像名,如 dockerlibrary/redis。
- TAG(可选):指定要拉取的镜像具体标签,区分同一镜像的不同版本,不指定默认拉取 latest 标签的镜像。
- DIGEST(可选):通过镜像摘要信息精确指定要拉取的镜像版本,格式如
sha256:abc123
。
2. 查看镜像信息
使用docker images
命令列出本地 Docker 主机上的镜像信息。
docker images
命令语法
docker images [OPTIONS] [REPOSITORY[:TAG]]
参数说明
- -a, --all:显示所有镜像(包括中间层镜像),默认只显示顶层镜像。
- --digests:显示镜像的摘要信息。
- -f, --filter filter:根据指定条件过滤输出结果,如
dangling=true
表示只显示虚悬镜像。 - --format string:使用 Go 模板语法自定义输出格式。
- --no-trunc:不截断输出信息,完整显示镜像 ID 等较长字段。
- -q, --quiet:只显示镜像的 ID。
- REPOSITORY [:TAG](可选):指定要显示的镜像仓库名称和标签,不指定标签默认显示所有标签的镜像。
3. 查看镜像的详细信息
使用docker inspect
命令返回 Docker 对象(如容器、镜像、网络、卷等)的底层详细信息,以 JSON 格式展示。
docker inspect c15
命令语法
docker inspect [OPTIONS] NAME | ID [NAME|ID...]
参数说明
- --format, -f:指定输出格式,使用 Go 模板语法。
- --size, -s:在输出中显示容器的文件系统大小(仅适用于容器)。
- NAME|ID:要检查的 Docker 对象的名称或 ID,可指定多个。
4. 修改镜像标签
使用docker tag
命令为现有 Docker 镜像添加新标签。
docker tag nginx nginx:v1
命令语法
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
参数说明
- SOURCE_IMAGE[:TAG]:指定源镜像的名称和标签,不指定标签默认使用 latest。
- TARGET_IMAGE[:TAG]:指定目标镜像的名称和标签,是为源镜像添加的新标签,不指定标签默认使用 latest。
5. 删除镜像
可使用镜像名或 ID 删除镜像。
# 用镜像名删除
docker rmi nginx:v1
# 用ID删除
docker rmi c15
命令语法
docker rmi [OPTIONS] IMAGE [IMAGE...]
参数说明
- -f, --force:强制删除镜像,即使有容器正在使用该镜像,不建议轻易使用,可能导致容器无法正常运行。
- IMAGE:指定要删除的镜像,可以是镜像的名称、标签、镜像 ID,可同时指定多个。
注意事项
- 删除镜像前,确保没有正在运行或已停止的容器依赖该镜像。可使用
docker ps -a
命令查看所有容器,停止并删除依赖容器后再删除镜像。 - 镜像删除是不可逆操作,删除后无法恢复,执行前要谨慎确认。
- 当镜像有多个标签时,删除一个标签只是移除该标签的引用,所有标签都删除后,镜像才会真正从磁盘删除。
6. 存出镜像和载入镜像
(1)导出镜像
使用docker save
命令将一个或多个 Docker 镜像保存为 tar 归档文件,用于在不同 Docker 环境传输镜像。
docker save -o nginx nginx:latest
注意事项
- 文件大小:保存的镜像文件可能很大,尤其是包含多个大型镜像时,保存和传输要确保有足够磁盘空间和网络带宽。
- 镜像版本:保存的是特定版本(标签)的镜像,恢复时要使用正确标签和版本。
- 跨平台兼容性:Docker 镜像是跨平台的,但在不同操作系统保存和加载可能遇到兼容性问题,尽量在相同或兼容操作系统版本间传输使用。
- 镜像依赖:若保存的镜像依赖其他基础镜像,确保目标环境有这些基础镜像,或一起保存传输。
(2)导入镜像
将存出的镜像文件导入到目标机器的镜像库。
docker load < nginx
四、Docker 容器操作
1. 容器的创建与启动
(1)创建容器
使用docker create
命令基于指定镜像创建新容器,但不立即启动。
docker create -it centos:7
命令语法
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
参数说明
- -i, --interactive:保持标准输入打开,即使没有附加到容器,常用于需要交互的应用程序。
- -t, --tty:分配伪终端,通常与 - i 一起使用,模拟交互式终端环境。
- -p, --publish list:将容器内端口映射到宿主机端口,格式为宿主机端口:容器端口,如
-p 8080:80
。 - -v, --volume list:挂载数据卷,将宿主机目录或文件挂载到容器内,格式为宿主机路径:容器路径,如
-v /host/data:/container/data
。 - --name string:为容器指定自定义名称,方便后续管理识别。
- -e, --env list:设置容器内环境变量,格式为变量名 = 变量值,如
-e DB_HOST=localhost
。 - --network string:指定容器要加入的网络。
- IMAGE:指定用于创建容器的镜像名称和标签。
- [COMMAND][ARG...](可选):指定容器启动时要执行的命令及其参数,不指定使用镜像的默认启动命令。
(2)查看所有容器
使用docker ps
命令列出 Docker 容器的相关信息。
docker ps -a
命令语法
docker ps [OPTIONS]
参数说明
- -a, --all:列出所有容器,包括正在运行和已停止的,默认仅显示正在运行的容器。
- -q, --quiet:只显示容器的 ID,用于脚本编写,方便批量操作容器。
- -s, --size:显示容器所占用的文件系统大小,包括读写层大小和总大小。
- -f, --filter filter:根据指定条件过滤输出结果,如
status=running
表示只显示正在运行的容器。 - --format string:使用 Go 模板语法自定义输出格式。
- -n, --last int:显示最近创建的 n 个容器(包括已停止的)。
- -l, --latest:只显示最近创建的容器(包括已停止的)。
(3)容器的运行
使用docker start
命令启动已创建但处于停止状态的容器。
docker start 5a
命令语法
docker start [OPTIONS] CONTAINER [CONTAINER...]
参数说明
- -a, --attach:将本地标准输入、输出和错误输出附加到启动的容器上,启动后进入容器交互界面,实时看到容器内程序输出,也可向容器内输入命令。
- -i, --interactive:保持容器的标准输入打开,允许与容器内的进程交互,通常和 - a 选项一起使用。
- --checkpoint string:指定从哪个检查点恢复容器。
- --checkpoint-dir string:指定检查点文件所在的目录。
- --detach-keys string:指定从附加模式退出的键序列,默认是
Ctrl-p Ctrl-q
。 - --publish-all, -P:发布容器内所有暴露的端口到宿主机上,宿主机端口随机分配。
- CONTAINER [CONTAINER...]:指定要启动的容器,可使用容器名称或 ID。
(4)利用容器执行命令
使用docker run
命令基于指定镜像创建并启动新容器,命令执行完毕后容器会退出。
docker run centos:7 /usr/bin/bash -c "ls /root"
命令语
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
参数说明
- -d, --detach:让容器在后台运行,返回容器 ID,适用于长时间运行的服务类容器。
- -i, --interactive:保持标准输入打开,允许与容器内的进程交互。
- -t, --tty:分配伪终端,通常与 - i 一起使用,模拟交互式终端环境,如
docker run -it
。 - --name string:为容器指定自定义名称。
- -m, --memory bytes:限制容器使用的内存大小,如
-m 512m
。 - --cpus decimal:限制容器使用的 CPU 资源,如
--cpus 0.5
。 - -p, --publish list:将容器内端口映射到宿主机端口。
- -P, --publish-all:发布容器内所有暴露的端口到宿主机,宿主机端口随机分配。
- -v, --volume list:挂载数据卷。
- -e, --env list:设置容器内环境变量。
- --network string:指定容器要加入的网络。
- IMAGE:指定用于创建容器的镜像名称和标签。
- [COMMAND][ARG...](可选):指定容器启动时要执行的命令及其参数,不指定使用镜像的默认启动命令。
(5)在启动容器时持续在后台运行
docker run -d centos:7 /usr/bin/bash -c "while true; do echo hello; done"
# 或
docker run -dit centos:7 /bin/bash
2. 容器的终止
使用docker stop
命令优雅地停止正在运行的 Docker 容器。
docker stop b18
命令语法
docker stop [OPTIONS] CONTAINER [CONTAINER...]
参数说明
-t, --time int:等待容器终止的时间(秒),默认 10 秒。
CONTAINER [CONTAINER...]:指定要停止的容器,可使用容器名称或 ID。
3. 进入容器
使用docker exec
命令在正在运行的容器内部执行额外命令,用于调试、维护或执行临时任务。
docker exec -it 03f /bin/bash
执行后进入容器内部,可像操作本地终端一样执行命令,退出容器使用exit
命令。
命令语法
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
参数说明
- -d, --detach:让命令在容器后台执行,不显示输出,返回命令在容器内的执行进程 ID。
- -i, --interactive:保持标准输入打开,允许与容器内执行的命令交互,用于需要输入信息的命令。
- -t, --tty:分配伪终端,模拟交互式终端环境,常与
-i
一起使用(docker exec -it
)。 - -u, --user string:指定在容器内执行命令的用户(用户名或用户 ID),如
--user root
。 - -w, --workdir string:指定命令在容器内的工作目录。
- CONTAINER:指定要执行命令的正在运行的容器(名称或 ID)。
- COMMAND [ARG...]:指定在容器内执行的命令及其参数。
注意事项
- 容器必须处于运行状态,停止状态的容器无法执行
docker exec
命令。 - 注意执行命令的用户权限,某些操作需要 root 权限,普通用户可能失败。
- 容器内环境(软件安装、环境变量等)可能与宿主机不同,执行命令前确保容器已安装所需软件且配置正确。
4. 容器导出
使用docker export
命令将运行中或已停止的 Docker 容器的文件系统内容导出为 tar 归档文件,用于容器迁移、备份或分析容器内容
docker export 03f > centos7
应用场景
- 迁移容器:将容器从一个 Docker 环境迁移到另一个环境时,导出容器文件系统,在目标环境导入使用。
- 备份容器:对容器当前状态进行备份,以便需要时恢复。
- 分析容器内容:导出后在宿主机查看和分析容器内的文件和目录结构。
注意事项
- 与 docker save 的区别:
docker save
操作对象是镜像,保存镜像的所有层信息、元数据、历史记录和构建信息;docker export
操作对象是容器,只保存容器当前的文件系统状态,不包含镜像历史和构建信息。docker save
保存的镜像可直接用docker load
加载,docker export
导出的文件需用docker import
导入,且导入后生成的新镜像没有历史记录。 - 容器状态:无论容器运行中还是已停止,都可导出,但导出运行中的容器时,容器内文件可能正在被修改,导出的文件系统状态可能不是一致的快照。
- 文件大小:导出的 tar 文件可能较大,尤其是包含大量文件的容器,导出和存储时确保有足够磁盘空间。
- 权限问题:导出的文件系统中的文件权限可能受宿主机和容器之间权限映射影响,导入新环境后需检查权限是否符合预期。
5. 容器导入生成镜像
使用docker import
命令将导出的容器文件系统导入并生成新镜像。
docker import centos7 centos7:test
导入后可使用docker images
命令查看新生成的镜像。
6. 容器删除
使用docker rm
命令删除容器。
docker rm 7f
命令语法
docker rm [OPTIONS] CONTAINER [CONTAINER...]
参数说明
- -f, --force:强制删除正在运行的容器,默认只能删除已停止的容器。添加该选项后,会向容器内的主进程发送 SIGKILL 信号,直接终止容器并删除,但可能导致数据丢失或应用异常。
- -l, --link:仅删除容器的网络连接,不删除容器本身,用于清理容器与网络的关联。
- -v, --volumes:删除容器的同时,删除与该容器关联的数据卷。若数据卷中存储重要数据,使用需谨慎。
- CONTAINER [CONTAINER...]:指定要删除的容器(名称或 ID),支持同时指定多个。
使用场景
- 资源清理:容器不再使用时,及时删除以释放磁盘空间、内存和网络端口等系统资源。
- 环境重置:在开发或测试环境中,频繁创建和删除容器以重置环境、测试不同配置或重新部署应用。
- 故障排除:容器出现无法恢复的故障时,删除并重新创建可能是解决问题的有效方法。
注意事项
- 容器状态:默认只能删除已停止的容器,删除正在运行的容器需使用
-f
选项,但可能导致数据丢失或应用异常,尽量先使用docker stop
正常停止容器后再删除。 - 数据卷处理:使用
-v
选项删除容器关联的数据卷时要谨慎,确保数据不再需要,否则可能造成数据丢失。 - 依赖关系:删除容器前,考虑容器之间的依赖关系,若一个容器依赖另一个容器提供的服务,先删除被依赖容器可能导致依赖容器出现问题。
- 不可逆操作:容器删除后无法直接恢复,执行前确认容器确实不再需要。
7. 删除所有容器
若需删除所有容器,可结合docker ps -a -q
命令获取所有容器 ID,再批量删除:
docker rm -f $(docker ps -a -q)
执行前务必确认所有容器均不再需要,避免数据丢失。
五、Docker 数据卷管理
1. 数据卷的概念
数据卷是 Docker 中用于持久化存储数据的机制,它可以将容器内的数据映射到宿主机或其他位置,实现数据的持久化和共享。数据卷的主要特点包括:
持久化存储:即使容器被删除,数据卷中的数据仍然保留在宿主机上,确保数据不会因容器生命周期结束而丢失。
数据共享:多个容器可以挂载同一个数据卷,实现数据的共享和交换。
独立于容器:数据卷的生命周期独立于容器,可在容器创建、运行、删除等操作中保持数据的稳定性。
2. 数据卷的创建与挂载
(1)创建数据卷
使用docker volume create
命令创建数据卷:
docker volume create my_volume
(2)查看数据卷
使用docker volume ls
命令查看所有数据卷:
docker volume ls
使用docker volume inspect my_volume
命令查看指定数据卷的详细信息。
(3)在容器中挂载数据卷
在创建或运行容器时,使用-v
或--volume
参数挂载数据卷:
docker run -d -v my_volume:/container/data nginx
上述命令将名为my_volume
的数据卷挂载到容器的/container/data
目录。
也可挂载宿主机的目录到容器:
docker run -d -v /host/data:/container/data nginx
将宿主机的/host/data
目录挂载到容器的/container/data
目录。
3. 数据卷的使用场景
- 持久化应用数据:如数据库容器的数据存储,确保数据库数据在容器重启或删除后不丢失。
- 共享配置文件:多个容器共享相同的配置文件,只需修改宿主机或数据卷中的配置文件,所有挂载该数据卷的容器都会应用新配置。
- 代码部署:将开发代码挂载到容器中,实现代码的实时更新,无需重新构建镜像。
- 日志存储:将容器的日志文件挂载到宿主机,方便集中管理和查看日志。
4. 数据卷的注意事项
- 权限问题:挂载宿主机目录到容器时,需注意宿主机目录和容器内目录的权限匹配,避免因权限不足导致容器无法访问数据。
- 数据一致性:多个容器同时读写同一个数据卷时,需注意数据的一致性问题,避免出现数据冲突。
- 数据备份:虽然数据卷实现了数据的持久化,但仍需定期对重要数据进行备份,防止宿主机故障导致数据丢失。
- 卷驱动:Docker 支持多种卷驱动(如 local、nfs、glusterfs 等),可根据不同的应用场景选择合适的卷驱动,实现更复杂的数据存储需求。
六、本章总结
1. Docker 核心内容回顾
本章全面介绍了 Docker 容器技术的基础知识,首先阐述了 Docker 的诞生背景和基本概念,它为复杂的开发、测试和生产环境提供了简单、灵活、高效的解决方案。通过将应用及其依赖项打包成容器,实现了应用的隔离、可移植性和资源的高效利用。
详细讲解了 Docker 的三大核心概念:
- 镜像:作为创建容器的基础,是只读的模板,可从仓库获取或自行创建。
- 容器:是镜像的运行实例,具有轻量级、启动快、隔离性等特点。
- 仓库:用于集中存储镜像,包括公有仓库和私有仓库,Docker Hub 是目前最大的公共仓库。
2. 操作技能梳理
在 Docker 环境部署方面,以 CentOS7 为例,详细介绍了使用阿里软件仓库安装 Docker 的步骤,包括添加软件源、安装必要工具、配置国内镜像站、开启服务和优化内核参数等,确保 Docker 在 CentOS7 系统上的顺利安装和运行。
围绕镜像和容器的操作是本章的重点内容:
镜像操作:涵盖了获取、查看、修改标签、删除、存出和载入等操作,掌握这些操作可灵活管理本地镜像资源。
容器操作:包括创建、启动、运行、终止、进入、导出、导入生成镜像和删除等,通过这些操作可实现对容器生命周期的全面管理。