前言
使用 docker run命令可以很方便的启动一个项目容器,加上一些参数能够实现所有需要的功能.但是当管理多个或者几十个容器时,可能会忘记部分参数,导致一些问题.我们可以使用 docker-compose来启动容器.通过 docker-compose.yml将所有参数记录到配置文件中,方便管理和排查问题.
docker run
当容器本身无需过多的参数,例如无需 -v挂载目录,无需过多的 -p映射端口,无需 -e来指定环境.以及其他参数.完全可以使用最简单的 docker run命令来启动容器.
示例
例如用于测试 VPS 速度的的 speedtestx 容器.其中启动命令如下:
1 |
<pre class="inline:true decode:1 " >docker run -d --name speedtestx --restart always -p 8080:80 badapple9/speedtest-x |
此容器无需存储任何数据,也没有其他过多的参数.只需要简单配置 容器名 --name,配置 自动重启 --restart,加上端口 -p 8080:80就可以方便的启动使用.
docker-compose
安装与使用
docker-compose 的安装请参考 CentOS 7 安装 docker compose 教程
在任意目录创建项目目录,并在该目录下创建
docker-compose.yml配置文件,编写完毕执行启动命令.
1 2 3 4 5 6 7 8 9 10 |
<pre class="inline:true decode:1 " >mkdir serverstatus # 创建项目目录 cd serverstatus # docker-compose 命令需要进入目录执行 vi docker-compose.yml # 创建编辑配置文件 docker-compose up -d # 启动 docker-compose docker-compose down # 停止 docker-compose |
当启动一个复杂的容器,需要 -v, -p, -e等参数,可以将配置写入 docker-compose.yml配置文件,之后只需要保存好此项目的目录就可以方便的启动,停止,迁移容器.也无需担心忘记参数,或者丢失数据.
docker run 示例
例如本站发布过的 ServerStatus 项目,需要保存配置文件和修改 Web 文件,还需要映射端口到宿主机使用,其命令如下:
1 2 3 4 5 6 |
<pre class="inline:true decode:1 " >docker run -d --name serverstatus --restart always / -p 8080:80 / -p 35601:35601 / -v ~/ServerStatus/config.json:/ServerStatus/server/config.json / -v ~/ServerStatus/web:/usr/share/nginx/html / stilleshan/serverstatus |
转为 docker-compose.yml
将上述 docker run命令转为 docker-compose.yml配置文件.
1 2 3 4 5 6 7 8 9 10 11 12 |
<pre class="inline:true decode:1 " >version: "3" services: serverstatus: image: stilleshan/serverstatus container_name: serverstatus ports: - 8080:80 - 35601:35601 volumes: - ./config.json:/ServerStatus/server/config.json - ./web:/usr/share/nginx/html restart: always |
根据上述模版,可以很方便的把各种容器启动命令转为 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名加上同样容器数量定义,以上述为例,容器名将会为
serverstatus_serverstatus_1,更方便的一眼识别.
volumes
在
docker-compose.yml的规范参数中,
volumes的命名有三种,本文不在详细解释.在没有特殊需求时,挂载目录建议使用
./的相对目录,将一些需要存储的配置文件,数据文件直接存在容器项目目录下,
docker-compose.yml同一层级.后期的维护和迁移,只需要在此目录下操作和备份.
但是一些特殊挂载,需要挂载系统文件供容器使用,此时就必须使用
绝对路径.
docker-compose 更多常见参数.
以下示例使用了 -v绝对路径, -e环境变量, command特殊命令参数.
docker run 示例
1 2 3 4 5 6 7 8 9 |
<pre class="inline:true decode:1 " >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
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<pre class="inline:true decode:1 " >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-compose的一些基本参数用法,但是 docker-compose主要是为了编排多个容器运行使用,功能非常强大,本文的功能仅仅只是九牛一毛.关于更多的功能和用法可以参考官方文档.本站后续也会分享更多的相关使用经验.
本站提供免费和付费的技术支持.你可以通过留言,邮件,TG群的方式来技术交流和免费咨询.同时也可以付费支持的方式获得相关的技术支持,项目部署配置等服务.具体相关详情请点击查看 技术支持页面