日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

3.7 Docker最新入门教程-Docker入门-多容器应用

發布時間:2023/12/20 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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入门-多容器应用的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。