开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第23天,点击查看活动详情
大家好,我是阿萨。上一次学习了docker compose的用法:[Docker学习笔记十:docker Compose]。本节课学习下如何使用它。
安装就不说了,上节课已经讲了。
创建 Compose 文件
-
在应用程序的根目录下,创建一个命名如下的文件
docker-compose.yml. -
在compose文件里,先定义一下版本。一般情况 下,都使用最新支持版本。
version: "3.7" -
下一步,定义容器或者服务列表。
version: "3.7" services:
现在开始,迁移一个服务到compose里。
定义应用的服务
使用如下命令来运行容器。
$ docker run -dp 3000:3000 \
-w /app -v "$(pwd):/app" \
--network todo-app \
-e MYSQL_HOST=mysql \
-e MYSQL_USER=root \
-e MYSQL_PASSWORD=secret \
-e MYSQL_DB=todos \
node:12-alpine \
sh -c "yarn install && yarn run dev"
如果是 PowerShell 使用如下命令:
PS> docker run -dp 3000:3000 `
-w /app -v "$(pwd):/app" `
--network todo-app `
-e MYSQL_HOST=mysql `
-e MYSQL_USER=root `
-e MYSQL_PASSWORD=secret `
-e MYSQL_DB=todos `
node:12-alpine `
sh -c "yarn install && yarn run dev"
-
首先定义服务的如何和容器镜像。可以给服务随便起个名字。这个名字会成为网络的别名。可以在定义MySQL的服务中使用.
-
version: "3.7" -
services: app: image: node:12-alpine -
接下来
command紧跟着image定义, 虽然没有前后顺序的要求,但是一般都是这么写。version: "3.7" services: app: image: node:12-alpine command: sh -c "yarn install && yarn run dev" -
通过
-p 3000:3000部分定义ports。version: "3.7" services: app: image: node:12-alpine command: sh -c "yarn install && yarn run dev" ports: - 3000:3000 -
接下来迁移路径 (
-w /app) 和卷映射 (-v "$(pwd):/app") 通过working_dir``和``volumes的定义.Docker Compose 的一个好处就是卷定义可以基于当前路径的相对路径。
version: "3.7" services: app: image: node:12-alpine command: sh -c "yarn install && yarn run dev" ports: - 3000:3000 working_dir: /app volumes: - ./:/app -
最后,迁移下环境变量,通过使用
environment关键字.version: "3.7" services: app: image: node:12-alpine command: sh -c "yarn install && yarn run dev" ports: - 3000:3000 working_dir: /app volumes: - ./:/app environment: MYSQL_HOST: mysql MYSQL_USER: root MYSQL_PASSWORD: secret MYSQL_DB: todos
定义 MySQL 服务
现在开始定义 MySQL 服务. 容器命令如下:
$ docker run -d \
--network todo-app --network-alias mysql \
-v todo-mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=secret \
-e MYSQL_DATABASE=todos \
mysql:5.7
PowerShell 的命令如下:
PS> docker run -d `
--network todo-app --network-alias mysql `
-v todo-mysql-data:/var/lib/mysql `
-e MYSQL_ROOT_PASSWORD=secret `
-e MYSQL_DATABASE=todos `
mysql:5.7
-
首先定义一个新的服务命名为
mysql的新服务。它会自动变成网络别名。version: "3.7" services: app: # The app service definition mysql: image: mysql:5.7 -
接下来的,开始卷映射. 运行
docker run, 命名卷就会自动创建.。运行 Compose的时候,不会自定创建卷映射。需要把卷定义在最顶层volumes:部分 .version: "3.7" services: app: # The app service definition mysql: image: mysql:5.7 volumes: - todo-mysql-data:/var/lib/mysql volumes: todo-mysql-data: -
最后,定义下环境变量。
version: "3.7" services: app: # The app service definition mysql: image: mysql:5.7 volumes: - todo-mysql-data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: secret MYSQL_DATABASE: todos volumes: todo-mysql-data:
设置好的 docker-compose.yml长这个样子 :
version: "3.7"
services:
app:
image: node:12-alpine
command: sh -c "yarn install && yarn run dev"
ports:
- 3000:3000
working_dir: /app
volumes:
- ./:/app
environment:
MYSQL_HOST: mysql
MYSQL_USER: root
MYSQL_PASSWORD: secret
MYSQL_DB: todos
mysql:
image: mysql:5.7
volumes:
- todo-mysql-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: todos
volumes:
todo-mysql-data:
运行应用程序stack
有了 docker-compose.yml 文件, 开始启动!
-
确保没有其他容器或者数据库在运行 (
docker ps和docker rm -f <ids>)命令查看。 -
启动用
docker compose up命令. 添加-d运行在后台。$ docker compose up -d期望输出如下:
Creating network "app_default" with the default driver Creating volume "app_todo-mysql-data" with default driver Creating app_app_1 ... done Creating app_mysql_1 ... done默认卷和网络都启动了, 容器编排自动创建了指定网络和应用程序栈。
-
查看日志
docker compose logs -f. 你会发现每个服务名字写在每行前面。用-f标志 表示生成的日志都会显示。mysql_1 | 2019-10-03T03:07:16.083639Z 0 [Note] mysqld: ready for connections. mysql_1 | Version: '5.7.27' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server (GPL) app_1 | Connected to mysql db at host mysql app_1 | Listening on port 3000查看指定应用的命令:``docker compose logs -f app).注意,数据库必须先于应用程序启动。
-
现在,应用程序启动了。
在 Docker Dashboard中查看应用程序栈
If查看 Docker Dashboard,可以看到一个组命名为 app. 这个项目名字来自 Docker Compose 用来给程序编排分组的。默认情况下项目名称被定义在文件docker-compose.yml里。
如果你下钻应用程序,你会看到我们在compose文件中定义的两个容器。这些名称也更具有描述性,因为它们遵循的模式是
<service-name>-<replica-number>. 所以,可以非常快速查看哪个是容器,那个是数据库。
关闭
准备关闭的时候用 docker compose down 或者点Dashboard里的垃圾桶按钮。
关闭了之后用 docker compose up 启动。
如果觉得阿萨的内容对你有帮助,欢迎围观点赞。