前言
經過之前一段時間學習與思考,我們已經大概明確了一些感念: Docker image/container, service and node
簡單來說,swarm允許我們以節點(node)的方式組織集群(cluster);每個節點上面可以部署一個或者多個服務(service);每個服務又可以包括一個或者多個(container)
在此,我放上Docker官方網站的結構圖,方便理解。
創建網絡
在部署服務之前,我們首先需要創建網絡。Docker 提供了不同的方式供我們創建不同形式的網絡。在這里,我們創建 overlay 模式的網絡
$ docker network create --driver overlay \
--subnet 10.0.0.1/24 \
--opt encrypted \
mynetwork
-- driver 指定網絡方式
-- subset 指定用於網絡的子網, 如果不指定,swarm會自動選擇一個子網,但是根據官網的描述這個自動指定的子網這個可能會引起container通信的問題。(before kelner 3.10)
-- opt 指定網絡安全模式
創建網絡完成后,我們可以查看到我們的網絡
$ docker network ls
PS : 在這里貼一下官網對於network的描述,有興趣的童鞋可以看一下
Docker Engine swarm mode natively supports overlay networks, so you can enable container-to-container networks. When you use swarm mode, you don’t need an external key-value store. Features of swarm mode overlay networks include the following:
- You can attach multiple services to the same network.
- By default, service discovery assigns a virtual IP address (VIP) and DNS entry to each service in the swarm, making it available by its service name to containers on the same network.
- You can configure the service to use DNS round-robin instead of a VIP.
In order to use overlay networks in the swarm, you need to have the following ports open between the swarm nodes before you enable swarm mode:
- Port
7946
TCP/UDP for container network discovery. - Port
4789
UDP for the container overlay network.
在指定網絡上添加服務
$ docker service create \
--name mybusybox \
--network mynetwork
\
mynetwork
\ busybox \
sleep 3000
添加一個名稱為mybusybox的service,這個 service 將啟動找到對應的 image (如果沒有會自動下載) 並且啟動 container. 完成后我們可以看到 service 的信息
$ docker service ps mybusybox
再添加一個同類型的 service, 命名為tuobusybox, 在這里添加兩個service是為了演示之后的誇 container 相互訪問,實際情況下,應根據我們的業務需求添加 service
現在我們再查看network 信息
$docker network inspect mynetwork
這里可以看到,我們的網絡“mynetwork” 下面運行着兩個service
容器間通信
到這里為止,我們的 service 以及 container 已經已經創建完成。現在我們來測試下container之間的通信。
啟動一個service 並且進入容器, 我這里是 mybusybox
$ docker exec -it mybusybox.1.cj3y6wgt6rry6pxei9utjufpo /bin/sh
在容器內查看另一個容器, tuobusybox
可以看到,能夠使用DNS查詢到 tuobusybox 服務 (service)
在mybusybox container 里面,使用 tasks.SERVICE-NAME 來查看指點 service 中所有 container 的 IP
$ nslookup tasks.tuobusybox
由於我們只啟動了一個container, 所以只返回了一個IP。
OK,我們已經完成了在自己的網絡下運行多個服務(容器),並且驗證了容器之間的網絡鏈接 :)