一、 Docker 概述
目录
1. Docker 是什么
Docker 是一个开源的容器化平台,允许开发者将应用程序及其依赖环境打包成一个标准化的容器(Container),从而实现 “一次构建,到处运行” 的目标。与传统虚拟机(VM)相比,Docker 容器更轻量级、启动更快,且能在不同环境中保持一致性。
2. Docker 的核心概念
镜像(Image)
- 只读的模板文件,包含运行应用所需的代码、依赖库、系统工具和配置等。
- 类似 “应用安装包”,可通过 Docker Hub 等仓库共享和分发。
- 示例:
nginx:latest
是 Nginx 服务器的官方镜像。
容器(Container)
- 镜像的运行实例,可看作 “正在运行的应用”。
- 容器之间相互隔离,共享宿主机内核,因此资源占用极低。
- 支持启动、停止、删除等操作,可随时创建或销毁。
仓库(Repository)
- 存储镜像的远程或本地仓库,分为公共仓库(如 Docker Hub)和私有仓库。
- 开发者可将镜像推送到仓库,或从仓库拉取镜像使用。
3. Docker 的优势
优势 | 说明 |
环境一致性 | 容器封装了应用的所有依赖,避免 “在我电脑上能运行” 的环境问题。 |
资源利用率高 | 无需虚拟硬件和完整操作系统,内存占用仅为 VM 的 1/10,适合高密度部署。 |
部署速度快 | 容器启动时间以秒计算,支持快速迭代和弹性扩展。 |
微服务架构适配 | 每个服务可独立打包为容器,便于服务拆分、部署和管理。 |
易于集成 CI/CD | 与 Jenkins、GitLab 等工具集成,实现自动化构建、测试和部署。 |
4. Docker 的核心技术
Linux 容器技术(LXC)
- 利用 Linux 内核的 Namespace(命名空间)和 Cgroups(资源控制组)实现进程隔离和资源限制。
UnionFS(联合文件系统)
- 镜像采用分层存储,多个容器可共享底层镜像层,减少磁盘占用。
Docker Engine
- Docker 的运行引擎,包含客户端(CLI)、守护进程(Daemon)和运行时(Runtime)。
5. Docker 与虚拟机的对比
维度 | Docker 容器 | 虚拟机(VM) |
隔离级别 | 进程级隔离(共享宿主机内核) | 操作系统级隔离(独立内核) |
资源占用 | 低(MB 级) | 高(GB 级) |
启动时间 | 秒级 | 分钟级 |
镜像大小 | 小(通常几十 MB 到几百 MB) | 大(GB 级) |
应用场景 | 微服务、轻量级应用 | 完整操作系统、多租户环境 |
二、Docker 安装
1. 关闭防火墙
systemctl stop firewalld systemctl disable firewalld setenforce 0 sed -i 's/=enforcing/=disabled/' /etc/selinux/config
2. 下载 Docker 的 repo 文件
在阿里的开源镜像站找到Docker 然后下载
3. 替换仓库地址
sed -i 's/$releasever/8/g' /etc/yum.repos.d/docker-ce.repo sed -i 's/$basearch/x86_64/g' /etc/yum.repos.d/docker-ce.repo
4. 更新索引并安装 Docker
dnf clean all dnf makecache dnf -y install docker-ce
5. 添加国内镜像站
mkdir /etc/docker cd /etc/docker vim daemon.json { "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" ] }
6. 开启 Docker 服务
systemctl deamon-reload systemctl restart docker systemctl enable docker docker version
7. 优化内核参数
vim /etc/sysctl/conf net.ipv4.ip_forward=1 net.bridge.bridge-nf-call-ip6tables=1 net.bridge.bridge-nf-call-iptables=1
三、 Docker 镜像操作
1. 获取镜像
[root@localhost ~]# docker pull nginx:1.24.0
docker pull 是 Docker 里的一个关键命令,其主要功能是从 Docker 镜像仓库(默认是 Docker Hub)中拉取镜像到本地 Docker 主机
命令语法:docker pull [OPTIONS] NAME [:TAG@DIGEST]
参数说明:
- OPTIONS(可选参数)
- -a, --all-tags:拉取指定仓库中的所有标签的镜像。
- --disable-content-trust:默认为 true,该选项用于禁用镜像内容验证,也就是不验证镜像的签名。
- NAME[:TAG@DIGEST]
- NAME:这是要拉取的镜像的名称,它可以包含仓库地址和命名空间信息。例如,在 Docker Hub 上的镜像,如果是官方镜像,通常直接写镜像名,如 nginx;如果是用户或组织的镜像,则格式为 用户名 / 镜像名,像 dockerlibrary/redis 。
- TAG(可选):指定要拉取的镜像的具体标签,用于区分同一镜像的不同版本。若不指定标签,默认会拉取 latest 标签的镜像。
- DIGEST(可选):通过镜像的摘要信息来精确指定要拉取的镜像版本,这能确保拉取的是特定哈希值对应的精确镜像,避免因标签可能指向不同版本而产生混淆。格式如 nginx@sha256:abcdef123456... 。
对于 Docker 镜像来说,如果下载镜像时不指定标签,则默认会下载仓库中最新版本的镜像,即选择标签为 latest 标签,也可通过指定的标签来下载特定版本的某一镜像。这里标签(tag)就是用来区分镜像版本的。
从整个下载的过程可以看出,镜像文件是由若干层(Layer)组成,称之为 AUFS(联合文件系统),是实现增量保存与更新的基础,下载过程中会输出镜像的各层信息。镜像下载到本地之后就可以随时使用该镜像了。用户也可以选择从其他注册服务器仓库下载,这时需要在仓库名称前指定完整的仓库注册服务器地址。
2. 查看镜像信息
[root@localhost ~]# docker images
docker images 是 Docker 中一个基础且常用的命令,主要用于列出本地 Docker 主机上的镜像信息。docker images 命令会列出本地 Docker 主机上所有可用的镜像,展示镜像的基本信息,帮助用户了解本地镜像的存储情况,包括镜像的仓库名、标签、镜像 ID、创建时间和大小等。
从显示的情况可以读出以下信息:
- REPOSITORY:镜像属于的仓库;
- TAG:镜像的标签信息,标记同一个仓库中的不同镜像;
- IMAGE ID:镜像的唯一 ID 号,唯一标识一个镜像;
- CREATED:镜像创建时间;
- VIRTUAL SIZE:镜像大小;
命令语法:docker images [OPTIONS] [REPOSITORY [:TAG]]
参数说明:- OPTIONS(可选参数)
- -a, --all:显示所有镜像(包括中间层镜像)。默认情况下,docker images 只显示顶层镜像。
- --digests:显示镜像的摘要信息。
- -f, --filter filter:根据指定的条件过滤输出结果,过滤条件可以是多种类型,例如 dangling=true 表示只显示虚悬镜像(没有标签的镜像)。
- --format string:使用 Go 模板语法自定义输出格式。
- --no-trunc:不截断输出信息,完整显示镜像 ID 等较长的字段。
- -q, --quiet:只显示镜像的 ID。
- REPOSITORY [:TAG](可选)
- REPOSITORY:指定要显示的镜像仓库名称。
- TAG:指定要显示的镜像标签。如果不指定标签,默认显示所有标签的镜像。
3. 查看镜像的详细信息
[root@localhost ~]# docker inspect c15
docker inspect 是 Docker 中一个非常实用的命令,它用于返回 Docker 对象(如容器、镜像、网络、卷等)的底层详细信息,这些信息以 JSON 格式展示,方便用户深入了解 Docker 对象的配置和状态。
命令语法:docker inspect [OPTIONS] NAME|ID [NAME|ID...]
参数说明:
- OPTIONS:可选参数,用于指定输出格式或过滤特定信息,常见的选项有:
- --format, -f:指定输出格式,使用 Go 模板语法。
- --size, -s:在输出中显示容器的文件系统大小(仅适用于容器)。
- NAME|ID:要检查的 Docker 对象的名称或 ID,可以指定多个对象。
可检查的 Docker 对象
docker inspect 可以检查多种 Docker 对象,常见的包括:- 容器(Container):获取容器的详细信息,如运行状态、网络配置、挂载点等。
- 镜像(Image):查看镜像的构建历史、层信息、环境变量等。
- 网络(Network):了解网络的配置,如驱动类型、子网信息等。
- 卷(Volume):获取卷的详细信息,如挂载路径、驱动类型等。
4. 修改镜像标签
[root@localhost ~]# docker tag nginx:1.24.0 nginx:v1
在 Docker 中,docker tag 命令用于为现有的 Docker 镜像添加一个新的标签(tag)。标签本质上是镜像的一个别名,它可以让你更方便地引用和管理镜像,同时也有助于区分不同版本或用途的镜像。
命令语法:docker tag SOURCE_IMAGE [:TAG] TARGET_IMAGE [:TAG]
参数说明:
- SOURCE_IMAGE [:TAG]:指定源镜像的名称和标签. SOURCE_IMAGE 是源镜像的名称,[:TAG] 是可选的标签,如果不指定标签,默认使用 latest。
- TARGET_IMAGE [:TAG]:指定目标镜像的名称和标签。这是你要为源镜像添加的新标签。同样,TARGET_IMAGE 是目标镜像的名称,[:TAG] 是可选的标签,如果不指定标签,默认使用 latest。
docker tag 命令并不会创建一个新的镜像,它只是为现有的镜像添加一个额外的标签。多个标签可以指向同一个镜像,这些标签只是镜像的不同引用方式。
5. 删除镜像
(1)用镜像名删除
[root@localhost ~]# docker rmi nginx:v1
(2)用 ID 删除
[root@localhost ~]# docker rmi c15
命令语法:docker rmi [OPTIONS] IMAGE [IMAGE...]
参数说明:
- OPTIONS(可选参数)
- -f, --force:强制删除镜像。即使有容器正在使用该镜像,也会尝试删除,但不建议轻易使用,因为可能导致容器无法正常运行。
- --no-prune:默认情况下,删除镜像时会同时删除该镜像相关的未使用的父镜像层(虚悬镜像),使用该选项可以禁止删除这些父镜像层。
- IMAGE
- 指定要删除的镜像,可以是镜像的名称、标签、镜像 ID,也可以同时指定多个镜像。例如:nginx:latest、123456789abc 等。
注意事项:- 在删除镜像之前,要确保没有正在运行或已停止的容器依赖该镜像。可以使用 docker ps -a 命令查看所有容器,使用 docker stop 和 docker rm 命令停止并删除依赖该镜像的容器后,再删除镜像。
- 镜像的删除是不可逆的操作,删除后无法恢复,所以在执行删除操作前要谨慎确认。
- 当删除一个有多个标签的镜像时,删除一个标签只是移除该标签的引用,只有当所有标签都被删除后,镜像才会真正从磁盘上删除。
可以使用 docker rmi 命令删除多余的镜像。删除镜像的操作有两种方法:使用镜像的标签删除镜像;使用镜像的 ID 删除镜像。
当一个镜像有多个标签的时候,docker rmi 命令只是删除镜像多个标签中的指定标签,不会影响镜像文件,相当于只删除了镜像 a0760f339193 的一个标签而已。但当该镜像只剩下一个标签的时候,再使用删除命令就会彻底删除该镜像。
当使用 docker rmi 命令后面指定了某个镜像 ID 时,必须确保该镜像当前没有被任一容器使用才能进行。删除时系统会先删除掉所有指向该镜像的所有标签,然后删除该镜像文件本身。如果该镜像已经被容器使用,正确的做法是先删除依赖该镜像的所有容器,再去删除镜像。
6. 存出镜像和载入镜像
(1)导出
[root@localhost ~]# docker save -o nginx nginx:1.24.0
docker save 命令用于将一个或多个 Docker 镜像保存为一个 tar 归档文件,这在需要将镜像传输到其他 Docker 环境(如离线环境)时非常有用。
docker save 命令的主要作用是将本地 Docker 主机上的一个或多个镜像打包成一个 tar 文件,方便在不同的 Docker 环境之间传输和共享镜像。这个过程只是将镜像的文件系统层和元数据保存下来,并不包含镜像的历史记录和构建信息。
注意事项:
- 文件大小:保存的镜像文件可能会非常大,尤其是包含多个大型镜像时。在保存和传输这些文件时,要确保有足够的磁盘空间和网络带宽。
- 镜像版本:保存的镜像文件中包含的是特定版本(标签)的镜像。在恢复镜像时,要确保使用正确的标签和版本。
- 跨平台兼容性:虽然 Docker 镜像是设计为跨平台的,但在不同的操作系统上保存和加载镜像时,可能会遇到一些兼容性问题。尽量在相同或兼容的操作系统版本之间传输和使用镜像。
- 镜像依赖:如果保存的镜像依赖于其他基础镜像,确保在目标环境中也有这些基础镜像,或者将它们一起保存和传输。
(2)导入
[root@localhost ~]# docker load<nginx
当需要把一台机器上的镜像迁移到另一台机器上的时候,需要将镜像保存成为本地文件,这一过程叫做存出镜像,可以使用 docker save 命令进行存出操作,之后就可以拷贝该文件到其他机器。将存出的镜像从机器 A 拷贝到机器 B 后,需要在机器 B 上使用该镜像,就可以将该文件导入到机器 B 的镜像库中,这一过程叫做载入镜像。使用 docker load 或者 docker --input 进行载入操作。
四、Docker 容器操作
1. 容器的创建与启动
(1) 创建容器
[root@localhost ~]# docker create -it centos:7
docker create 是 Docker 中的一个重要命令,它的主要作用是基于指定的镜像创建一个新的容器,但并不立即启动该容器。
命令语法:docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
参数说明:
- OPTIONS(可选参数):docker create 支持众多可选参数,这些参数可以帮助你对创建的容器进行各种配置,以下是一些常用的参数:
- -i, --interactive:保持标准输入打开,即使没有附加到容器上,常用于需要交互的应用程序。
- -t, --tty:分配一个伪终端,通常与 -i 一起使用,模拟一个交互式的终端环境,如 docker create -it。
- -p, --publish list:将容器内的端口映射到宿主机的端口,格式为 宿主机端口:容器端口,例如 -p 8080:80 表示将容器的 80 端口映射到宿主机的 8080 端口。
- -v, --volume list:挂载数据卷,将宿主机的目录或文件挂载到容器内,格式为 宿主机路径:容器路径,例如 -v /host/data:/container/data。
- --name string:为创建的容器指定一个自定义的名称,方便后续管理和识别。
- -e, --env list:设置容器内的环境变量,格式为 变量名 = 变量值,例如 -e DB_HOST=localhost。
- --network string:指定容器要加入的网络,例如 --network my_network。
- IMAGE:指定用于创建容器的镜像名称和标签,如 nginx:latest。如果本地没有该镜像,Docker 会尝试从 Docker Hub 等镜像仓库中拉取。
- [COMMAND] [ARG...](可选):指定容器启动时要执行的命令及其参数。如果不指定,将使用镜像的默认启动命令。
(2) 查看所以的容器
[root@localhost ~]# docker ps -a
docker ps 是 Docker 中一个非常基础且常用的命令,主要用于列出 Docker 容器的相关信息。通过该命令,用户可以查看容器的运行状态、ID、名称、所使用的镜像等关键内容,方便对容器进行管理和监控。
命令语法:docker ps [OPTIONS]
参数说明:
- -a, --all:列出所有容器,包括正在运行的和已经停止的容器。默认情况下,docker ps 仅显示正在运行的容器。
- -q, --quiet:只显示容器的 ID,不显示其他详细信息。该参数常用于脚本编写,方便批量操作容器,比如批量停止或删除容器。
- -s, --size:在输出中显示容器所占用的文件系统大小,包括读写层大小和总大小。
- -f, --filter filter:根据指定的条件过滤输出结果。过滤条件可以有多种,例如 status=running 表示只显示正在运行的容器;name=my_container 表示只显示名称为 my_container 的容器。
- --format string:使用 Go 模板语法自定义输出格式,用户可以根据自己的需求灵活定制输出内容和样式。
- -n, --last int:显示最近创建的 n 个容器(包括已停止的)。例如,docker ps -n 3 会显示最近创建的 3 个容器信息。
- -l, --latest:只显示最近创建的容器(包括已停止的)。
(3) 容器的运行
[root@localhost ~]# docker start 5a
docker start 是 Docker 中用于启动已创建但处于停止状态容器的命令。docker start 命令的主要作用是将之前使用 docker create 创建好但处于停止状态的容器,或者之前已经停止运行的容器重新启动起来。它会重新初始化容器的运行环境,加载相关资源,让容器内的进程继续执行。
命令语法:docker start [OPTIONS] CONTAINER [CONTAINER...]
参数说明:
- -a, --attach:将本地标准输入、输出和错误输出附加到启动的容器上,即启动容器后进入容器的交互界面,能实时看到容器内程序的输出信息,也可以向容器内输入命令。
- -i, --interactive:保持容器的标准输入打开,允许你与容器内的进程进行交互。通常和 -a 选项一起使用,以实现交互式操作。
- --checkpoint string:指定从哪个检查点恢复容器。检查点功能允许你保存容器的当前状态,之后可以从该状态恢复容器的运行。
- --checkpoint-dir string:指定检查点文件所在的目录。
(4) 在启动容器时持续在后台运行
[root@localhost ~]# docker run -d centos:7 /usr/bin/bash -c "while true;do echo hello;done" 或 [root@localhost ~]# docker run -dit centos:7 /bin/bash
注意事项:
- 容器退出问题:若容器内的主进程退出,容器也会随之停止运行。例如,若在容器内运行的脚本执行完毕后没有其他持续运行的进程,容器就会停止。因此,要确保容器内有持续运行的服务或进程。
- 日志查看:由于容器在后台运行,无法直接看到其输出信息。可以使用 docker logs 命令查看容器的日志,例如 docker logs <容器 ID 或名称>,以此来排查容器运行过程中出现的问题。
- 资源占用:在后台运行的容器会持续占用系统资源(如 CPU、内存等),要注意监控容器的资源使用情况,避免资源过度占用影响系统性能。可以使用 docker stats 命令查看容器的资源使用统计信息。
2. 容器的终止
[root@localhost ~]# docker stop b18
执行该命令后,Docker 会向 my_nginx 容器内的主进程发送 SIGTERM 信号,等待 10 秒(默认时间),如果进程没有自行终止,再发送 SIGKILL 信号强制终止。
docker stop 命令用于优雅地停止一个或多个正在运行的 Docker 容器。docker stop 命令的主要作用是向正在运行的容器内的主进程发送终止信号,让容器内的应用程序有机会正常关闭和清理资源,而不是像 docker kill 那样直接强制终止容器。这有助于避免数据丢失或损坏,保证应用程序的正常关闭流程。
如果希望在停止容器时等待 20 秒,再进行强制终止,可以使用 -t 选项
注意事项:
- 容器响应情况:有些容器内的应用程序可能无法正确处理 SIGTERM 信号,导致无法在指定时间内正常关闭。在这种情况下,Docker 会在等待时间结束后发送 SIGKILL 信号强制终止容器,可能会造成数据丢失。
- 依赖关系:在停止容器时,要考虑容器之间的依赖关系。如果一个容器依赖于另一个容器提供的服务,先停止被依赖的容器可能会导致依赖容器出现问题。
- 停止状态检查:可以使用 docker ps 命令检查容器是否已经成功停止。停止的容器不会再出现在 docker ps 的输出中,但可以使用 docker ps -a 查看所有容器(包括已停止的)。
2. 进入容器
[root@localhost ~]# docker exec -it 03f /bin/bash 退出 [root@03f20628515c /]# exit
docker exec 命令是 Docker 中一个非常实用的工具,它允许你在一个正在运行的容器内部执行额外的命令。docker exec 命令的主要作用是在不停止容器运行的情况下,对正在运行的容器进行调试、维护或执行一些临时任务。通过该命令,你可以在容器内部执行各种操作,就像直接登录到容器内部的操作系统一样。
命令语法:docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
参数说明:
- OPTIONS(可选参数):
- -d, --detach:让命令在容器后台执行,不将命令的输出信息显示在当前终端。执行后会返回命令在容器内的执行进程 ID。
- -i, --interactive:保持标准输入打开,允许你与容器内执行的命令进行交互,通常用于需要输入信息的命令。
- -t, --tty:分配一个伪终端,模拟一个交互式的终端环境,一般和 -i 一起使用,即 docker exec -it,这样可以让你像在本地终端一样与容器内的命令进行交互。
- -u, --user string:指定在容器内执行命令的用户,可以是用户名或用户 ID,例如 --user root 表示以 root 用户身份执行命令。
- -w, --workdir string:指定命令在容器内的工作目录,即命令执行时的当前目录。
- CONTAINER:指定要在哪个正在运行的容器中执行命令,可以使用容器的名称或者 ID。
- COMMAND [ARG...]:指定要在容器内执行的命令及其参数。例如,执行 ls 命令查看容器内的文件列表,或者执行 bash 进入容器的 shell 环境。
3. 容器导出
[root@localhost ~]# docker export 03f > centos7
docker export 命令用于将一个运行中的或已停止的 Docker 容器的文件系统内容导出为一个 tar 归档文件。
应用场景:
- 迁移容器:当你需要把一个容器从一个 Docker 环境迁移到另一个 Docker 环境时,可以使用 docker export 导出容器的文件系统,再在目标环境中导入使用。
- 备份容器:对容器的当前状态进行备份,以便在需要时可以恢复到该状态。
- 分析容器内容:将容器的文件系统导出后,可以在宿主机上查看和分析容器内的文件和目录结构。
注意事项:
- 与 docker save 的区别:
- docker save 操作的对象是镜像,保存的是镜像的所有层信息和元数据,包括镜像的历史记录和构建信息,而 docker export 操作的对象是容器,只保存容器当前的文件系统状态,不包含镜像的历史和构建信息。
- 使用 docker save 保存的镜像可以直接使用 docker load 加载到其他 Docker 环境中,而使用 docker export 导出的容器文件系统需要使用 docker import 导入,导入后会生成一个新的镜像,且该镜像没有之前的历史记录。
- 容器状态:无论容器是运行中还是已停止,都可以使用 docker export 命令进行导出。不过,在导出运行中的容器时,要注意容器内的文件可能正在被修改,导出的文件系统状态可能不是一个完全一致的快照。
- 文件大小:导出的 tar 文件可能会比较大,尤其是对于包含大量文件的容器。在导出和存储时,要确保有足够的磁盘空间。
- 权限问题:导出的文件系统中的文件权限可能会受到宿主机和容器之间权限映射的影响。在导入到新环境后,要检查文件权限是否符合预期。
4. 容器导入生成镜像
[root@localhost ~]# docker import centos7 centos7:test [root@localhost ~]# docker images
5. 容器删除
[root@localhost ~]# docker rm 7f
docker rm 是 Docker 中用于删除容器的基础命令。
命令语法:docker rm [OPTIONS] CONTAINER [CONTAINER...]
参数说明:
- -f, --force:强制删除正在运行的容器。默认情况下,docker rm 只能删除已停止的容器,添加该选项后,会向容器内的主进程发送 SIGKILL 信号,直接终止容器并将其删除,但可能导致数据丢失或应用异常。
- -l, --link:仅删除容器的网络连接,而不删除容器本身。通常用于清理容器与网络之间的关联。
- -v, --volumes:在删除容器的同时,删除与该容器关联的数据卷。如果数据卷中存储着重要数据,使用该选项要谨慎。
- CONTAINER [CONTAINER...]:指定要删除的容器,可以是容器的名称或者 ID,支持同时指定多个容器,用空格分隔。