Docker RemoteAPI 與 網絡管理
檢查API是否一致
使用sudo docker version
查看
修改服務器端配置
修改Docker守護進程啟動選項
-H tcp://host:port
unix:///path/to/socket,
fd://* or fd://socketfd
守護進程默認配置:
-H unix:///var/run/docker.sock
Ubuntu(192.168.56.102)服務器端/etc/default/docker
DOCKER_OPTS=" --label name=server -H tcp://0.0.0.0:2375 "
全0代表綁定自身的端口,通常是2375,修改完成要重啟服務
sudo service docker restart ps -ef | grep # 查看配置是否生效
客戶端訪問
CentOS 客戶端訪問curl http://192.168.56.102:2375/info
從返回的json中可以看到"Labels":["name=server"]
接著在客戶端使用docker
訪問服務器的守護進程
# whoami at localhost.localdomain in [~] $ docker -H tcp://192.168.56.102:2375 info Containers: 1 Running: 0 Paused: 0 Stopped: 1 Images: 1 Server Version: 17.12.0-ce 。。。。。。 Labels: name=server Experimental: false Insecure Registries: 127.0.0.0/8 Live Restore Enabled: false WARNING: No swap limit support
可以看到同樣有著name=server
的字樣
客戶端環境變量簡化操作
聲明一個環境變量:
export DOCKER_HOST="tcp://192.168.56.102:2375"
以後只要環境變量中存在著非空DOCKER_HOST
變量時,運行的docker
命令都會去訪問運程的守護進程,在不需要與遠程進行連接時,只需要將DOCKER_HOST
置空即可
export DOCKER_HOST=""
服務端守護進程接收多訪問
服務端在接受客戶端訪問時,自身可能不能使用docker
命令,需要進一步設置自身接受多訪問
DOCKER_OPTS=" --label name=server -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock"
Docker容器的網絡基礎
使用ifconfig
查看網絡狀態時,會發現多一個網絡docker0
,而docker
守護進程正是通過該網絡實現網絡連接如下:
# whoami at localhost.localdomain in [~]
$ ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet x.x.x.x netmask 255.255.0.0 broadcast x.x.x.x
ether x:x:x:x:x:x txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
當然要在啟動服務之後才能看到網絡docker0
docker0虛擬網橋
通常網橋是一個純數據鏈路層的概念,然而在Linux中虛擬網卻不是這樣的,它的特點如下:
Linux虛擬網橋的特點:
- 可以設置
IP
地址- 相當於擁有一個
隱藏的虛擬
網卡
這樣Linux虛擬網橋就跨越到了第三層了。Linux虛擬網橋是通用網絡設備抽象的一種,通過IP可以查找得到它,本身就成為一張網卡(虛擬的)。
dockerO的地址劃分
- IP: 172.17.x.x
- 子網掩碼:255.255.0.0
- MAC: 02:42:ac:ll:00:00 到 02:42:ac:ll:ff:ff 總共提供了65534個地址
在一個容器啟動時,docker0
需要創建網絡的兩端如下:
一端是在容器的網絡設備,一端則是在運行容器的宿主機器上。這個過程驗證如下:
可以Ubuntu中安裝bridge-utils
以進行網橋管理
# whoami at iamwho in [~]
$ brctl
Usage: brctl [commands]
commands:
addbr <bridge> add bridge
delbr <bridge> delete bridge
addif <bridge> <device> add interface to bridge
delif <bridge> <device> delete interface from bridge
hairpin <bridge> <port> {on|off} turn hairpin on/off
setageing <bridge> <time> set ageing time
setbridgeprio <bridge> <prio> set bridge priority
setfd <bridge> <time> set bridge forward delay
sethello <bridge> <time> set hello time
setmaxage <bridge> <time> set max message age
setpathcost <bridge> <port> <cost> set path cost
setportprio <bridge> <port> <prio> set port priority
show [ <bridge> ] show a list of bridges
showmacs <bridge> show a list of mac addrs
showstp <bridge> show bridge stp info
stp <bridge> {on|off} turn stp on/off
使用brctl show
查看docker0
如下:
# whoami at iamwho in [~]
$ sudo brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.0242485afc84 no
運行一個容器:
docker run -it --name=nwt0 ubuntu /bin/bash
再使用ifconfig
(如果查找不到命令,執行apt-get update
,安裝net-tools
)查看網絡:
root@164c3f8e3438:/# ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:ac:11:00:02
inet addr:172.17.0.2 Bcast:172.17.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3889 errors:0 dropped:0 overruns:0 frame:0
TX packets:2911 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:25143014 (25.1 MB) TX bytes:162373 (162.3 KB)
退出交互式到守護式,使用brctl show
會看到在interfaces
中多了一個vethxxxx
的網絡接口
# whoami at iamwho in [~]
$ sudo brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.0242485afc84 no vethc7ff419
自定義docker0
修改dockerO地址:
示例如下:
$ sudo ifconfig dockerO 192.168.200.1 netmask 255.255.255.0
這樣的修改似乎只能在臨時創建的新容器中生效,重啟服務失生效
更改docker守護進程的啟動配置:
/etc/default/docker
中添加DOCKER_OPS
值-b = brO
其中
br0
為自定義的虛擬網橋,添加虛擬網橋的方式如下:sudo brctl addbr br0
同樣使用
ifconfig
為新增網橋添加IP然後修改配置文件
/etc/default/docker
添加添加DOCKER_OPS
值-b = brO
重啟服務以生效
Docker容器的互聯
允許所有容器互聯
拒絕容器間互聯
允許特定容器間的連接
Docker RemoteAPI 與 網絡管理