前言
使用docker run
命令可以很方便的启动一个项目容器,加上一些参数能够实现所有需要的功能.但是当管理多个或者几十个容器时,可能会忘记部分参数,导致一些问题.我们可以使用docker-compose
来启动容器.通过docker-compose.yml
将所有参数记录到配置文件中,方便管理和排查问题.
docker run
当容器本身无需过多的参数,例如无需-v
挂载目录,无需过多的-p
映射端口,无需-e
来指定环境.以及其他参数.完全可以使用最简单的docker run
命令来启动容器.
示例
例如用于测试 VPS 速度的的 speedtestx 容器.其中启动命令如下:
docker run -d --name speedtestx --restart always -p 8080:80 badapple9/speedtest-x
此容器无需存储任何数据,也没有其他过多的参数.只需要简单配置容器名 --name
,配置自动重启 --restart
,加上端口-p 8080:80
就可以方便的启动使用.
docker-compose
当启动一个复杂的容器,需要-v
,-p
,-e
等参数,可以将配置写入docker-compose.yml
配置文件,之后只需要保存好此项目的目录就可以方便的启动,停止,迁移容器.也无需担心忘记参数,或者丢失数据.
示例
docker run \
--name=tinymediamanager \
-p 4000:4000 \
-v </path/to/local/data/>:/data \
-v </path/to/movies>:/media/movies \
-v </path/to/tvshows>:/media/tvshows \
-v </path/to/addons/>:/app/addons \
tinymediamanager/tinymediamanager:latest
这样的命令就过于复杂,导致很容易出错和遗忘
转为 docker-compose.yml
将上述docker run
命令转为docker-compose.yml
配置文件.
version: 3.3
services:
tinymediamanager:
container_name: tinymediamanager
ports:
- 4000:4000
volumes:
- </path/to/local/data/>:/data
- </path/to/movies>:/media/movies
- </path/to/tvshows>:/media/tvshows
- </path/to/addons/>:/app/addons
image: tinymediamanager/tinymediamanager:latest
根据上述模版,可以很方便的把各种容器启动命令转为docker-compose
.
- image - 对应镜像
- container_name - 对应
--name
容器名 - ports - 对应
-p
端口映射 - volumes - 对应
-v
挂载文件和目录 - restart - 对应
--restart
重启参数
值得注意的几点
container_name
大多数情况下的容器建议定义container_name
容器名,但是有时候一台服务器中多个项目会同时使用例如nginx
,redis
,mysql
等常用容器,此时容器名就可能重复,在后期维护时也不太方便迅速辨别.
所以container_name
容器名称参数也可以删除
,如果删除,容器将以docker-compose.yml
所在文件夹的名称加上services名
加上同样容器数量定义,以上述为例,容器名将会为tinymediamanager
,更方便的一眼识别.
volumes
在docker-compose.yml
的规范参数中,volumes
的命名有三种,本文不在详细解释.在没有特殊需求时,挂载目录建议使用./
的相对目录,将一些需要存储的配置文件,数据文件直接存在容器项目目录下,docker-compose.yml
同一层级.后期的维护和迁移,只需要在此目录下操作和备份.
但是一些特殊挂载,需要挂载系统文件供容器使用,此时就必须使用绝对路径
.
docker-compose 更多常见参数
以下示例使用了-v
绝对路径,-e
环境变量,command
特殊命令参数.
docker run 示例
docker run -d \
--name watchtower \
--restart always \
-v /var/run/docker.sock:/var/run/docker.sock \
-e TZ=Asia/Shanghai \
-s "0 0 1 * * *" \
--cleanup \
containrrr/watchtower \
nginx redis
转为 docker-compose.yml
version: '3'
services:
watchtower:
container_name: watchtower
image: containrrr/watchtower:latest
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- TZ=Asia/Shanghai
- WATCHTOWER_CLEANUP=true
- WATCHTOWER_SCHEDULE=0 0 1 * * *
restart: always
command: nginx redis
上述配置文件中volumes
使用了绝对路径,使这个容器能访问系统docker.sock
目录,用于方便监控容器镜像的版本以便更新.其他的一些环境变量,例如时区,清理旧镜像,定时任务都转换为environment
,而特殊的command
命令则定义了指定监控nginx
和redis
两个容器.
分享一个工具网站可以直接将docker run转成docker-compose:
https://www.composerize.com/