让我们开始使用Docker Compose(优势和常用配置)
非常感谢大家对上一篇“从今天开始学习Docker入门(先理解其必要性再动手)”的支持,我介绍了如何在不使用Docker Compose的情况下运行Docker,以及其必要性的解释。收到了许多赞和收藏,非常高兴,再次感谢大家!
这次我们想要提供更实践性的内容,所以我想要解释一下docker compose的各种情况。
Docker Compose 是什么?
首先,我会引用官方的说明。
Compose 是用于定义和运行 Docker 应用程序的工具,它可以定义多个容器。Compose 使用 YAML 文件来配置应用程序的服务。只需执行一个命令,就可以根据配置生成和启动所有的服务。要了解Compose的功能列表,请参阅功能列表。
因为有些难以理解,所以简单解释一下。通过将启动配置写入YAML文件,可以使用一个命令启动多个Docker容器。
为什么感到高兴?
为了理解Docker Compose,让我们考虑一下“为什么使用Docker Compose很开心”。
我们可以以此页面上的官方示例为例进行思考(由于文章中使用了nginx作为web容器,因此将容器端口从5000更改为80)。
首先,使用Docker Compose执行。
我正在尝试创建一个web容器和一个redis容器,并且web容器将通过网络连接到redis容器。另外,web容器还有一个名为logvolume01的独立卷。
compose.yaml(webサービスには別途Dockerfileの用意が必要となりますね)
version: "3.9" # v1.27.0 からはオプション
services:
web:
build: .
ports:
- "8000:80"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
起動するには
% docker compose build
% docker compose up
只需要这个就可以了!
docker composeでやってくれることをdockerコマンドだけでやろうとした場合
只需要一个选项就能启动
首先,要构建网页图像。
% docker build -t qiita-docker-compose-nginx -f Dockerfile ./
// docker build -t qiita-docker-compose-nginx ./ と一緒
建立网络
% docker network create -d bridge qiita-docker-compose-network
下一步是增加音量。
% docker volume create logvolume01
redisコンテナ立ち上げる
% docker run -dit --name qiita-docker-compose-redis --network qiita-docker-compose-network -d redis
启动 web 容器
docker run -dit --name qiita-docker-compose-nginx -p 8000:80 -v logvolume01:/var/log --network qiita-docker-compose-network qiita-docker-compose-nginx
どう考えたって、引数いくつもあるコマンドを何個も順々に実行してくより、設定はファイル化してあってコマンド一発で実行できるほうがいいに決まってる
你试试对比一下,觉得怎么样?
READMEとかに、これらのdockerコマンドの記載があって、上から順にコマンドを実行していけばもちろんできますが、いちいち一個ずつコピペするのは面倒ですし、ひとつひとつが独立したコマンドのため、いつかどこかで整合性がとれなくなるタイミングがありそうな気がします
一方、docker composeを利用していれば、「そこにcompose.yamlがあるなら、そこでdocker compose upを実行すれば良い」ということになります
どこに手順あるかなーなんて悩む必要がないというわけです
さらに、docker composeという世間一般のルールの中で環境を運用できるので、困ったら世の中にドキュメントがたくさんあります
使い所は?
「開発者に展開するローカル開発環境として」という用途が主になるかと思います
共通の開発環境などとしてAWS EC2とかで利用することもできなくないですが、ネットワーク設定などはAWSの機能を利用して設定するべきだと思うし、1つのEC2の中に複数のサービスを立ち上げることは最近の動向を考えるとあまり得策だとは言えないのだと思います
如果有希望在承担一定的不完美和风险的情况下降低AWS运营成本,那么请务必检查这些方面的设置!
让我们使用简单的结构创建一个Docker Compose吧。
由于使用官方的内容来创建并尝试实施太无聊了,所以我们稍微调整一下以适应更常见的用途,并创建并运行docker compose。
我已经把我们这次使用的素材推送到这里了!
思考文件夹结构
我打算按照以下的结构进行:
app: 我预设应用程序的根目录
docker: 放置与docker相关的文件的地方
我认为在docker文件夹下,根据每个docker compose的服务名创建相应的文件夹是个好主意。
.env文件定义了要传递给docker容器的环境变量。
Docker文件是描述每个容器的构建脚本,并作为镜像的基础。
.
├── .env
├── app
│ └── index.html
├── compose.yaml
└── docker
├── apache
│ └── Dockerfile
└── db
└── my.cnf
准备一个Docker Compose文件。
只需要准备compose.yaml文件并build/up,所以Docker Compose非常简单。
虽然需要记住compose.yaml的写法,但是一般只会用到有限的几种,并且我们可以逐步学习。
version: "3"
services:
web:
container_name: qiita-docker-compose-web
build:
context: .
dockerfile: ./docker/apache/Dockerfile
ports:
- "8000:80"
volumes:
- ./app:/usr/local/apache2/htdocs:delegated
depends_on:
db:
condition: service_healthy
restart: true
db:
container_name: qiita-docker-compose-db
image: mysql:8.2
command: --default-authentication-plugin=mysql_native_password
env_file: .env
volumes:
- ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p$MYSQL_ROOT_PASSWORD"]
timeout: 20s
retries: 5
网络服务
容器名称
容器的名称通常会按照“根目录名称+服务名称+n(数字)”的格式命名,而在本案例中,它被设置为“qiita-docker-compose-web-1”。但是,使用这个设置,您可以为容器设置别名。
建造
您可以指定 Dockerfile 的位置
港口
通过将主机端口和容器端口连接起来进行配置。
通过连接Apache的默认端口80和主机端口8000,您可以通过localhost:8000进行访问。
卷
ホストのディレクトリをコンテナのファイルシステムにマウントする設定です
これにより、ホストPC内にあるリソース(主に変更のかかるソースファイルなど)をコンテナ内に共有できます
取决于
设定服务之间的依赖关系。在这种情况下,Web服务指定数据库服务为其依赖目标,这样容器之间也可以进行连接。
数据库服务
不提供container_name和volumes的详细说明,也不提供参考链接,请自行搜索。
图片 (tú
buildではDockerファイルを指定して、それによってできたイメージをコンテナとしてupしますが、こちらはイメージそのものを指定できます
docker hubにあるイメージなどが代表的です
今回ではmysqlの8.2タグをイメージとして指定してます
命令
您可以覆盖Dockerfile内的CMD命令。
※ CMDはDockerfile内で1度しか利用できないというルールがあるため、「CMDが複数ある場合はどうなんだ」という疑問は的外れになります
环境文件
读取以「变量=值」格式描述的文件,并将其设置为容器内的环境变量。
健康检查
起動するコンテナが現在正常かどうかをどう確認するかを指定します
今回なぜ指定しているかというと、webコンテナの起動はdbコンテナ内のmysql起動が完了したタイミングで立ち上げたいためです
depends_onの設定のみだとdbコンテナの起動までしか待ってもらえず、mysqlの起動完了を待てないという都合があります
それをhealthcheckとdepends_on.conditionを使って要件を実現しようというとこです
常见问题
修改了compose.yaml文件之后需要重新构建吗?
不需要!但是如果修改了Dockerfile,则需要重新构建。
使用docker compose up -d命令启动的容器,如何停止它们?
首先,”-d”选项是一个在后台运行容器的选项,这样一来,你就无法使用”ctrl + C”来停止容器了。
在这种情况下,使用以下命令来停止命令。
% docker compose stop
yaml文件的名字究竟哪个是正确的?
今回の記事を書くにあたって私自身も知識をアップデートしたのですが、現状公式が推奨しているファイル名は「compose.yaml」みたいですね
听起来似乎以下的行为也是可以被允许的。
-
- compose.yml
-
- docker-compose.yaml(下位互換性のため
- docker-compose.yml(下位互換性のため
顺便一提,命令也不知不觉地从「docker-compose」变成了「docker compose」,是想取消连字符吗?
建议
太棒了-优秀的创作
docker compose在官方提供了以下的GitHub仓库,请务必学习和运用其中丰富的docker compose实例,为你的项目提供帮助!(我自己还没有仔细看过,先去看看吧!)
关于文件夹结构
最近经常看到这种结构。
我觉得通常情况下,应用程序会按照后端应用程序、前端应用程序等单位进行分类,但是在每个文件夹中都存在Dockerfile的结构,在考虑部署的单元时,这样做似乎是合理的。
这样做的话,将来需要将app单独提取出来并转移到另一个项目中时也会更加方便。
.
├── .env
├── app
│ └── Dockerfile
├── docker-compose.yml
└── local
└── db
└── my.cnf