多容器應用程式
到目前為止,您一直使用單容器應用程式。但是,現在您將把 MySQL 加入應用程式堆疊。經常出現以下問題:「MySQL 將在哪裡執行?將它安裝在同一個容器中還是單獨執行?」一般來說,每個容器應該只做一件事,並且把它做好。以下是單獨執行容器的一些原因
- 您很有可能需要以不同於資料庫的方式擴展 API 和前端。
- 單獨的容器允許您獨立地進行版本控制和更新。
- 雖然您可以在本地使用容器作為資料庫,但在生產環境中,您可能希望使用託管服務作為資料庫。這樣您就不需要將資料庫引擎與應用程式一起發佈。
- 執行多個行程需要行程管理器(容器只啟動一個行程),這會增加容器啟動/關閉的複雜性。
還有更多原因。因此,如下圖所示,最好在多個容器中執行您的應用程式。


容器網路
請記住,預設情況下,容器是隔離執行的,它們不知道同一台機器上的其他行程或容器。那麼,如何允許一個容器與另一個容器通話呢?答案是網路。如果您將兩個容器放在同一個網路上,它們就可以互相通話。
啟動 MySQL
將容器放在網路上有兩種方法
- 在啟動容器時分配網路。
- 將已執行的容器連線到網路。
在以下步驟中,您將首先建立網路,然後在啟動時連接 MySQL 容器。
建立網路。
$ docker network create todo-app
啟動 MySQL 容器並將其連線到網路。您還將定義一些環境變數,資料庫將使用這些變數來初始化資料庫。要瞭解更多關於 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:8.0
$ 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:8.0
$ 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:8.0
在上一個命令中,您可以看到 `--network-alias` 旗標。在後面的章節中,您將瞭解更多關於這個旗標的資訊。
提示
您會在上述命令中注意到一個名為 `todo-mysql-data` 的磁碟區,它掛載在 `/var/lib/mysql` 上,這是 MySQL 儲存資料的位置。但是,您從未執行 `docker volume create` 命令。Docker 辨識到您想要使用具名磁碟區,並自動為您建立一個。
要確認您的資料庫已啟動並正在執行,請連線到資料庫並驗證它是否已連線。
$ docker exec -it <mysql-container-id> mysql -u root -p
當出現密碼提示時,輸入 `secret`。在 MySQL 殼層中,列出資料庫並驗證您是否看到 `todos` 資料庫。
mysql> SHOW DATABASES;
您應該會看到如下所示的輸出
+--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | todos | +--------------------+ 5 rows in set (0.00 sec)
退出 MySQL 殼層以返回您機器上的殼層。
mysql> exit
您現在有一個 `todos` 資料庫,可以開始使用了。
連線到 MySQL
現在您知道 MySQL 已啟動並正在執行,您可以使用它。但是,您如何使用它?如果您在同一個網路上執行另一個容器,您如何找到該容器?請記住,每個容器都有自己的 IP 位址。
為了回答上述問題並更好地瞭解容器網路,您將使用 nicolaka/netshoot