Docker (6) Network

1. 四種容器的網路架構:

根據容器網路的開放程度我們可以把它分成四類 [1]。

  1. Closed containers: 只有 loopback 能用。
  2. Bridged containers: 比 Closed containers 好一點,可以訪問外部網路。
  3. Joined containers: 使用其他容器的網路介面。
  4. Open containers: 使用 host 的網路。


2. Closed containers:

使用 --net none 創建一個 Closed container。

$ sudo docker run \
 --net none \
 --rm \
 alpine \
 ip addr

ip addr 告訴我們它只有 lo 能用。

1: lo:  mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever

3. Bridged containers:

使用 --net bridge 創建一個 Bridged container(--net bridge 其實是 Docker 預設值,所以可以忽略)。

$ sudo docker run \
 --net bridge \
 --rm \
 alpine \
 ping www.google.com -c 10

4. Publish:

開一個 nginx 容器將其 port 80 綁到主機的 port 80。

-p(--publish) 的格式是 host port:container port

$ sudo docker run \
 -it \
 --rm \
 -p 80:80 \
 nginx

這時你打開瀏覽器輸入 127.0.0.1:80 應該會看到 nginx 畫面。

再試一次,這次綁到主機的 8080。

$ sudo docker run \
 -it \
 --rm \
 -p 8080:80 \
 nginx

-p 還有另一個常用的格式是 host ip:host port:container port


5. Joined containers:

Joined containers 會共享網路。

先開一個 alp1 容器。

$ sudo docker run \
 -it \
 --rm \
 --name alp1 \
 --hostname alp1 \
 alpine

再開一個 alp2 容器,使用 alp1 網路。

$ sudo docker run \
 -it \
 --rm \
 --net container:alp1 \
 --name alp2 \
 alpine

不論是 ifconfig 還是 host 你會發現 alp2 是使用 alp1 的網路。

alp2$ cat /etc/hosts
xxx.xxx.xxx.xxx alp1

6. Open containers:

創建一個能訪問主機網路的容器。

$ sudo docker run \
 --rm \
 --net host \
 container
 alpine:latest \
 ip addr

Reference:

[1] JEFF NICKOLOFF: Docker in Action-Manning Publications Co.(2016)

留言

熱門文章