使用Compose變數定製Docker網路

使用[Docker 多節點網路]來創建虛擬網路,把容器接入虛擬網路,能實現應用中所需要的網路拓撲。具體來說,Bridge網路能用來創建單節點網路,Overlay網路能創建多節點網路。通過這樣給應用定製專用網路,能為容器提供絕對的隔離性。

Docker Compose的目標是實現單節點網路,通過用<code>--x-networking</code> 來創建一個應用程序獨有的橋接網路,如果應用程序需要多節點部署,可以使用Docker Swarm集群來創建一個overlay網路。

那如果一個橋接網路或overlay網路已經存在,而你想要把這個網路分配給運行中的容器呢?

Docker 1.9 引入了變數替換的特性,我們可以利用這特性實現把容器關聯到一個預創建的網路上。

創建Docker橋接網路

1. 創建網路:

sh

docker network create -d bridge mynet

47d6225ffe56ddd1a8bc0d6abb0ffd8f8ac3eec2090ff243f8cd6f77c170751b=

2. 列出網路:

sh

docker network ls

NETWORK ID NAME DRIVER

feb6e9567439 bridge bridge

29563a59abe8 none null

25ab737cd665 host host

47d6225ffe56 mynet bridge

Docker會為每個節點自動創建三個網路:

| 網路名稱 | 作用 |

| :-------- | :-- |

| bridge | 容器默認連接的網路,是所有Docker安裝時都默認安裝的docker0網路 |

| none | 容器定製的網路棧 |

| host | 在宿主網路棧上添加一個容器,容器中的網路配置會與宿主的一樣|

上邊看到,我剛創建的mynet網路也在列表中。

使用<code>docker inspect</code>命令查看mynet網路的詳細信息:

json

[

{

"Name": "mynet",

"Id": "47d6225ffe56ddd1a8bc0d6abb0ffd8f8ac3eec2090ff243f8cd6f77c170751b",

"Scope": "local",

"Driver": "bridge",

"IPAM": {

"Driver": "default",

"Config": [

{}

]

},

"Containers": {},

"Options": {}

}

]

從Containers這節可以看到,目前還沒有容器關聯上去。

Docker Compose 與 網路

1. 上面新建的網路能在新的容器中使用,只要在運行時使用<code>docker run --net=<NETWORK></code>命令。不過本文會用Compose文件實現:

json

mycouchbase:

container_name: "db"

image: couchbase/server

ports:

- 8091:8091

- 8092:8092

- 8093:8093

- 11210:11210

net: ${NETWORK}

mywildfly:

image: arungupta/wildfly-admin

environment:

- COUCHBASE_URI=db

ports:

- 8080:8080

- 9990:9990

net: ${NETWORK}

注意這裡<code>net</code>已經指定使用一個自定義網路。

2. 使用新創建的網路來啟動應用:

sh

NETWORK=mynet docker-compose up -d

再查看網路詳細信息:

json

docker network inspect mynet

[

{

"Name": "mynet",

"Id": "47d6225ffe56ddd1a8bc0d6abb0ffd8f8ac3eec2090ff243f8cd6f77c170751b",

"Scope": "local",

"Driver": "bridge",

"IPAM": {

"Driver": "default",

"Config": [

{}

]

},

"Containers": {

"300bebe6c3e0350ebf9b9d3746eb3a7b49444e14c00314770627a9f101442639": {

"EndpointID": "82a3e2d7cd4f1bb03c9ef52bb6abf284942d7e9fcac89fe3700b0e0c4ed2654f",

"MacAddress": "02:42:ac:14:00:03",

"IPv4Address": "172.20.0.3/16",

"IPv6Address": ""

},

"4fdae4eb919f0934422513227fe541255557dd9e8b3317374685927e7f427249": {

"EndpointID": "937605d716d144b55288d70817d611da5fb0f87e3aedd6b5074fca07f82c3953",

"MacAddress": "02:42:ac:14:00:02",

"IPv4Address": "172.20.0.2/16",

"IPv6Address": ""

}

},

"Options": {}

}

]

可以看到現在已經有兩個容器關聯到這個網路上了。

使用<code>docker ps</code>查看容器ID:

sh

# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

300bebe6c3e0 couchbase/server "/entrypoint.sh couch" 2 minutes ago Up 2 minutes 0.0.0.0:8091-8093->8091-8093/tcp, 11207/tcp, 11211/tcp, 0.0.0.0:11210->11210/tcp, 18091-18092/tcp db

4fdae4eb919f arungupta/wildfly-admin "/opt/jboss/wildfly/b" 2 minutes ago Up 2 minutes 0.0.0.0:8080->8080/tcp, 0.0.0.0:9990->9990/tcp wildflycouchbasejavaee7network_mywildfly_1

查看其中一個容器的網路設置:

sh

docker inspect -f {{ .HostConfig.NetworkMode }} 300

mynet

查看這個容器的詳細網路信息:

sh

docker inspect -f {{ .NetworkSettings.Networks.mynet }} 300

{82a3e2d7cd4f1bb03c9ef52bb6abf284942d7e9fcac89fe3700b0e0c4ed2654f 172.20.0.1 172.20.0.3 16 0 02:42:ac:14:00:03}

這個容器的更多細節能用<code>docker inspect</code>看到,相關的部分在這裡:

json

"Networks": {

"mynet": {

"EndpointID": "82a3e2d7cd4f1bb03c9ef52bb6abf284942d7e9fcac89fe3700b0e0c4ed2654f",

"Gateway": "172.20.0.1",

"IPAddress": "172.20.0.3",

"IPPrefixLen": 16,

"IPv6Gateway": "",

"GlobalIPv6Address": "",

"GlobalIPv6PrefixLen": 0,

"MacAddress": "02:42:ac:14:00:03"

}

}

創建新的Docker Overlay網路

創建Overlay網路需要預先搭建好一個鍵值對服務和一個Docker Swarm集群。

如了解更多docker相關知識,請觀看培訓視頻:csphere.cn/training

如需要docker相關產品,請訪問希雲官網首頁:https://csphere.cn!


推薦閱讀:

求大神解讀下IaaS、PaaS、SaaS的區別?
阿里雲獲得Docker在中國的運營權,對國內雲計算行業有什麼影響?
Twilio - APIs for Text Messaging, VoIP &amp; Voice in the Cloud
阿里巴巴集團當前的收入來源主要來自哪些業務?未來又可能會來自哪些業務?

TAG:Docker | PaaS | DockerCompose |