banner
ZDawn

ZDawn

Do one thing at a time and do well.
tg_channel

docker和docker compose中的网络 在docker和docker compose中,网络是一个重要的概念。网络允许不同的容器之间进行通信和交互。docker提供了多种网络模式,包括桥接网络、主机网络和覆盖网络。桥接网络是默认的网络模式,它允许容器通过桥接接口与主机和其他容器进行通信。主机网络模式将容器直接连接到主机网络,使容器可以使用主机的网络配置。覆盖网络模式允许在多个主机上创建一个虚拟网络,容器可以通过该网络进行通信。docker compose是一个用于定义和运行多个容器的工具,它可以通过配置文件指定容器之间的网络连接和通信方式。通过docker compose,可以轻松地创建和管理复杂的容器网络。

一切的問題根源都來自於我用 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 模式下有兩種配置方式來通信

  1. 通過 docker 命令行來組建內網
    好處是不需要改動配置文件,壞處是每次停止容器都需要重新將該容器的網絡加入到子網中
    • 創建一個網絡 $ docker network create npm
    • 把其他容器加入到該網絡$ docker network connect npm <容器的名字>
    • 查看npm網絡下有哪些容器以及 ip $ docker network inspect npm
    • 可以用容器的名字 互相訪問,比如有一個alist 容器加入到網絡,可以在npm 容器中用ping alist 來訪問。npm 中的hostname/IP 也可以用容器的名字
      npm
  2. 通過docker-compose.yml 配置網絡
    例如:npmdocker-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

alistdocker-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

我用的不多,參考官方文檔吧

Enjoy!#

docker 很好,只要玩的轉。

參考:[docker network 官方文檔](Networking in Compose | Docker Docs)

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。