一切的問題根源都來自於我用 docker compose 來啟動 npm 容器,我發現 網上的其他教程都是可以通過 docker0 網關來訪問的,但是 docker compose 編排的容器每個容器都不在同一個子網,造成 docker0 網關訪問不到,也是自己才疏學淺,實踐太少了。
docker 網絡中的 host 和 bridge 模式#
想要使用 docker,那就必須對 docker 中的兩個基礎網絡模式有所了解,這樣才能知道出錯後如何的調試。
host 模式#
主機模式 ,docker 中如果使用host
模式,那麼該容器類似於宿主機直接運行的應用,它不需要配置端口映射,因為它就是宿主機下的應用,使用的端口直接是宿主機上的端口。該模式的優勢在於無論是通過宿主機訪問容器
、容器訪問宿主機
和容器訪問容器
都可以通過localhost:port
或者127.0.0.1:port
來直接訪問,簡單來說host
模式可以認為沒有容器網絡的概念,同時因為直接訪問不需要流量的轉發,所以網絡上來說是最快的方式。劣勢也是非常的明顯,那就是宿主機和容器網絡之間沒有隔離,端口的使用上要注意是否衝突等。沒有網絡隔離的容器應用還是 docker 的目的嘛?
bridge 模式#
NAT 模式, docker 容器創建時如果未指定網絡模式,那麼默認就是bridge
模式,創建時會自動創建一個appname_default
的網絡。該模式的優勢在於宿主機和容器網絡是隔離的,通過docker0
網關來相互訪問,同時因為使用NAT
那麼不同的容器應用網絡就可以自由的配置,比如某些應用在一個子網內,另外一些應用在另外一個子網內。劣勢在於NAT
需要流量轉發,網絡性能要差一些,同時宿主機到容器
,容器到容器
的訪問都是比較簡單的,但是容器到宿主機
的訪問就比較麻煩了。
兩種模式沒有絕對的優和差,更多的還是適用的場景不同。
NPM 的兩種網絡模式配置#
如果你是用docker
命令行的方式來運行的容器,那麼你可以直接用docker0
的網關:端口,如172.17.0.1:prot
來訪問其他的容器。
如果你是用docker compose
配置文件啟動的容器,我相信你會出現和我一樣的網絡問題,那就是172.13.0.1:port
訪問不到其他的容器,同時也無法訪問宿主機,這對於npm
是致命的,因為這樣以來npm
毫無意義。
Docker compose 下的host
模式#
使用host
模式是配置 npm 最簡單的方法,如果你運行的容器不多,同時端口也沒有衝突,不需要過多的關注細節,那麼這種模式是最優的。而需要做的也只是在每個docker-compose.yml
文件中將network_mode: "host"
這一行添加到容器應用中即可。這樣一來,你可以直接在npm
配置中的hostname/IP
這一項中填入localhost
或者127.0.0.1
即可訪問其他容器以及宿主機應用。
Docker compose 下的bridge
模式#
bridge
模式下有兩種配置方式來通信
- 通過 docker 命令行來組建內網
好處是不需要改動配置文件,壞處是每次停止容器都需要重新將該容器的網絡加入到子網中- 創建一個網絡
$ docker network create npm
- 把其他容器加入到該網絡
$ docker network connect npm <容器的名字>
- 查看
npm
網絡下有哪些容器以及 ip$ docker network inspect npm
- 可以用
容器的名字
互相訪問,比如有一個alist
容器加入到網絡,可以在npm
容器中用ping alist
來訪問。npm 中的hostname/IP
也可以用容器的名字
- 創建一個網絡
- 通過
docker-compose.yml
配置網絡
例如:npm
的docker-compose.yml
version: '3.8'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
networks:
- npm
ports:
- '80:80'
- '81:81'
- '443:443'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
networks:
npm:
driver: bridge
alist
的docker-compose.yml
version: '3.3'
services:
alist:
restart: always
volumes:
- '.data/alist:/opt/alist/data'
networks:
- npm
ports:
- '5244:5244'
environment:
- PUID=0
- PGID=0
- UMASK=022
container_name: alist
image: 'xhofe/alist-aria2:latest'
networks:
npm:
driver: bridge
如果npm
網絡已經通過其他命令創建了,那麼可以通過外鏈的形式
version: '3.8'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
networks:
- npm
ports:
- '80:80'
- '81:81'
- '443:443'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
networks:
npm:
external: true
Docker compose 下的link
模式#
我用的不多,參考官方文檔吧
Enjoy!#
docker 很好,只要玩的轉。
參考:[docker network 官方文檔](Networking in Compose | Docker Docs)