前言
近期都在玩 Discord Bot 開發。使用方式一定使用 docker 當作工作排程器讓程式運行時候,可以透過 docker desktop 來管理。但是在使用 docker 的時候發現一個問題就是無法互通,因為他本身架構是各之間的docker都是。這時候就需要使用 network 來解決這個問題。
一、Docker容器互相無法連線問題
對於一個 docker 使用不久的人來說,會以為都在同一個local network 應該要能互通,而且設定 port 也要吃得回去才合理。過程中得出一個結論就是隔離性,如下圖 :
其中,每個 docker 內部若允許 3000 port,但在本機的 http://localhost:3000
並不會吃得回去,這就是為什麼指令需要加入 -p 3000:3000
這個參數。
1-1 解決方式
解決方向就是要讓 docker 容器A可以允許容器B的請求,這時候就需要使用 network 來解決這個問題。
1-1-1 創建一個新的 network
我們需要有個環境中,彼此可以互通的網路,這時候就需要創建一個新的 network。
1 | docker nework create my-network |
1-1-2 將容器加入 network
加入前必須要注意,當容器加入 network 後,localhost 要改成 http://container_name:port
這樣才能互通。下面範例中是 http://my-services:3000
要設定給 my-bots 。
1 | docker run --network my-network --name my-bots discordbot |
補充 - docker-compose
- 若是使用 docker-compose 的話,可以在 docker-compose.yml 中加入 network 的設定。
1
2
3
4
5
6
7
8
9
10
11
12
13
14version: '3'
services:
my-bots:
image: discordbot
networks:
- my-network
my-services:
image: discordbot_db
ports:
- "3000:3000"
networks:
- my-network
networks:
my-network:
補充 - 測試連線
- 可以透過以下指令來測試是否可以互通。
1
2
3docker exec -it [容器名字] bash
apt-get update && apt-get install -y curl # 如果容器沒有 curl 的話,需要安裝
curl http://my-services:3000
參考文件
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 John Conte!
評論
DisqusGitalk