3.7 Docker最新入门教程-Docker入门-多容器应用
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=todos `mysql:5.7.25您還會看到我們指定了--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 shell 中,列出數據庫并確認您看到了todos數據庫。
mysql> SHOW DATABASES;您應該看到如下所示的輸出:
+--------------------+| Database |+--------------------+| information_schema || mysql || performance_schema || sys || todos |+--------------------+5 rows in set (0.00 sec)退出 MySQL shell 以返回到我們機器上的 shell。
mysql> exit萬歲!我們有我們的todos數據庫,它已經準備好供我們使用了!
連接到 MySQL
現在我們知道 MySQL 已啟動并正在運行,讓我們使用它吧!但是,問題是……怎么辦?如果我們在同一網絡上運行另一個容器,我們如何找到該容器(記住每個容器都有自己的 IP 地址)?
為了解決這個問題,我們將使用nicolaka/netshoot容器,它附帶了許多可用于故障排除或調試網絡問題的工具。
使用 nicolaka/netshoot 鏡像啟動一個新容器。確保將其連接到同一網絡。
$ docker run -it --network todo-app nicolaka/netshoot在容器內,我們將使用dig命令,這是一個有用的 DNS 工具。我們要查找主機名的 IP 地址mysql。
$ dig mysql你會得到這樣的輸出…
; <<>> DiG 9.14.1 <<>> mysql;; global options: +cmd;; Got answer:;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 32162;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0;; QUESTION SECTION:;mysql. IN A;; ANSWER SECTION:mysql. 600 IN A 172.23.0.2;; Query time: 0 msec;; SERVER: 127.0.0.11#53(127.0.0.11);; WHEN: Tue Oct 01 23:47:24 UTC 2019;; MSG SIZE rcvd: 44在“ANSWER SECTION”中,您將看到解析為的A記錄 172.23.0.2(您的 IP 地址很可能具有不同的值)。雖然通常不是有效的主機名,但 Docker 能夠將其解析為具有該網絡別名的容器的 IP 地址(還記得--network-alias 我們之前使用的標志嗎?)。
這意味著……我們的應用程序只需要連接到一個名為的主機mysql,它就會與數據庫對話!沒有比這更簡單的了!
使用 MySQL 運行您的應用程序
todo 應用程序支持設置一些環境變量來指定 MySQL 連接設置。他們是:
- MYSQL_HOST- 正在運行的 MySQL 服務器的主機名
- MYSQL_USER- 用于連接的用戶名
- MYSQL_PASSWORD- 用于連接的密碼
- MYSQL_DB- 連接后使用的數據庫
通過環境變量設置連接設置
雖然使用 env vars 設置連接設置通常可以用于開發,但 在生產環境中運行應用程序時,**強烈建議不要這樣做。**Docker 的前安全負責人 Diogo Monica 寫了一篇很棒的博文來 解釋原因。
一種更安全的機制是使用容器編排框架提供的秘密支持。在大多數情況下,這些機密作為文件安裝在正在運行的容器中。您會看到許多應用程序(包括 MySQL 鏡像和待辦事項應用程序)也支持帶有_FILE后綴的環境變量,以指向包含該變量的文件。
例如,設置MYSQL_PASSWORD_FILEvar 將導致應用程序使用引用文件的內容作為連接密碼。Docker 不會做任何事情來支持這些環境變量。您的應用需要知道如何查找變量并獲取文件內容。
解釋完所有這些后,讓我們啟動我們的開發就緒容器!
注意:對于 MySQL 8.0 及更高版本,請確保在mysql運行以下命令.
mysql> ALTER USER 'root' IDENTIFIED WITH mysql_native_password BY 'secret';mysql> flush privileges;我們將指定上面的每個環境變量,并將容器連接到我們的應用程序網絡。
$ 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:latest \sh -c "yarn config set registry https://registry.npm.taobao.org/ && yarn install && yarn run dev"如果您使用的是基于 ARM 的芯片,例如 Macbook M1 芯片/Apple Silicon,請使用此命令。
$ 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:latest \sh -c "apk add --no-cache python2 g++ make && yarn install && yarn run dev"如果您使用的是 Windows,則在 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:latest `sh -c "yarn install && yarn run dev"如果我們查看容器 ( docker logs <container-id>) 的日志,我們應該會看到一條消息,表明它正在使用 mysql 數據庫。
$ nodemon src/index.js[nodemon] 1.19.2[nodemon] to restart at any time, enter `rs`[nodemon] watching dir(s): *.*[nodemon] starting `node src/index.js`Connected to mysql db at host mysqlListening on port 3000在瀏覽器中打開該應用程序,然后將一些項目添加到您的待辦事項列表中。
連接到 mysql 數據庫并證明項目正在寫入數據庫。請記住,密碼是保密的。
$ docker exec -it <mysql-container-id> mysql -p todos在 mysql shell 中,運行以下命令:
mysql> select * from todo_items;+--------------------------------------+--------------------+-----------+| id | name | completed |+--------------------------------------+--------------------+-----------+| c906ff08-60e6-44e6-8f49-ed56a0853e85 | Do amazing things! | 0 || 2912a79e-8486-4bc3-a4c5-460793a575ab | Be awesome! | 0 |+--------------------------------------+--------------------+-----------+顯然,您看起來會有所不同,因為有新增加的數據。
如果快速查看 Docker 儀表板,您會看到我們有兩個應用程序容器正在運行。但是,沒有真正的跡象表明它們被組合在一個應用程序中。我們很快就會看到如何讓它變得更好!
個人寫的小程序,有需求的可以看看:
國考|社保卡|駕駛證|簡歷|小二寸|小一寸|二寸|一寸,免費制作標準證電子證件照
源碼地址:https://gitee.com/eyes-star/zjz-openmp.git
總結
以上是生活随笔為你收集整理的3.7 Docker最新入门教程-Docker入门-多容器应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安装casadi
- 下一篇: 推迟和超前格林函数介绍