默认情况下,容器以隔离方式运行。它们对同一台计算机上的其他进程或容器一无所知。若要允许容器间进行通信,请使用网络。
如果两个容器在同一网络上,那么它们可彼此通信。如果没在同一网络上,则没法通信。
有两种方法可将容器放在网络上:在启动时进行分配,或者连接现有容器。 在此示例中,先创建网络,然后在启动时附加 MySQL 容器。
## 创建 Docker 网络
docker network create todo-app
## 使用这个 Docker 网络
## 命令指定了网络别名 mysql
docker run -d \
--network todo-app --network-alias mysql \
-v todo-mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=<your-password> \
-e MYSQL_DATABASE=todos \
mysql:5.7
##
使用 MySQL 运行应用
待办事项应用支持设置环境变量来指定 MySQL 连接设置。
- MYSQL_HOST MySQL 服务器的主机名。
- MYSQL_USER 要用于连接的用户名。
- MYSQL_PASSWORD 要用于连接的密码。
- MYSQL_DB 连接后要使用的数据库。
警告 对于开发,可以使用环境变量来设置连接设置。 在生产环境中运行应用程序时,不建议采用此做法。 有关详细信息,请参阅为何不该对机密数据使用环境变量。
更安全的机制是使用容器编排框架提供的机密支持。 在大多数情况下,这些机密作为文件装载到正在运行的容器中。 Why you shouldn’t use ENV variables for secret data
使用以下 docker run 命令。 该命令指定上面的环境变量。
docker run -dp 3000:3000 \
-w /app -v ${PWD}:/app \
--network todo-app \
-e MYSQL_HOST=mysql \
-e MYSQL_USER=root \
-e MYSQL_PASSWORD=<your-password> \
-e MYSQL_DB=todos \
node:12-alpine \
sh -c "yarn install && yarn run dev"
创建 Docker Compose 文件
Docker Compose 有助于定义和共享多容器应用程序。 使用 Docker Compose,你可以创建用于定义服务的文件。 使用单个命令,可以启动所有内容,也可以将其全部销毁。
可以在文件中定义应用程序堆栈,并将该文件保存在项目存储库的根目录下,受版本控制。 利用此方法,其他人也可以参与你的项目。 他们只需克隆你的存储库。
- 在应用项目的根目录中,创建名为
docker-compose.yml
的文件。 - 在 Compose 文件中,首先定义架构版本。
version: "3.7"
在大多数情况下,最好使用支持的最新版本。 有关当前架构版本和兼容性矩阵,请参阅 Compose 文件。
3.定义要作为应用程序的一部分运行的服务(或容器)列表。
version: "3.7"
services:
4.下面是用于应用容器的命令。 将此信息添加到 .yml 文件。
docker run -dp 3000:3000
-w /app -v ${PWD}:/app
--network todo-app
-e MYSQL_HOST=mysql
-e MYSQL_USER=root
-e MYSQL_PASSWORD=<your-password>
-e MYSQL_DB=todos
node:12-alpine
sh -c "yarn install && yarn run dev"
定义容器的服务项和映像。
version: "3.7"
services:
app:
image: node:12-alpine
你可为服务选择任何名称。 该名称会自动成为网络别名,这在定义 MySQL 服务时非常有用。
5.添加命令。
version: "3.7"
services:
app:
image: node:12-alpine
command: sh -c "yarn install && yarn run dev"
6.指定用于服务的端口,该端口对应于上述命令中的 -p 3000:3000。
version: "3.7"
services:
app:
image: node:12-alpine
command: sh -c "yarn install && yarn run dev"
ports:
- 3000:3000
7.指定工作目录和卷映射
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
在 Docker Compose 卷定义中,你可以使用当前目录中的相对路径。
8.指定环境变量定义。
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: <your-password>
MYSQL_DB: todos
9.添加 MySQL 服务的定义。 下面是你在上面所使用的命令:
docker run -d
--network todo-app --network-alias mysql
-v todo-mysql-data:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=<your-password>
-e MYSQL_DATABASE=todos
mysql:5.7
定义新服务,并将其命名为 mysql。 在 app 定义后以相同的缩进级别添加文本。
version: "3.7"
services:
app:
# The app service definition
mysql:
image: mysql:5.7
该服务会自动获取网络别名。 指定要使用的映像。
`0.定义卷映射。
使用与 services: 相同级别的 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: <your-password>
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: <your-password>
MYSQL_DB: todos
mysql:
image: mysql:5.7
volumes:
- todo-mysql-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: <your-password>
MYSQL_DATABASE: todos
volumes:
todo-mysql-data:
运行应用程序堆栈
现在,已拥有 docker-compose.yml 文件,请试运行看看。
1.确保应用和数据库的其他副本未运行。 在 Docker 扩展中,右键单击任何正在运行的容器,然后选择“移除”。 或者,在命令行中,使用 docker rm 命令,如前面的示例所示。
2.在“VS Code 资源管理器”中,右键单击 docker-compose.yml,然后选择“Compose Up”。 或者,在命令行中,使用此 docker 命令。
docker-compose up -d
利用参数 -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 会专门为应用程序堆栈创建网络。
3.删除
docker-compose down
EOF
Power by TeXt.