写在前面
根据官方文档的介绍,Docker Compose是一个用于定义和运行多容器Docker应用程序的工具,它允许使用一个docker-compose.yml
文件来配置要启动的多容器应用服务,然后使用一条命令docker-compose up -d
就可以启动所有配置的服务
怎么说呢,它实际上是方便了去配置容器之间的通信,同时避免了在命令行输入冗长的命令,通过docker-compose.yml
文件让应用服务的配置更一目了然
我觉得还是比较推荐用Docker Compose替代命令行的docker run
,总之也看个人习惯吧
安装
通常安装Docker Engine的时候会默认安装Docker Compose,可以执行docker compose version
查看是否已经安装了Docker Compose并查看对应版本
如果想要安装最新版的Docker Compose,只需要到Github上下载对应自己操作系统的最新的二进制文件
然后把它重命名为docker-compose
(添加-
为了与默认的Docker Compose区分),并添加可执行权限(chmod +x docker-compose
)
最后将它复制到环境变量下的任意路径即可,一般可以复制到/usr/local/bin/
目录下,然后执行docker-compose version
,检查是否安装成功
使用
Docker Compose的使用主要在于编写docker-compose.yml
文件,然后执行Docker Compose相关命令控制docker-compose.yml
文件中的配置的应用服务的启动等操作
docker-compose.yml
看后缀就知道这显然是一个YAML文件,当然就需要按照YAML的语法编写
下面是一个docker-compose.yml
的编写示例:
version: "3.4" # 使用的Docker Compose文件版本
services:
web: # 定义web服务,这个名字可以随便取
image: "nginx:latest" # 使用nginx的最新版镜像
container_name: "nginx" # 这里是指定创建容器的名字
restart: "unless-stopped" # 重启策略:非正常退出时重启
volumes:
- "/docker/vaultwarden/data:/data" # 挂载宿主机目录
ports:
- "127.0.0.1:8000:80" # 端口映射
environment:
- TZ=Asia/Shanghai # 这部分用来设置多个环境变量
db:
image: "mysql:5.7"
...
...
docker-compose.yml
文件中用来配置服务的关键词除了实例中提供的之外还有很多,需要根据不同场景配置,通常可以参考官方的说明来编写
命令执行
在编写完docker-compose.yml
后就可以使用docker-compose up -d
启动配置中的容器并在后台运行
常用的其他命令:
docker-compose stop
:停止服务,但不删除
docker-compose down
:停止并删除所有服务及其相关网络,但不删除数据
docker compose down --volumes
:停止并删除所有服务及其相关网络,同时删除数据卷
docker-compose ps
:列出当前目录的所有服务及其状态
docker compose logs
:查看服务的日志输出。添加-f
参数可跟踪实时日志
docker compose run
:运行一个单独的服务,例如,docker compose run <service_name> <command>
会在指定的服务中运行一个命令
docker compose exec
:在运行的容器中执行命令,例如,docker compose exec <service_name> <command>
docker compose config
:查看配置,这个命令会显示最终的配置文件,合并并应用了所有配置文件
注意,docker compose
命令需要在包含docker-compose.yml
(或docker-compose.yaml
)文件的目录中运行
关于docker-compose.yml
文件的详细说明以及更多docker compose
命令的使用方法可以推荐看一下这篇博客,介绍的非常详细
后记
如果因为某些原因需要修改docker-compose.yml
文件,那么修改后可以直接执行docker-compose up -d
来应用修改后的配置,但要注意的是如果只是修改了环境变量或者端口映射等参数通常不会重新构建服务,也就是容器中的数据会保留;但如果修改了镜像,那么就会重构服务,原先的数据也会丢失
所以还是建议尽可能使用volume(目录挂载)来进行数据持久化,并根据情况做好数据备份