背景
docker以前的版本不支持直接配置宿主機所在網段ip并跟其直接互通的功能,當然,也可以實現這個功能,只是有點繞,而且還有一些第三方工具例如pipework把這些瑣碎的過程封裝起來,讓步驟簡化。但是,現在不需要了,現在1.12的docker已經直接支持了直接使用宿主機所在網段資源。
具體步驟
環境準備
yum -y install kernel; # 更新到最新的kernel版本
yum -y update; # 更新到最新的CentOS7.x
tee /etc/yum.repos.d/docker.repo <<-'EOF'
[dockerrepo]name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF
yum -y install docker-engine; # 安裝docker最新版
systemctl start docker.service; # 啟動docker
systemctl enable docker.service; # 使docker服務隨著機器啟動而啟動
網絡創建
docker network create -d macvlan \
--subnet=10.0.0.0/24 \
--gateway=10.0.0.1 \
-o parent=eth0 MACNET;
注意:
- 這里的macvlan是kernel的模塊名,docker 1.12開始支持其作為驅動來創建網絡
- 這里的10.0.0.0/24是宿主機所在網絡的網段
- 10.0.0.1是網關
- eth0是宿主機接入10.0.0.0/24的網絡設備
創建實例
docker run --net=MACNET \
--ip=10.0.0.11 \
-it \
--rm alpine /bin/sh;
注意:
- 10.0.0.11是新docker實例的ip地址
簡單測試
ping -c 5 10.0.0.1;
這是在上面建立的docker實例的控制臺上ping宿主機網關,顯示能通
ping -c 5 10.0.0.11;
這是在宿主機所在網段的任意其他機器上ping這臺docker實例,也能通
其他
Q: 為嘛這里的docker不支持ipvlan的驅動呢?
A: 因為官方資料顯示kernel 4.2以上才支持ipvlan(雖然準確講4.2之前也有支持,但是有bug),而從3.9就開始支持macvlan了。
Q: 為嘛RedHat這么喜歡把高版本的功能backport到老版本的操行,卻沒有把ipvlan的支持backport到3.10(CentOS 7.x的kernel版本)呢?
A: 。。。zzzzzzZZZZZZZZZ