iT邦幫忙

2023 iThome 鐵人賽

DAY 3
0
DevOps

搞定Docker網路系列 第 3

Docker的網路-固定IP

  • 分享至 

  • xImage
  •  

固定ip是很常見的一種使用情境,但一樣,docker預設就是動態ip,固定ip需要額外設定。

這邊以一個案例來做說明,注意,這邊都還是用bridge的網路進行固定ip的設定。

會開始這一系列的文章是因為架設Drone+Gogs(之前本來是用Jenkins+Gitlab但很肥),一個是CI/CD工具(Drone),一個是Git Server(Gogs),都希望以Docker的方式架設,但發生了一直發生兩個容器無法互通的網路問題,不單單只是容器讓它們都在同一個網卡環境而已,重點是官方Drone連線Gogs的資訊都放在環境變數內,如果兩邊的IP都用Docker配置,通常就會動態配置,這時會想用Docker DNS(後面會研究)來互連,但不知道為什麼在環境變數的地方無法用Docker DNS,這部份後續會嘗試研究看看原因(Docker要熟練重點還是要會除錯),所以這邊我們就先以ip的方式互連吧,ip就不用動態配置,而用固定ip的方式處理

預計我們要做的架構:

  1. 先新建一個network物件

docker network create --ip-range 172.31.0.0/24 --subnet 172.31.0.0/24 --gateway 172.31.0.1 cicd

下ifconfig,看到確實已經建立好了

接下來參考docker hub gogs跟drone官方說明,開始啟動兩個container

  1. 建立gogs

docker pull gogs/gogs
docker volume create gogs_data
docker run -d -p 3000:3000 -p 22:22 --name=gogs -v gogs_data:/data --network=cicd --ip=172.31.0.3 gogs/gogs

服務就直接輸入 http://172.31.0.3:3000 ,使用sqlite3,建立管理者帳號,然後建立了一個coderepo repos。

參考:
https://hub.docker.com/r/gogs/gogs

  1. 建立drone-server,並跟gogs溝通

參考:
https://docs.drone.io/server/provider/gogs/

docker pull drone/drone:2.20.0
docker volume create drone_data

docker run \
  --volume=drone_data:/data \
  --env=DRONE_AGENTS_ENABLED=true \
  --env=DRONE_GOGS_SERVER=http://172.31.0.3:3000 \
  --env=DRONE_RPC_SECRET=super-duper-secret \
  --env=DRONE_SERVER_HOST=172.31.0.2 \
  --env=DRONE_SERVER_PROTO=http \
  --publish=80:80 \
  --publish=443:443 \
  --restart=always \
  --detach=true \
  --name=drone \
  --env=TZ=Asia/Taipei \
  --ip=172.31.0.2 \
  --network=cicd \
  drone/drone:2.20.0

先進入 http://172.31.0.2 設定gogs帳號,然後進入gogs嘗試用webhook跟drone連線,結果出現錯誤

錯誤訊息:
Payload URL resolved to a local network address that is implicitly blocked.

可能是gogs的限制,這邊嘗試cat出app.ini設定檔

參考:
https://blog.csdn.net/catoop/article/details/128454236

docker exec -it gogs cat /data/gogs/conf/app.ini

發現security確實沒有允許LOCAL_NETWORK_ALLOWLIST設定

嘗試最後一行塞入 LOCAL_NETWORK_ALLOWLIST=172.31.0.2

docker exec -it gogs sh
vi /data/gogs/conf/app.ini

接下來砍掉container再啟動

docker rm -f gogs
sudo docker run -d -p 3000:3000 -p 22:22 --name=gogs -v gogs_data:/data --network=cicd --ip=172.31.0.3 gogs/gogs


成功!!!

  1. 意外發生

調整好gogs後,發現drone出現錯誤

gogs還是可以正常登入,drone還是可以連線到gogs

目前已經被開bug,還是open狀態,我們只能追蹤下去,這邊只展示固定ip跟容器互通的情境
https://github.com/gogs/gogs/issues/7172

網路部份參考:
https://docs.docker.com/engine/reference/commandline/network_create/


上一篇
Docker的網路-bridge篇(2/2)
下一篇
Docker的網路-DNS篇
系列文
搞定Docker網路31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
fordsupr
iT邦新手 2 級 ‧ 2024-08-27 08:07:32

請問Docker宿主機是個VM:192.168.1.123,Docker服務使用port 3000,請問怎麼讓區域網Lan中的User直接透過192.168.1.123:3000取得Docker服務?

我要留言

立即登入留言