3.7 多容器应用
到目前为止,我们一直在使用单容器应用程序。但是,我们现在想要将 MySQL 添加到应用程序堆栈中。经常会出现以下问题——“MySQL 将运行在哪里?安装在同一个容器中还是单独运行?” 一般来说,**每个容器都应该做一件事,并且把它做好。**几个原因:
- 您很有可能必须以不同于数据库的方式扩展 API 和前端
- 单独的容器让您可以隔离版本和更新版本
- 虽然您可以在本地为数据库使用容器,但您可能希望在生产环境中为数据库使用托管服务。那时您不想将数据库引擎与您的应用程序一起发布。
- 运行多个进程将需要一个进程管理器(容器只启动一个进程),这增加了容器启动/关闭的复杂性
还有更多的原因。所以,我们将更新我们的应用程序,让它像这样工作:
容器网络
请记住,默认情况下,容器是独立运行的,对同一台机器上的其他进程或容器一无所知。那么,我们如何让一个容器与另一个容器通信呢?答案是 联网。现在,您不必成为网络工程师(万岁!)。只要记住这个规则…
笔记
如果两个容器在同一个网络上,它们可以相互通信。如果不在的话,将无法通信。
启动 MySQL
有两种方法可以将容器放在网络上:
-
在开始时分配它
-
连接现有容器。现在,我们将首先创建网络并在启动时附加 MySQL 容器。
-
创建网络。
$ docker network create todo-app
-
启动一个 MySQL 容器并将其连接到网络。我们还将定义一些环境变量,数据库将使用这些变量来初始化数据库(请参阅MySQL Docker Hub 列表中的“环境变量”部分)。
$ 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.25
如果您使用的是基于 ARM 的芯片,例如 Macbook M1 芯片/Apple Silicon,请使用此命令。
$ docker run -d \ --network todo-app --network-alias mysql \ --platform "linux/amd64" \ -v todo-mysql-data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=secret \ -e MYSQL_DATABASE=todos \ mysql:5.7.25
如果您使用的是 Windows,则在 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=to