Docker是现代软件开发和部署中不可或缺的工具,它允许开发者打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。
1. Docker镜像命令
1.1 拉取镜像
docker pull [OPTIONS] NAME[:TAG|@DIGEST] |
- 解释:从Docker Hub或其他配置的注册表中拉取镜像。
- 示例:拉取最新版本的Nginx镜像。
docker pull nginx:latest |
1.2 查看镜像列表
docker images [OPTIONS] [REPOSITORY[:TAG]] |
- 选项:
-a
,--all
:显示所有镜像(默认只显示最新的)。-q
,--quiet
:仅显示镜像ID。
- 示例:
-
显示所有镜像:
docker images -a
-
仅显示镜像ID:
docker images -q
-
1.3 删除镜像
docker rmi [OPTIONS] IMAGE [IMAGE...] |
- 选项:
-f
,--force
:强制删除镜像,即使该镜像被其他镜像所依赖。
- 示例:
-
强制删除名为
nginx:latest
的镜像:docker rmi -f nginx:latest
-
2. Docker容器命令
2.1 运行容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...] |
- 常用选项:
-d
,--detach
:后台运行容器,并返回容器ID。-i
,--interactive
:即使没有附加也保持STDIN开放。-t
,--tty
:分配一个伪终端。--name
:为容器指定一个名称。
- 示例:
-
在后台运行一个名为
my_nginx
的Nginx容器:docker run -d --name my_nginx nginx:latest
-
2.2 查看容器列表
docker ps [OPTIONS] |
- 选项:
-a
,--all
:显示所有容器(默认只显示运行的)。-q
,--quiet
:仅显示容器ID。
- 示例:
-
显示所有容器(包括未运行的):
docker ps -a
-
仅显示容器ID:
docker ps -aq
-
2.3 停止容器
docker stop [OPTIONS] CONTAINER [CONTAINER...] |
- 示例:
-
停止名为
my_nginx
的容器:docker stop my_nginx
-
2.4 启动容器
docker start [OPTIONS] CONTAINER [CONTAINER...] |
- 示例:
-
启动名为
my_nginx
的容器:docker start my_nginx
-
2.5 进入容器
docker exec [OPTIONS] CONTAINER COMMAND [ARG...] |
- 常用选项:
-it
:通常一起使用,-i
保持STDIN开放,-t
分配一个伪终端。
- 示例:
-
进入名为
my_nginx
的容器,并启动bash:docker exec -it my_nginx bash
-
2.6 删除容器
docker rm [OPTIONS] CONTAINER [CONTAINER...] |
- 选项:
-f
,--force
:强制删除正在运行的容器(会先停止容器)。
- 示例:
-
强制删除名为
my_nginx
的容器:docker rm -f my_nginx
-
3. Docker Compose命令
Docker Compose是Docker的官方编排工具,用于定义和运行多容器Docker应用程序。
3.1 启动服务
docker-compose up [options] [--scale SERVICE=NUM...] [SERVICE...] |
-
解释:此命令用于构建、(重新)创建、启动和附加到由
docker-compose.yml
文件定义的容器和服务。如果服务没有运行,它们会被创建并启动。如果已经运行,docker-compose up
会重新创建它们(除非使用--no-recreate
选项),并附加到容器的标准输入/输出/错误。 -
常用选项:
-d
:在后台运行服务,并打印容器ID。--build
:在启动之前构建镜像,即使它们已经存在。--scale
:为指定的服务设置运行容器的数量。
-
示例:
-
在后台启动所有服务:
docker-compose up -d
-
在启动之前构建镜像,并启动所有服务:
docker-compose up --build
-
将
web
服务的容器数量扩展到3个:docker-compose up --scale web=3
-
3.2 停止服务
docker-compose down [options] |
-
解释:停止并移除由
docker-compose.yml
定义的所有容器、网络、卷、镜像(由--rmi
或--remove-images
指定)和默认网络。 -
常用选项:
--rmi
,--remove-images
:停止服务后,移除构建此服务的镜像。-v
,--volumes
:移除服务使用的卷。
-
示例:
-
停止并移除所有容器、网络和卷(如果需要):
docker-compose down -v
-
停止服务并移除所有容器、网络和镜像:
docker-compose down --rmi --volumes
-
3.3 查看服务状态
虽然docker-compose
没有直接的命令来“查看服务状态”,但可以使用docker-compose ps
来列出当前运行的服务及其状态。
docker-compose ps [options] [SERVICE...] |
-
解释:列出由
docker-compose.yml
定义的服务及其容器ID、端口、状态等信息。 -
选项:
-q
:仅显示容器ID。
-
示例:
-
列出所有服务的状态:
docker-compose ps
-
仅列出容器ID:
docker-compose ps -q
-
3.4 Docker Compose 重启服务
有时候,可能需要重启一个或多个服务而不是完全停止并重新创建它们。Docker Compose 提供了 restart
命令来实现这一点。
docker-compose restart [options] [SERVICE...] |
-
解释:重启由
docker-compose.yml
定义的一个或多个服务。 -
选项:
-t
,--timeout TIMEOUT
:指定重启服务前的超时时间(秒)。
-
示例:
-
重启所有服务:
docker-compose restart
-
重启名为
web
的服务:docker-compose restart web
-
3.5 Docker Compose 日志
查看服务的日志是调试和监控应用行为的重要部分。Docker Compose 提供了 logs
命令来访问这些日志。
docker-compose logs [options] [SERVICE...] |
-
解释:查看由
docker-compose.yml
定义的服务日志。 -
选项:
--follow
,-f
:持续跟踪日志输出。--tail="all"
:从日志末尾显示指定数量的行。默认为“all”。
-
示例:
-
查看所有服务的日志:
docker-compose logs
-
持续跟踪
web
服务的日志:docker-compose logs -f web
-
3.6 Docker Compose 配置文件
Docker Compose 支持使用多个配置文件,这允许根据环境(如开发、测试、生产)定义不同的服务配置。
docker-compose -f <file> ... [options] [COMMAND] [ARGS...] |
-
解释:
-f
或--file
选项允许指定一个或多个 Compose 配置文件。可以通过多次使用-f
选项来指定多个文件。 -
示例:
-
使用自定义的
docker-compose.override.yml
文件来覆盖默认配置:docker-compose -f docker-compose.yml -f docker-compose.override.yml up
-
3.7 Docker Compose 版本
了解正在使用的 Docker Compose 版本对于解决问题和兼容性检查非常有用。
docker-compose --version |
- 解释:显示 Docker Compose 的版本信息。
4. Docker 镜像和容器的其他命令
4.1 保存和加载镜像
可以将镜像保存为一个文件,然后将其加载到另一个 Docker 主机上。
-
保存镜像:
docker save -o <path_to_save_image> <image_name>
-
加载镜像:
docker load -i <path_to_image_file>
4.2 容器端口映射
当运行容器时,经常需要将容器的端口映射到宿主机的端口上。这可以通过 docker run
命令的 -p
或 --publish
选项来实现。
docker run -p <host_port>:<container_port> <image_name> |
-
示例:
docker run -p 8080:80 nginx:latest
这个命令会将容器的 80 端口映射到宿主机的 8080 端口上。
5. Docker Compose 环境变量
Docker Compose允许通过环境变量来配置服务,这使得在不同环境中部署应用变得更加灵活。可以在docker-compose.yml
文件中使用环境变量占位符,然后在运行docker-compose
命令时通过-e
选项或.env
文件来设置这些环境变量的值。
使用.env
文件
在项目的根目录下创建一个.env
文件,并在其中定义环境变量。然后,在docker-compose.yml
文件中引用这些环境变量。
示例 .env
文件:
DB_HOST=db
DB_USER=admin
DB_PASS=secret
示例 docker-compose.yml
引用:
version: '3'
services:
web:
image: my-web-app
environment:
- DB_HOST=${DB_HOST}
- DB_USER=${DB_USER}
- DB_PASS=${DB_PASS}
使用-e
选项
也可以在运行docker-compose
命令时直接使用-e
选项来设置环境变量。
docker-compose up -e DB_HOST=db -e DB_USER=admin -e DB_PASS=secret |
6. Docker Compose 配置文件扩展
除了使用多个-f
选项来指定多个配置文件外,Docker Compose还支持通过extends
关键字在多个配置文件中共享配置。然而,需要注意的是,extends
关键字在Docker Compose文件版本3及以上已被弃用,因为它可能导致配置难以理解和维护。
作为替代,可以使用YAML的锚点(&
)和别名(*
)功能,或者简单地将共享配置放在一个或多个基础配置文件中,并在需要时通过-f
选项包含它们。
7. Docker 网络
Docker网络允许容器之间进行通信。Docker Compose会自动为项目创建一个默认网络,但也可以自定义网络配置。
示例 docker-compose.yml
定义自定义网络:
version: '3'
networks:
default:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/16
8. Docker Compose 命令行工具的高级用法
Docker Compose命令行工具还提供了许多其他有用的命令和选项,例如:
docker-compose exec
:在运行的容器中执行命令。docker-compose pause
和docker-compose unpause
:暂停和恢复服务。docker-compose port
:打印绑定的端口。docker-compose top
:显示容器中运行的进程。
9. Docker 容器卷
容器卷是Docker用于存储和持久化数据的机制。你可以将卷附加到容器上,以便在容器重启时保留数据。
在docker-compose.yml
中,你可以使用volumes
关键字来定义卷,并将其挂载到服务的容器中。
示例 docker-compose.yml
定义卷:
# Docker Compose 文件版本 3
version: '3'
# 定义服务
services:
# 服务名称: db
db:
# 使用的镜像名称
image: postgres
# 挂载的卷配置
volumes:
# 将名为 db-data 的卷挂载到容器的 /var/lib/postgresql/data 目录
# 这个目录是PostgreSQL存储其数据库文件的地方
- db-data:/var/lib/postgresql/data
# 定义卷
volumes:
# 卷名称: db-data
db-data:
# 在这个简单的例子中,没有为卷指定额外的配置(如驱动程序或选项)
# 默认情况下,Docker会使用本地驱动程序来创建和管理这个卷
# 这个卷将用于存储PostgreSQL数据库的数据,确保即使容器被删除,数据也不会丢失
# 注意:在Compose文件中直接定义卷时,不需要指定外部属性(如external: true),
# 除非你想引用一个已经在Docker中存在的卷
这个配置文件的作用是:
- 使用
postgres
镜像创建一个名为db
的容器服务。 - 创建一个名为
db-data
的Docker卷,并将其挂载到db
容器的/var/lib/postgresql/data
目录上。这样做的目的是让PostgreSQL的数据(如数据库文件、表等)被存储在Docker卷中,而不是容器的可写层中。这样做的好处是,即使容器被删除并重新创建,存储在卷中的数据也会保持不变,从而实现了数据的持久化。
此外,需要注意的是,由于这个docker-compose.yml
文件直接定义了db-data
卷,因此当您首次使用docker-compose up
命令启动服务时,Docker会自动创建这个卷。如果希望引用一个已经存在的卷(可能是之前创建的,或者是通过其他方式管理的),可以在卷定义中添加external: true
属性,并省略卷的详细配置。然而,在这个简单的例子中,我们直接让Docker自动管理卷的创建和删除。
10.Docker 命令中的 -it
在 Docker 的 docker run
命令中,-it
是两个选项的组合,-i
和 -t
,它们通常一起使用以提供交互式的终端。
-i
或--interactive
:保持容器的标准输入(STDIN)开放,即使没有附加任何东西也是如此。这允许用户与容器内的进程进行交互。-t
或--tty
:分配一个伪终端(pseudo-TTY)或终端。这允许用户像在使用普通终端一样与容器交互,包括处理信号和窗口大小变化等。
组合使用:-it
一起使用时,提供了一个完整的交互式终端,让用户能够像在本地终端中一样与容器中的程序进行交互。
其他常用 Docker 命令选项
-
--name
:为容器指定一个名称。如果不指定,Docker 会自动生成一个随机名称。docker run --name my-container-name -it ubuntu /bin/bash
-
-d
或--detach
:在后台运行容器,并打印容器 ID。这允许你运行容器并在需要时附加到它,而不是阻塞终端。docker run -d --name my-detached-container ubuntu /bin/bash -c "while true; do echo hello world; sleep 1; done"
-
-p
或--publish
:发布容器端口到主机上。格式为<主机端口>:<容器端口>
。docker run -p 8080:80 --name my-web-server nginx
-
--rm
:容器停止后自动删除容器。这有助于清理不再需要的容器,避免占用额外的磁盘空间。docker run --rm -it ubuntu /bin/bash
-
--env
或-e
:设置环境变量。这允许你传递配置信息到容器中运行的程序。docker run -e MY_VAR=myvalue -it ubuntu /bin/bash
-
--volume
或-v
:挂载卷。这允许你将主机上的目录或文件挂载到容器内的指定位置,实现数据持久化或共享数据。docker run -v /my/host/dir:/my/container/dir -it ubuntu /bin/bash
-
--network
:指定容器运行的网络。Docker 提供了多种网络模式,包括桥接(bridge)、主机(host)、覆盖(overlay)等。docker run --network my-custom-network -it ubuntu /bin/bash
Docker 的 docker run
命令提供了丰富的选项,允许用户以灵活的方式运行容器。-it
选项的组合特别有用,因为它们提供了一个交互式终端,让用户能够直接与容器内的程序交互。其他选项如 --name
、-d
、-p
、--rm
、--env
、--volume
和 --network
则提供了更多的控制和灵活性,让用户能够根据自己的需求定制容器的运行方式。
11. Docker Swarm 与 Docker Compose
虽然Docker Compose主要用于单机部署,但Docker Swarm允许使用类似的docker-compose.yml
文件来定义和管理跨多个Docker节点的服务。Docker Stack命令(如docker stack deploy
)允许使用Compose文件在Swarm集群上部署应用。
12. Docker Compose 的版本控制
由于docker-compose.yml
文件是定义服务、网络和卷等的核心配置文件,因此它应该被纳入版本控制系统(如Git)中。这有助于跟踪配置更改,促进团队协作,并确保开发、测试和生产环境之间的一致性。
13. Docker Compose 的安全性考虑
- 镜像安全:确保使用的Docker镜像来自可信源,并且是最新的,以避免已知漏洞。
- 网络隔离:通过Docker网络隔离服务,减少潜在的攻击面。
- 访问控制:使用Docker的访问控制功能(如Docker Content Trust)来验证镜像的完整性和来源。
- 环境变量管理:避免在
docker-compose.yml
文件中硬编码敏感信息(如数据库密码)。使用环境变量或加密的配置管理工具来管理这些敏感信息。
14. Docker Compose 与 CI/CD 集成
Docker Compose可以轻松地与持续集成/持续部署(CI/CD)工具集成,以实现自动化的构建、测试和部署流程。
- 构建阶段:在CI流程中,使用Dockerfile构建镜像,并推送到Docker仓库。
- 测试阶段:使用Docker Compose启动服务并运行自动化测试,以确保新代码不影响现有功能。
- 部署阶段:在CD流程中,使用Docker Compose(或Docker Stack,对于Swarm集群)将服务部署到生产环境。
15. Docker Compose 的扩展性
虽然Docker Compose主要用于单机部署,但它可以通过与Docker Swarm或Kubernetes等容器编排工具结合使用来实现更高级别的扩展性和容错性。
- Docker Swarm:使用Docker Stack命令将Compose文件部署到Swarm集群,以实现跨多个节点的服务部署和扩展。
- Kubernetes:虽然Kubernetes不使用Compose文件,但你可以使用工具(如Kompose)将Compose文件转换为Kubernetes的YAML配置文件,然后利用Kubernetes的强大功能来管理容器化应用。
16. Docker Compose 的性能优化
- 资源限制:在
docker-compose.yml
中设置容器的CPU和内存限制,以避免单个服务占用过多资源而影响其他服务。 - 镜像优化:优化Dockerfile以减少镜像大小和提高构建速度。
- 网络优化:根据应用的需求选择合适的网络驱动和配置,以减少网络延迟和提高吞吐量。
17. Docker Compose 的最佳实践
- 使用标签:为镜像和服务添加有意义的标签,以便于版本控制和管理。
- 文档化:为
docker-compose.yml
文件和相关的Dockerfile编写清晰的文档,说明每个服务的配置和依赖关系。 - 模块化:将服务拆分成多个小的、可重用的模块,并在需要时通过Compose文件组合它们。
- 持续监控:使用监控工具(如Prometheus、Grafana)来跟踪服务的性能和健康状态。