Docker 是一个开源的平台,用于自动化应用程序的部署、扩展和管理。它使得开发者能够打包应用及其依赖项到一个轻量级的容器中,并在任何环境中快速运行。掌握 Docker 的常用命令可以大大提高你的工作效率,尤其是在开发、测试和部署阶段。本文将详细介绍 Docker 的常用命令,涵盖从基本操作到高级使用。
1. Docker 基础命令
1.1 docker --version
docker --version
命令用于查看 Docker 的当前版本信息。确保 Docker 已经正确安装,并且版本满足项目需求。
$ docker --version
Docker version 20.10.7, build f0df350
1.2 docker info
docker info
命令用于显示关于 Docker 的系统级信息,如镜像、容器数量,存储驱动器类型等。
$ docker info
...
Containers: 5
Running: 1
Paused: 0
Stopped: 4
Images: 10
...
1.3 docker help
docker help
命令用于显示 Docker 的帮助文档,列出所有可用命令和对应的简短描述。
$ docker help
Usage: docker [OPTIONS] COMMAND
A self-sufficient runtime for containers
...
1.4 docker system df
docker system df
命令用于显示 Docker 使用的磁盘空间,包括镜像、容器、数据卷等。
$ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 10 5 2.34GB 1.75GB (75%)
Containers 5 1 300MB 250MB (83%)
Local Volumes 3 2 500MB 100MB (20%)
2. 镜像操作
2.1 docker images
docker images
命令用于列出本地存储的所有 Docker 镜像。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest ae2feff98a0c 2 days ago 133MB
2.2 docker pull
docker pull
命令用于从 Docker 仓库中拉取指定镜像到本地。
$ docker pull nginx:latest
latest: Pulling from library/nginx
...
Status: Downloaded newer image for nginx:latest
2.3 docker search
docker search
命令用于在 Docker Hub 上搜索符合条件的镜像。
$ docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 12345 [OK]
2.4 docker rmi
docker rmi
命令用于删除本地的一个或多个 Docker 镜像。
$ docker rmi nginx:latest
Untagged: nginx:latest
Deleted: sha256:ae2feff98a0c...
2.5 docker tag
docker tag
命令用于为本地镜像打上一个新的标签(tag),通常用于标记不同的版本。
$ docker tag nginx:latest mynginx:v1
2.6 docker save
docker save
命令用于将指定镜像保存为一个 tar 压缩包,可以用于传输或备份。
$ docker save -o mynginx.tar mynginx:v1
2.7 docker load
docker load
命令用于从一个 tar 包中加载镜像到本地 Docker 库。
$ docker load -i mynginx.tar
Loaded image: mynginx:v1
2.8 docker history
docker history
命令用于显示镜像的构建历史,包括各个层的创建时间、大小等信息。
$ docker history nginx:latest
IMAGE CREATED CREATED BY SIZE
ae2feff98a0c 2 days ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 133MB
2.9 docker inspect
docker inspect
命令用于查看镜像或容器的详细信息,以 JSON 格式输出。
$ docker inspect nginx:latest
[
{
"Id": "sha256:ae2feff98a0c...",
...
}
]
3. 容器操作
3.1 docker run
docker run
命令用于创建并启动一个新的容器。该命令结合了 docker create
和 docker start
。
$ docker run -d -p 80:80 nginx:latest
常用参数:
-d
:后台运行容器。-p
:映射主机端口到容器端口。
3.2 docker start
docker start
命令用于启动一个已经停止的容器。
$ docker start container_id
3.3 docker stop
docker stop
命令用于停止一个正在运行的容器。
$ docker stop container_id
3.4 docker restart
docker restart
命令用于重启一个容器。
$ docker restart container_id
3.5 docker kill
docker kill
命令用于强制终止一个正在运行的容器。
$ docker kill container_id
3.6 docker rm
docker rm
命令用于删除一个已经停止的容器。
$ docker rm container_id
3.7 docker ps
docker ps
命令用于列出正在运行的容器。使用 -a
参数可以列出所有容器(包括已停止的)。
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c3d5a72d1fd5 nginx:latest "nginx -g 'daemon…" 3 hours ago Up 3 hours 0.0.0.0:80->80/tcp happy_hopper
3.8 docker exec
docker exec
命令用于在一个正在运行的容器中执行命令。
$ docker exec -it container_id /bin/bash
常用参数:
-it
:以交互模式运行命令。
3.9 docker logs
docker logs
命令用于查看容器的日志输出。
$ docker logs container_id
3.10 docker commit
docker commit
命令用于从一个容器创建一个新的镜像。该镜像会包含当前容器的所有修改。
$ docker commit container_id mynginx:v2
3.11 docker cp
docker cp
命令用于在容器和主机之间复制文件或目录。这个命令非常有用,尤其是在需要从容器内取出生成的文件或将主机上的文件拷贝到容器内进行处理时。
$ docker cp container_id:/path/in/container /path/on/host
示例: 如果需要从容器中提取日志文件到主机,可以使用如下命令:
$ docker cp my_container:/var/log/nginx/access.log /home/user/nginx_logs/
3.12 docker rename
docker rename
命令用于重命名一个已经存在的容器。这个命令可以帮助你更好地组织和管理你的容器。
$ docker rename old_container_name new_container_name
示例: 如果你有一个名为
web_server
的容器,想将其重命名为nginx_server
,可以使用如下命令:$ docker rename web_server nginx_server
3.13 docker pause
docker pause
命令用于暂停一个容器中的所有进程。暂停的容器不会占用 CPU 资源,适合在需要临时停止某个容器而不希望其完全停止的场景下使用。
$ docker pause container_id
- 示例: 暂停一个容器以释放 CPU 资源:
$ docker pause my_container
3.14 docker unpause
docker unpause
命令用于恢复一个被暂停的容器中的所有进程,使其重新运行。
$ docker unpause container_id
- 示例: 恢复一个被暂停的容器:
$ docker unpause my_container
4. 网络管理
Docker 提供了灵活的网络管理功能,允许你在容器之间建立连接,或将容器连接到外部网络。以下命令将帮助你管理 Docker 网络。
4.1 docker network ls
docker network ls
命令用于列出 Docker 中所有可用的网络。默认情况下,Docker 会创建三种网络:bridge、host 和 none。
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
f1d2a3c4d5e6 bridge bridge local
7a8b9c0d1e2f host host local
6e7f8a9b0c1d none null local
- 解释:
bridge
: 默认的网络类型,Docker 容器通过它可以相互通信。host
: 容器与主机共享网络栈。none
: 容器无网络连接。
4.2 docker network create
docker network create
命令用于创建一个新的网络。你可以为不同的应用场景创建独立的网络。
$ docker network create my_network
- 示例: 创建一个名为
my_network
的自定义网络:
$ docker network create my_network
4.3 docker network inspect
docker network inspect
命令用于查看某个网络的详细信息。该命令将输出网络的配置及连接到该网络的容器信息。
$ docker network inspect my_network
- 示例: 查看
my_network
的详细信息:
$ docker network inspect my_network
4.4 docker network connect
docker network connect
命令用于将一个容器连接到一个已经存在的网络中。这允许你动态地改变容器的网络配置。
$ docker network connect my_network my_container
- 示例: 将
my_container
连接到my_network
网络中:
$ docker network connect my_network my_container
4.5 docker network disconnect
docker network disconnect
命令用于将一个容器从网络中断开。断开后,该容器将无法与网络中的其他容器通信。
$ docker network disconnect my_network my_container
- 示例: 将
my_container
从my_network
网络中断开:
$ docker network disconnect my_network my_container
4.6 docker network rm
docker network rm
命令用于删除一个 Docker 网络。该网络必须没有正在连接的容器,否则删除操作将失败。
$ docker network rm my_network
- 示例: 删除
my_network
网络:
$ docker network rm my_network
5. 数据卷管理
Docker 数据卷用于持久化存储数据。数据卷可以在容器之间共享,并且在删除容器时不会丢失数据。以下命令将帮助你管理 Docker 的数据卷。
5.1 docker volume ls
docker volume ls
命令用于列出所有 Docker 数据卷。
$ docker volume ls
DRIVER VOLUME NAME
local my_volume
- 解释:
local
: Docker 的默认存储驱动。my_volume
: 自定义的数据卷名称。
5.2 docker volume create
docker volume create
命令用于创建一个新的数据卷。该数据卷可以用于多个容器之间共享数据。
$ docker volume create my_volume
- 示例: 创建一个名为
my_volume
的数据卷:
$ docker volume create my_volume
5.3 docker volume inspect
docker volume inspect
命令用于查看数据卷的详细信息。包括存储路径、驱动类型以及挂载的容器等。
$ docker volume inspect my_volume
- 示例: 查看
my_volume
数据卷的详细信息:
$ docker volume inspect my_volume
5.4 docker volume rm
docker volume rm
命令用于删除一个数据卷。注意,如果有容器在使用该数据卷,删除操作将失败。
$ docker volume rm my_volume
- 示例: 删除
my_volume
数据卷:
$ docker volume rm my_volume
5.5 docker volume prune
docker volume prune
命令用于删除所有未使用的数据卷。这是一个非常有用的命令,用于清理未使用的资源。
$ docker volume prune
- 示例: 删除所有未使用的数据卷:
$ docker volume prune
6. Docker Compose
Docker Compose 是一个用于定义和管理多容器 Docker 应用的工具。通过一个 YAML 文件,你可以定义应用的服务、网络和数据卷,并使用一条命令来启动或关闭整个应用。以下是一些常用的 Docker Compose 命令。
6.1 docker-compose up
docker-compose up
命令用于构建、启动并运行定义在 docker-compose.yml
文件中的所有服务。
$ docker-compose up
常用参数:
-d
: 后台运行服务。--build
: 在启动服务前重新构建镜像。
示例: 以后台方式启动所有服务:
$ docker-compose up -d
6.2 docker-compose down
docker-compose down
命令用于停止并移除定义在 docker-compose.yml
文件中的所有服务和网络。
$ docker-compose down
常用参数:
--volumes
: 移除所有服务使用的数据卷。--rmi all
: 删除所有与服务关联的镜像。
示例: 停止服务并删除数据卷:
$ docker-compose down --volumes
6.3 docker-compose build
docker-compose build
命令用于构建或重新构建服务所需的镜像。
$ docker-compose build
常用参数:
--no-cache
: 不使用缓存来构建镜像。
示例: 构建服务镜像且不使用缓存:
$ docker-compose build --no-cache
6.4 docker-compose start
docker-compose start
命令用于启动已经创建但未运行的服务容器。
$ docker-compose start
- 示例: 启动所有定义的服务:
$ docker-compose start
6.5 docker-compose stop
docker-compose stop
命令用于停止运行中的服务容器,但不会删除它们。
$ docker-compose stop
- 示例: 停止所有正在运行
的服务容器:
$ docker-compose stop
6.6 docker-compose restart
docker-compose restart
命令用于重新启动运行中的服务容器。它相当于依次执行 docker-compose stop
和 docker-compose start
。
$ docker-compose restart
- 示例: 重启所有服务容器:
$ docker-compose restart
6.7 docker-compose ps
docker-compose ps
命令用于列出与 docker-compose.yml
文件关联的所有服务容器的状态。这类似于 docker ps
,但仅显示与当前 Compose 项目相关的容器。
$ docker-compose ps
- 示例: 列出当前项目中所有服务容器的状态:
$ docker-compose ps
6.8 docker-compose logs
docker-compose logs
命令用于查看所有服务容器的日志。你可以通过 -f
选项实时查看日志输出,类似于 tail -f
。
$ docker-compose logs
常用参数:
-f
: 实时跟踪日志输出。--tail="N"
: 只显示最后 N 行日志。
示例: 实时查看所有服务容器的日志:
$ docker-compose logs -f
6.9 docker-compose exec
docker-compose exec
命令用于在运行中的服务容器内执行命令。这类似于 docker exec
,但专门针对 Docker Compose 环境。
$ docker-compose exec service_name command
- 示例: 在名为
web
的服务容器中启动一个交互式的 bash shell:
$ docker-compose exec web bash
6.10 docker-compose run
docker-compose run
命令用于启动一个新容器并在其中执行指定命令。与 docker-compose exec
不同的是,docker-compose run
会创建一个新容器,而不是在现有容器中执行命令。
$ docker-compose run service_name command
常用参数:
--rm
: 在执行完命令后自动移除容器。-d
: 在后台运行命令。
示例: 在名为
db
的服务容器中运行psql
命令并连接到数据库:
$ docker-compose run db psql -U postgres
6.11 docker-compose scale
docker-compose scale
命令用于扩展(或缩减)服务容器的数量。此命令已被弃用,建议使用 docker-compose up --scale
替代。
$ docker-compose scale service_name=num_instances
- 示例: 扩展
web
服务的容器数量到 3 个实例:
$ docker-compose scale web=3
6.12 docker-compose config
docker-compose config
命令用于验证和查看当前 Compose 文件的配置信息。它会显示所有配置选项,并检查 YAML 语法的正确性。
$ docker-compose config
常用参数:
--services
: 只列出服务名称。--volumes
: 只列出数据卷。
示例: 验证
docker-compose.yml
文件的配置并查看详细信息:
$ docker-compose config
7. Docker Swarm
Docker Swarm 是 Docker 的原生集群管理工具。它可以将多台 Docker 主机聚合成一个集群,并允许你在这个集群上部署和管理应用。以下是一些常用的 Docker Swarm 命令。
7.1 docker swarm init
docker swarm init
命令用于初始化 Docker 主机并将其配置为 Swarm 管理器(Manager)。Swarm 管理器是集群的控制中心,负责管理和调度服务。
$ docker swarm init
常用参数:
--advertise-addr
: 指定管理器节点的 IP 地址。
示例: 初始化一个 Swarm 集群并指定管理器节点的 IP 地址:
$ docker swarm init --advertise-addr 192.168.1.100
7.2 docker swarm join
docker swarm join
命令用于将一台 Docker 主机加入到一个已经存在的 Swarm 集群中。加入集群后,该主机将作为一个节点来运行容器。
$ docker swarm join --token <TOKEN> <MANAGER-IP>:<PORT>
示例: 将一台 Docker 主机加入到 Swarm 集群:
$ docker swarm join --token SWMTKN-1-0d4upc... 192.168.1.100:2377
7.3 docker node ls
docker node ls
命令用于列出 Swarm 集群中的所有节点。只有在管理器节点上执行该命令才会显示节点列表。
$ docker node ls
- 示例: 列出当前 Swarm 集群中的所有节点:
$ docker node ls
7.4 docker node inspect
docker node inspect
命令用于查看 Swarm 集群中某个节点的详细信息。
$ docker node inspect <NODE-ID>
- 示例: 查看某个节点的详细信息:
$ docker node inspect node_id
7.5 docker node update
docker node update
命令用于更新 Swarm 集群中某个节点的属性,例如角色或标签。
$ docker node update --role <ROLE> <NODE-ID>
常用参数:
--availability
: 设置节点的可用性(active, pause, drain)。--role
: 设置节点的角色(manager, worker)。
示例: 将某个节点设置为管理器角色:
$ docker node update --role manager node_id
7.6 docker node rm
docker node rm
命令用于将一个节点从 Swarm 集群中移除。移除节点后,该节点将不再参与容器的调度和运行。
$ docker node rm <NODE-ID>
- 示例: 从 Swarm 集群中移除某个节点:
$ docker node rm node_id
7.7 docker service create
docker service create
命令用于在 Swarm 集群中创建一个服务。该服务可以在多个节点上运行多个容器实例。
$ docker service create --name <SERVICE-NAME> <IMAGE>
常用参数:
--replicas
: 设置服务的副本数量。--network
: 指定服务要连接的网络。
示例: 在 Swarm 集群中创建一个名为
web
的服务,并运行 3 个副本:
$ docker service create --name web --replicas 3 nginx
7.8 docker service ls
docker service ls
命令用于列出 Swarm 集群中所有运行的服务。它会显示服务的名称、模式、运行中的任务数和镜像等信息。
$ docker service ls
- 示例: 列出所有服务:
$ docker service ls
7.9 docker service ps
docker service ps
命令用于显示某个服务的任务列表。任务是服务的具体运行实例,每个任务对应一个容器。
$ docker service ps <SERVICE-NAME>
- 示例: 查看
web
服务的所有任务:
$ docker service ps web
7.10 docker service scale
docker service scale
命令用于动态调整服务的副本数量。在 Swarm 集群中,扩展或缩减服务的副本非常方便。
$ docker service scale <SERVICE-NAME>=<NUM-REPLICAS>
- 示例: 将
web
服务的副本数量调整为 5 个:
$ docker service scale web=5
7.11 docker service update
docker service update
命令用于更新服务的配置。可以修改服务使用的镜像、环境变量、资源限制等。
$ docker service update --image <NEW-IMAGE> <SERVICE-NAME>
常用参数:
--force
: 强制更新,即使没有变化。--env-add
: 添加环境变量。
示例: 更新
web
服务使用的新镜像:
$ docker service update --image nginx:latest web
7.12 docker service rm
docker service rm
命令用于删除 Swarm 集群中的某个服务。删除服务后,所有与该服务相关的容器将被停止并移除。
$ docker service rm <SERVICE-NAME>
- 示例: 删除名为
web
的服务:
$ docker service rm web
8. Docker 网络管理命令
Docker 支持多种网络模式,用于连接容器和提供服务。以下是 Docker 网络管理的常用命令。
8.1 docker network ls
docker network ls
命令用于列出所有 Docker 网络。Docker 默认提供了几个网络,如 bridge
、host
和 none
。
$ docker network ls
- 示例: 列出所有 Docker 网络:
$ docker network ls
8.2 docker network create
docker network create
命令用于创建一个新的 Docker 网络。你可以指定网络的驱动程序(如 bridge
、overlay
)以及其他选项。
$ docker network create <NETWORK-NAME>
常用参数:
-d
: 指定网络驱动程序(如bridge
、overlay
)。--subnet
: 设置自定义子网。--gateway
: 设置自定义网关。
示例: 创建一个名为
my_bridge
的桥接网络:
$ docker network create -d bridge my_bridge
8.3 docker network inspect
docker network inspect
命令用于查看指定 Docker 网络的详细信息,包括网络 ID、驱动程序、容器连接等。
$ docker network inspect <NETWORK-NAME>
- 示例: 查看
my_bridge
网络的详细信息:
$ docker network inspect my_bridge
8.4 docker network connect
docker network connect
命令用于将某个容器连接到指定的 Docker 网络。这样容器就可以与网络中的其他容器通信。
$ docker network connect <NETWORK-NAME> <CONTAINER>
- 示例: 将容器
nginx_container
连接到my_bridge
网络:
$ docker network connect my_bridge nginx_container
8.5 docker network disconnect
docker network disconnect
命令用于将某个容器从指定的 Docker 网络中断开。断开后,容器将无法与该网络中的其他容器通信。
$ docker network disconnect <NETWORK-NAME> <CONTAINER>
- 示例: 将容器
nginx_container
从my_bridge
网络中断开:
$ docker network disconnect my_bridge nginx_container
8.6 docker network rm
docker network rm
命令用于删除指定的 Docker 网络。删除网络前,必须先断开与该网络相关联的所有容器。
$ docker network rm <NETWORK-NAME>
- 示例: 删除名为
my_bridge
的网络:
$ docker network rm my_bridge
9. Docker 数据卷管理命令
数据卷是 Docker 中用于持久化和共享数据的重要机制。以下是常用的 Docker 数据卷管理命令。
9.1 docker volume ls
docker volume ls
命令用于列出所有 Docker 数据卷。数据卷可以在多个容器之间共享,并且数据在容器删除后依然存在。
$ docker volume ls
- 示例: 列出所有 Docker 数据卷:
$ docker volume ls
9.2 docker volume create
docker volume create
命令用于创建一个新的 Docker 数据卷。你可以为数据卷指定名称,也可以让 Docker 自动生成。
$ docker volume create <VOLUME-NAME>
- 示例: 创建一个名为
my_data
的数据卷:
$ docker volume create my_data
9.3 docker volume inspect
docker volume inspect
命令用于查看指定数据卷的详细信息,包括卷名、挂载点、创建时间等。
$ docker volume inspect <VOLUME-NAME>
- 示例: 查看
my_data
数据卷的详细信息:
$ docker volume inspect my_data
9.4 docker volume rm
docker volume rm
命令用于删除指定的 Docker 数据卷。删除数据卷前,必须先确保没有容器在使用它。
$ docker volume rm <VOLUME-NAME>
- 示例: 删除名为
my_data
的数据卷:
$ docker volume rm my_data
9.5 docker volume prune
docker volume prune
命令用于删除所有未使用的 Docker 数据卷。这有助于清理系统中不再需要的数据卷,从而释放磁盘空间。
$ docker volume prune
- 示例: 删除所有未使用的 Docker 数据卷:
$ docker volume prune
10. Docker 安全与权限管理
Docker 提供了一些命令来管理容器的安全性和权限设置,确保容器化应用在受控和安全的环境中运行。
10.1 docker exec --user
docker exec
命令的 --user
选项允许你以指定用户身份在容器内执行命令。这对于执行特定用户权限下的任务非常有用。
$ docker exec --user <USER> <CONTAINER> <COMMAND>
- 示例: 以
nginx
用户身份在容器nginx_container
内执行bash
命令:
$ docker exec --user nginx nginx_container bash
10.2 docker run --cap-add
docker run
命令的 --cap-add
选项允许你向容器添加特定的 Linux 功能(capabilities)。这在需要赋予容器特定权限时非常有用。
$ docker run --cap-add <CAPABILITY> <IMAGE>
- 示例: 运行一个带有
NET_ADMIN
功能的容器:
$ docker run --cap-add NET_ADMIN ubuntu
10.3 docker run --security-opt
docker run
命令的 --security-opt
选项允许你配置容器的安全选项,例如应用 AppArmor 或 SELinux 配置文件。
$ docker run --security-opt <OPTION> <IMAGE>
- 示例: 运行一个应用了
seccomp
配置文件的容器:
$ docker run --security-opt seccomp=unconfined ubuntu
11. Docker 调试与排错
Docker 提供了许多命令和工具,帮助用户调试和排查容器问题,确保容器化应用的稳定运行。
11.1 docker logs
docker logs
命令用于查看容器的标准输出日志。日志对于调试容器内的应用非常重要。
$ docker logs <CONTAINER>
常用参数:
-f
: 实时跟踪日志输出。--tail
: 只显示最后 N 行日志。
示例: 实时查看容器
nginx_container
的日志:
$ docker logs -f nginx_container
11.2 docker inspect
docker inspect
命令用于查看容器或镜像的详细信息。该命令会返回一个包含所有容器配置信息的 JSON 对象。
$ docker inspect <CONTAINER|IMAGE>
- 示例: 查看容器
nginx_container
的详细信息:
$ docker inspect nginx_container
11.3 docker events
docker events
命令用于实时监听 Docker 守护进程的事件流。这包括容器启动、停止、网络连接等事件。
$ docker events
- 示例: 实时监听 Docker 的所有事件:
$ docker events
11.4 docker stats
docker stats
命令用于显示容器的实时资源使用情况,包括 CPU、内存、网络和存储 I/O。这有助于监控容器的性能。
$ docker stats
- 示例: 实时监控所有容器的资源使用情况:
$ docker stats
11.5 docker top
docker top
命令用于显示容器内运行的进程。这类似于 Linux 的top
命令,能够帮助你查看容器内的活动进程,并分析其资源消耗情况。
$ docker top <CONTAINER>
- 示例: 查看容器
nginx_container
内的活动进程:
$ docker top nginx_container
11.6 docker diff
docker diff
命令用于显示容器文件系统的更改。通过这个命令,你可以查看容器启动后文件系统中被修改、添加或删除的文件。
$ docker diff <CONTAINER>
- 示例: 查看容器
nginx_container
内文件系统的更改:
$ docker diff nginx_container
11.7 docker ps --filter
docker ps
命令的 --filter
选项允许你通过特定条件来筛选容器。这对于管理大量容器时非常有用。
$ docker ps --filter <FILTER>
常用过滤条件:
status=running
: 筛选正在运行的容器。name=<CONTAINER-NAME>
: 筛选特定名称的容器。label=<LABEL>
: 筛选带有特定标签的容器。
示例: 仅显示带有
web
标签的运行中容器:
$ docker ps --filter "status=running" --filter "label=web"
12. Docker 镜像管理命令
Docker 镜像是容器的基础,管理镜像是 Docker 使用中的重要部分。以下是一些常用的 Docker 镜像管理命令。
12.1 docker images
docker images
命令用于列出本地 Docker 主机上的所有镜像。它显示了镜像的仓库名、标签、镜像 ID、创建时间和大小。
$ docker images
常用参数:
-a
: 显示所有镜像,包括中间层镜像。--filter
: 按条件筛选镜像。
示例: 列出本地所有 Docker 镜像:
$ docker images
12.2 docker rmi
docker rmi
命令用于删除一个或多个本地镜像。删除镜像前,必须先确保没有容器在使用它。
$ docker rmi <IMAGE>
- 示例: 删除名为
nginx:latest
的镜像:
$ docker rmi nginx:latest
12.3 docker tag
docker tag
命令用于为已有的镜像创建一个新的标签。标签可以帮助你更好地管理和区分镜像版本。
$ docker tag <SOURCE_IMAGE> <TARGET_IMAGE>
- 示例: 为
nginx:latest
镜像创建一个新的标签nginx:stable
:
$ docker tag nginx:latest nginx:stable
12.4 docker save
docker save
命令用于将一个或多个 Docker 镜像保存为 tar 包文件。保存的镜像可以通过 docker load
命令导入到其他 Docker 主机中。
$ docker save -o <FILE_PATH> <IMAGE>
- 示例: 将
nginx:latest
镜像保存为nginx_latest.tar
文件:
$ docker save -o nginx_latest.tar nginx:latest
12.5 docker load
docker load
命令用于从一个 tar 包文件中导入 Docker 镜像。这个命令通常与 docker save
搭配使用,便于在不同主机之间传输镜像。
$ docker load -i <FILE_PATH>
- 示例: 从
nginx_latest.tar
文件中加载 Docker 镜像:
$ docker load -i nginx_latest.tar
12.6 docker import
docker import
命令用于从一个 tar 包文件中导入文件系统,并创建为 Docker 镜像。与 docker load
不同的是,docker import
允许你从其他容器格式(如 .tar
、.tar.gz
等)创建新的 Docker 镜像。
$ docker import <FILE_PATH> <NEW_IMAGE>
- 示例: 从
ubuntu.tar
文件中导入文件系统,并创建为myubuntu
镜像:
$ docker import ubuntu.tar myubuntu
12.7 docker history
docker history
命令用于查看某个镜像的构建历史。它显示了镜像每一层的创建指令、大小和创建时间。
$ docker history <IMAGE>
- 示例: 查看
nginx:latest
镜像的构建历史:
$ docker history nginx:latest
12.8 docker commit
docker commit
命令用于将一个运行中的容器保存为新的 Docker 镜像。你可以为这个新镜像指定标签,并添加描述信息。
$ docker commit <CONTAINER> <NEW_IMAGE>
常用参数:
-m
: 为新镜像添加提交信息。-a
: 为新镜像指定作者信息。
示例: 将容器
nginx_container
保存为新的mynginx:latest
镜像:
$ docker commit -m "Custom Nginx" -a "Author Name" nginx_container mynginx:latest
13. Docker 容器监控与资源限制
Docker 提供了多种方式来监控容器的资源使用情况,并对容器施加资源限制,以确保系统的稳定性和性能。
13.1 docker stats
docker stats
命令显示所有容器的实时资源使用情况,包括 CPU、内存、网络和存储 I/O。
$ docker stats
- 示例: 实时监控所有容器的资源使用情况:
$ docker stats
13.2 docker update
docker update
命令用于动态调整运行中容器的资源限制,如 CPU 和内存。你可以对多个容器同时进行资源调整。
$ docker update <OPTIONS> <CONTAINER>
常用参数:
--cpu-shares
: 调整容器的 CPU 共享值。--memory
: 设置容器的内存限制。--restart
: 调整容器的重启策略。
示例: 将容器
nginx_container
的内存限制调整为 512MB:
$ docker update --memory 512m nginx_container
13.3 docker run --memory
docker run
命令的 --memory
选项用于在启动容器时设置其内存限制。这在资源有限的系统中非常有用。
$ docker run --memory <MEMORY_LIMIT> <IMAGE>
- 示例: 运行一个内存限制为 256MB 的容器:
$ docker run --memory 256m ubuntu
13.4 docker run --cpus
docker run
命令的 --cpus
选项用于在启动容器时设置其 CPU 限制。你可以指定容器可以使用的 CPU 数量。
$ docker run --cpus=<CPU_LIMIT> <IMAGE>
- 示例: 运行一个 CPU 限制为 0.5(即最多使用一半 CPU 资源)的容器:
$ docker run --cpus=0.5 ubuntu
14. Docker 高级功能
除了基本的容器管理命令,Docker 还提供了一些高级功能,用于提升容器化应用的性能、灵活性和安全性。
14.1 docker checkpoint
docker checkpoint
命令用于为运行中的容器创建检查点。这允许你将容器的当前状态保存下来,并在未来恢复。
$ docker checkpoint create <CONTAINER> <CHECKPOINT_NAME>
- 示例: 为容器
nginx_container
创建一个名为checkpoint1
的检查点:
$ docker checkpoint create nginx_container checkpoint1
14.2 docker restore
docker restore
命令用于从检查点恢复容器的运行状态。这对于长时间运行的任务或需要中断恢复的应用非常有用。
$ docker start --checkpoint <CHECKPOINT_NAME> <CONTAINER>
- 示例: 从
checkpoint1
检查点恢复容器nginx_container
:
$ docker start --checkpoint checkpoint1 nginx_container
14.3 docker exec --privileged
docker exec
命令的 --privileged
选项允许你在容器中执行命令时提升权限,类似于 Linux 系统中的 sudo
。这对于需要访问特权资源或执行高级操作的场景非常有用。
$ docker exec --privileged <CONTAINER> <COMMAND>
- 示例: 在容器
nginx_container
中以特权模式执行bash
交互式命令行:
$ docker exec --privileged -it nginx_container bash
14.4 docker run --network
docker run
命令的 --network
选项允许你在启动容器时指定其网络模式。Docker 支持多种网络模式,包括 bridge(桥接网络)、host(主机网络)、none(无网络)以及用户自定义网络。
$ docker run --network <NETWORK_MODE> <IMAGE>
常用网络模式:
bridge
: 默认网络模式,容器间通过 NAT 方式通信。host
: 容器与宿主机共享网络栈,性能较高但隔离性较差。none
: 容器没有网络接口。overlay
: 用于多主机网络,通过 Docker Swarm 或 Kubernetes 管理。
示例: 运行一个使用 host 网络模式的容器:
$ docker run --network host nginx
14.5 docker run --security-opt
docker run
命令的 --security-opt
选项允许你在启动容器时设置安全选项。这些选项包括 SELinux、AppArmor 配置等,用于增强容器的安全性。
$ docker run --security-opt <SECURITY_OPTION> <IMAGE>
- 示例: 运行一个禁用所有特权的容器:
$ docker run --security-opt no-new-privileges nginx
14.6 docker build --squash
docker build
命令的 --squash
选项用于在构建镜像时将多个层合并为一层,从而减少镜像的大小。这在镜像部署时能节省带宽和存储空间。
$ docker build --squash -t <IMAGE_NAME> .
- 示例: 构建一个压缩层的 Docker 镜像:
$ docker build --squash -t my_compressed_image .
14.7 docker build --no-cache
docker build
命令的 --no-cache
选项用于在构建镜像时不使用缓存层。这确保了每次构建都会拉取最新的基础镜像和依赖项。
$ docker build --no-cache -t <IMAGE_NAME> .
- 示例: 构建一个不使用缓存的 Docker 镜像:
$ docker build --no-cache -t my_fresh_image .
14.8 docker secret
docker secret
命令用于管理 Docker Swarm 集群中的敏感数据(如密码、API 密钥等)。你可以使用这个命令创建、查看、更新和删除集群中的密钥。
$ docker secret <COMMAND>
常用子命令:
create
: 创建一个新密钥。ls
: 列出所有密钥。rm
: 删除一个密钥。inspect
: 查看密钥的详细信息。
示例: 创建一个名为
my_secret
的新密钥:
$ echo "my_secret_value" | docker secret create my_secret -
14.9 docker service update --replicas
docker service update
命令的 --replicas
选项用于动态调整 Swarm 服务的副本数量。这在扩展或缩减服务时非常有用。
$ docker service update --replicas <NUMBER_OF_REPLICAS> <SERVICE_NAME>
- 示例: 将服务
web_service
的副本数量调整为 5:
$ docker service update --replicas 5 web_service
15. Docker Compose 命令
Docker Compose 是用于定义和管理多容器 Docker 应用的工具。它通过 docker-compose.yml
文件来描述应用的服务、网络和卷,并提供了一系列命令来管理这些服务。
15.1 docker-compose up
docker-compose up
命令用于启动由 docker-compose.yml
文件定义的所有服务。如果服务尚未构建,up
命令会先构建它们。
$ docker-compose up
常用参数:
-d
: 在后台模式启动服务。--build
: 强制重新构建服务镜像。--force-recreate
: 强制重新创建容器。
示例: 在后台模式启动所有服务:
$ docker-compose up -d
15.2 docker-compose down
docker-compose down
命令用于停止并删除由 docker-compose.yml
文件定义的所有服务和网络。
$ docker-compose down
常用参数:
--volumes
: 删除服务所使用的所有数据卷。--rmi
: 删除服务所使用的镜像。
示例: 停止并删除所有服务和网络,同时删除数据卷:
$ docker-compose down --volumes
15.3 docker-compose ps
docker-compose ps
命令用于显示由 docker-compose.yml
文件定义的所有服务的状态。它显示了服务的名称、命令、状态、端口等信息。
$ docker-compose ps
- 示例: 显示所有服务的状态:
$ docker-compose ps
15.4 docker-compose logs
docker-compose logs
命令用于查看由 docker-compose.yml
文件定义的所有服务的日志。这对于调试和监控服务运行情况非常有帮助。
$ docker-compose logs
常用参数:
-f
: 实时跟踪日志输出。--tail
: 只显示最近的日志行数。
示例: 实时跟踪所有服务的日志输出:
$ docker-compose logs -f
15.5 docker-compose build
docker-compose build
命令用于根据 docker-compose.yml
文件重新构建服务镜像。这通常用于更新基础镜像或代码更改后的重新构建。
$ docker-compose build
常用参数:
--no-cache
: 不使用缓存构建镜像。--pull
: 始终拉取最新的基础镜像。
示例: 使用最新的基础镜像重新构建服务:
$ docker-compose build --pull
15.6 docker-compose exec
docker-compose exec
命令允许你在指定的服务容器内执行命令。与 docker exec
类似,这对于在运行中的服务内进行调试非常有用。
$ docker-compose exec <SERVICE> <COMMAND>
- 示例: 在
web
服务容器内打开一个bash
交互式命令行:
$ docker-compose exec web bash
15.7 docker-compose scale
docker-compose scale
命令用于调整服务的副本数量。与 Swarm 模式下的 docker service update --replicas
类似,这对于横向扩展应用非常有用。
$ docker-compose scale <SERVICE>=<NUMBER_OF_REPLICAS>
- 示例: 将
web
服务的副本数量调整为 3:
$ docker-compose scale web=3
16. Docker 网络命令
Docker 提供了强大的网络管理功能,你可以使用这些命令创建、管理和监控 Docker 网络,从而为容器化应用提供隔离和连接。
16.1 docker network ls
docker network ls
命令用于列出所有 Docker 网络。它显示了网络的名称、ID、驱动程序类型和范围(local 或 global)。
$ docker network ls
- 示例: 列出所有 Docker 网络:
$ docker network ls
16.2 docker network create
docker network create
命令用于创建一个新的 Docker 网络。你可以为网络指定名称和驱动程序。
$ docker network create <NETWORK_NAME>
常用驱动程序:
bridge
: 默认驱动程序,适用于单机网络。overlay
: 适用于跨主机的 Swarm 集群网络。macvlan
: 允许容器拥有自己的 MAC 地址并与主机网络进行直接通信。host
: 使用主机的网络栈(通常用于高性能网络)。
示例: 创建一个名为
my_network
的桥接网络:
$ docker network create --driver bridge my_network
16.3 docker network rm
docker network rm
命令用于删除一个或多个 Docker 网络。在删除网络之前,请确保没有容器在使用这些网络。
$ docker network rm <NETWORK_NAME>
- 示例: 删除名为
my_network
的网络:
$ docker network rm my_network
16.4 docker network inspect
docker network inspect
命令用于查看 Docker 网络的详细信息,包括网络配置、已连接的容器、IP 地址等。
$ docker network inspect <NETWORK_NAME>
- 示例: 查看名为
my_network
的网络详细信息:
$ docker network inspect my_network
16.5 docker network connect
docker network connect
命令用于将一个容器连接到一个 Docker 网络。这允许容器通过指定的网络与其他容器进行通信。
$ docker network connect <NETWORK_NAME> <CONTAINER>
- 示例: 将容器
nginx_container
连接到my_network
网络:
$ docker network connect my_network nginx_container
16.6 docker network disconnect
docker network disconnect
命令用于将一个容器从指定的 Docker 网络中断开。这有助于管理网络连接和隔离容器。
$ docker network disconnect <NETWORK_NAME> <CONTAINER>
- 示例: 将容器
nginx_container
从my_network
网络中断开:
$ docker network disconnect my_network nginx_container
17. Docker 卷管理命令
Docker 卷用于持久化和共享容器数据。以下是一些常用的 Docker 卷管理命令。
17.1 docker volume ls
docker volume ls
命令用于列出所有 Docker 卷。它显示了卷的名称和驱动程序。
$ docker volume ls
- 示例: 列出所有 Docker 卷:
$ docker volume ls
17.2 docker volume create
docker volume create
命令用于创建一个新的 Docker 卷。你可以为卷指定名称和驱动程序。
$ docker volume create <VOLUME_NAME>
- 示例: 创建一个名为
my_volume
的卷:
$ docker volume create my_volume
17.3 docker volume inspect
docker volume inspect
命令用于查看 Docker 卷的详细信息,包括卷的驱动程序、挂载点、创建时间等。
$ docker volume inspect <VOLUME_NAME>
- 示例: 查看名为
my_volume
的卷详细信息:
$ docker volume inspect my_volume
17.4 docker volume rm
docker volume rm
命令用于删除一个或多个 Docker 卷。在删除卷之前,请确保没有容器在使用这些卷。
$ docker volume rm <VOLUME_NAME>
- 示例: 删除名为
my_volume
的卷:
$ docker volume rm my_volume
17.5 docker volume prune
docker volume prune
命令用于删除所有未被使用的 Docker 卷。这个命令有助于清理系统中的旧卷,释放存储空间。
$ docker volume prune
- 示例: 删除所有未使用的 Docker 卷:
$ docker volume prune
18. Docker 容器数据管理
Docker 提供了管理容器数据的功能,包括挂载卷、绑定挂载和配置数据目录。
18.1 数据卷(Volumes)
数据卷是 Docker 提供的持久化数据机制。它们能够在容器生命周期之外保留数据,并且可以在多个容器之间共享。
- 创建和挂载数据卷:
$ docker run -d -v <VOLUME_NAME>:<CONTAINER_PATH> <IMAGE>
- 示例: 使用名为
my_volume
的卷挂载到容器的/data
目录:
$ docker run -d -v my_volume:/data nginx
18.2 绑定挂载(Bind Mounts)
绑定挂载将主机文件系统中的目录或文件挂载到容器内。这允许容器访问主机文件系统中的特定路径。
- 创建和挂载绑定挂载:
$ docker run -d -v <HOST_PATH>:<CONTAINER_PATH> <IMAGE>
- 示例: 将主机的
/host/data
目录挂载到容器的/data
目录:
$ docker run -d -v /host/data:/data nginx
18.3 Dockerfile 中的数据卷
在 Dockerfile
中,你可以使用 VOLUME
指令定义容器内的数据卷。这将创建一个匿名卷,并将其挂载到容器的指定目录。
- 示例: 在
Dockerfile
中定义数据卷:
VOLUME ["/data"]
- 使用: 构建镜像并运行容器:
$ docker build -t my_image .
$ docker run -d my_image
18.4 数据卷容器(Data Containers)
数据卷容器是只包含数据卷的容器。其他容器可以通过 --volumes-from
选项将数据卷从数据卷容器挂载过来。这种方法用于在多个容器之间共享数据。
- 创建数据卷容器:
$ docker run -d --name data_container -v /data alpine
- 使用数据卷容器:
$ docker run -d --volumes-from data_container nginx
19. Docker 配置管理
Docker 提供了多种方式来管理配置,包括配置文件、环境变量和 secrets。以下是一些管理 Docker 配置的方法。
19.1 配置文件
Docker 容器可以通过挂载配置文件来管理应用配置。你可以将主机上的配置文件挂载到容器内,从而实现配置的管理和更新。
- 示例: 将主机的
/host/config
文件夹挂载到容器的/etc/config
目录:
$ docker run -d -v /host/config:/etc/config nginx
19.2 环境变量
你可以通过 -e
选项在运行容器时设置环境变量。这些环境变量可以用于配置容器内的应用。
- 示例: 设置环境变量
ENV_VAR
并运行容器:
$ docker run -d -e ENV_VAR=value nginx
19.3 Docker secrets
Docker secrets 适用于 Swarm 模式中的敏感数据管理。你可以创建 secrets 并将它们提供给服务,从而实现对敏感数据的安全管理。
- 创建 secret:
$ echo "my_secret_value" | docker secret create my_secret -
- 在服务中使用 secret:
$ docker service create --name my_service --secret my_secret nginx
20. Docker 资源监控与调优
Docker 提供了一些工具和命令来监控容器的资源使用情况,并对容器进行性能调优。
20.1 资源限制
你可以使用 docker run
命令的 --memory
和 --cpus
选项来限制容器的内存和 CPU 使用。
- 示例: 限制容器的内存为 512MB 和 CPU 使用为 0.5 核:
$ docker run --memory 512m --cpus 0.5 nginx
20.2 监控工具
Docker 允许你使用第三方监控工具来跟踪容器的资源使用情况。一些常见的监控工具包括 Prometheus、Grafana 和 Datadog。
- 使用 Docker stats:
$ docker stats
这个命令会显示所有容器的实时资源使用情况,包括 CPU、内存、网络和 I/O。
- 集成 Datadog:
Datadog 提供了 Docker 监控的完整解决方案,包括集成 Docker 的 Agent 来跟踪容器的指标和日志。
- 安装 Datadog Agent:
$ docker run -d --name datadog-agent \
-e DD_API_KEY=<YOUR_DATADOG_API_KEY> \
-v /var/run/docker.sock:/var/run/docker.sock \
datadog/agent:latest
- 使用 cAdvisor:
cAdvisor 是一个开源工具,可以提供容器的详细性能数据,如 CPU、内存、网络和磁盘 I/O。
- 启动 cAdvisor:
$ docker run -d \
--name=cadvisor \
--privileged \
-p 8080:8080 \
google/cadvisor:latest
访问 http://localhost:8080
可以查看容器的性能数据。
20.3 性能调优
- 调整 I/O 性能:
对于高性能 I/O 密集型应用,你可以使用 Docker 的存储驱动(如 overlay2
)和配置卷来优化性能。
- 优化网络性能:
调整 Docker 网络设置,使用自定义网络驱动(如 macvlan
)来提高网络性能。配置合理的网络策略也有助于改善性能。
- CPU 和内存限制:
为容器设置适当的 CPU 和内存限制,避免资源争用,提高容器性能。
- 设置 CPU 限制:
$ docker run --cpus="1.5" <IMAGE>
- 设置内存限制:
$ docker run --memory="1g" <IMAGE>
21. Docker 与云服务集成
Docker 可以与各种云服务平台集成,提供更强大的容器管理和自动化功能。
21.1 Docker 与 AWS
ECS (Elastic Container Service):
AWS ECS 是一种高性能容器管理服务,支持 Docker 容器的部署和扩展。可以使用 AWS CLI 和 ECS 控制台来管理容器服务。
- 创建 ECS 集群:
$ aws ecs create-cluster --cluster-name my-cluster
- 部署服务到 ECS:
$ aws ecs create-service --cluster my-cluster --service-name my-service --task-definition my-task
- ECR (Elastic Container Registry):
AWS ECR 是一个托管 Docker 镜像的服务。可以将镜像推送到 ECR 并在 ECS 中使用。
- 登录 ECR:
$ aws ecr get-login-password --region <region> | docker login --username AWS --password-stdin <account-id>.dkr.ecr.<region>.amazonaws.com
- 推送镜像到 ECR:
$ docker tag my_image:latest <account-id>.dkr.ecr.<region>.amazonaws.com/my_repo:latest
$ docker push <account-id>.dkr.ecr.<region>.amazonaws.com/my_repo:latest
21.2 Docker 与 Azure
Azure Container Instances (ACI):
Azure ACI 提供了无服务器容器服务,适用于快速运行 Docker 容器。
- 创建 ACI 实例:
$ az container create --resource-group myResourceGroup --name mycontainer --image my_image --cpu 1 --memory 1.5
Azure Kubernetes Service (AKS):
AKS 是 Azure 的托管 Kubernetes 服务,支持部署和管理 Docker 容器。
- 创建 AKS 集群:
$ az aks create --resource-group myResourceGroup --name myAKSCluster --node-count 1 --enable-addons monitoring --generate-ssh-keys
- 部署到 AKS:
$ kubectl apply -f deployment.yaml
21.3 Docker 与 Google Cloud
Google Kubernetes Engine (GKE):
GKE 是 Google Cloud 提供的托管 Kubernetes 服务,支持 Docker 容器的部署和管理。
- 创建 GKE 集群:
$ gcloud container clusters create my-cluster --num-nodes=1
- 部署到 GKE:
$ kubectl apply -f deployment.yaml
Google Container Registry (GCR):
GCR 是 Google Cloud 提供的托管 Docker 镜像服务。
- 登录 GCR:
$ gcloud auth configure-docker
- 推送镜像到 GCR:
$ docker tag my_image gcr.io/my-project/my_image:latest
$ docker push gcr.io/my-project/my_image:latest
22. Docker 安全最佳实践
确保 Docker 容器的安全性对于保护应用和数据至关重要。以下是一些 Docker 安全最佳实践。
22.1 使用非 root 用户
容器应使用非 root 用户运行,以减少潜在的安全风险。可以通过 Dockerfile 的 USER
指令设置容器用户。
- 示例:
FROM ubuntu
RUN useradd -m myuser
USER myuser
22.2 限制容器权限
使用 Docker 的安全选项,如 --cap-drop
和 --security-opt
,来限制容器的权限。
- 示例:
$ docker run --cap-drop ALL --security-opt no-new-privileges nginx
22.3 定期扫描镜像
使用工具如 Docker Bench for Security 和 Trivy 定期扫描 Docker 镜像,以发现潜在的漏洞和安全问题。
- 使用 Trivy 扫描镜像:
$ trivy image my_image
22.4 更新和修补
定期更新 Docker 和容器镜像,确保使用最新的安全修补程序和版本。
- 示例:
$ docker pull nginx:latest
22.5 使用 Docker Content Trust
启用 Docker Content Trust 以确保你从 Docker Hub 获取的镜像是经过签名的,防止受到篡改。
- 启用 Docker Content Trust:
$ export DOCKER_CONTENT_TRUST=1
23. Docker 性能优化
为了确保 Docker 容器的最佳性能,可以对 Docker 进行优化。以下是一些性能优化的建议。
23.1 优化镜像大小
减少镜像层数:
使用
RUN
指令合并命令,减少镜像层数,优化镜像大小。- 示例:
RUN apt-get update && apt-get install -y \
curl \
vim \
&& rm -rf /var/lib/apt/lists/*
选择合适的基础镜像:
选择体积小且功能足够的基础镜像,例如使用
alpine
代替ubuntu
。- 示例:
FROM alpine:latest
23.2 优化容器启动时间
预编译应用:
在构建镜像时预编译应用,减少容器启动时的编译时间。
- 示例:
COPY precompiled-app /app/
减少容器启动脚本的复杂度:
避免在启动脚本中执行复杂的操作,减少容器启动时间。
23.3 配置资源限制
设置适当的 CPU 和内存限制:
为容器设置合理的 CPU 和内存限制,确保容器在资源使用上的平衡。
- 示例:
$ docker run --memory="2g" --cpus="1.0" my_image
23.4 使用 Docker Compose 进行服务管理
定义服务:
使用 Docker Compose 文件来定义和管理多个服务,从而提高容器的组织性和性能管理能力。
- 示例:
version: '3'
services:
web:
image: nginx
ports:
- "80:80"
db:
image: postgres
environment:
POSTGRES_PASSWORD: example