LXC更新到Docker之后的IP部分修改

在k8s没有出来之前,我们用的就是LXC,古早版本了。

跑的LXC,基于docker进行管理,网络部分独立。

进化到新版本的Docker后,网络部分需要修改,我们决定采用macvlan方式扁平直接接入本地网络:

Docker装好以后,系统中会出现一个Docker0的网络,用来NAT,我们不用这个

12: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
2    link/ether 52:54:00:14:ee:63 brd ff:ff:ff:ff:ff:ff
3    inet 172.18.31.33/24 brd 172.18.31.255 scope global eth0
4       valid_lft forever preferred_lft forever
53: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
6    link/ether 02:42:ef:af:de:98 brd ff:ff:ff:ff:ff:ff
7    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
8       valid_lft forever preferred_lft forever

我们要做的是对eth0做macvlan,不做任何iptable,直接接入本地网络

宿主机ip: 172.18.31.33 Docker1: 172.18.31.35

一、建macvlan

1docker network create -d macvlan \
2    --subnet=172.18.31.0/24 --gateway=172.18.31.254 \
3    -o parent=eth0 \
4    macvlan0
5
6docker network ls
7
8docker inspect macvlan0

会看到

1...
2"Config": [
3    {
4        "Subnet": "172.18.31.0/24",
5        "Gateway": "172.18.31.254"
6    }
7 ]

二、按指定ip建立容器

1docker run --rm -dit --name=t35 --net macvlan0 --ip=172.18.31.35 alpine:latest ash

随后我们可以用docker exec取得shell

1docker exec -it t35 ash
2ip a
3ping 172.18.31.35
4ping 172.18.31.2

注意:这个时候从宿主机ping容器 ping 172.18.31.35,或者是从容器ping宿主机 ping 172.18.31.33,都是不通的,这是macvlan的特性,我们必须做个操作来解决这个问题

三、解决宿主机和容器之间的网络问题

给eth0做个子接口,解决宿主机和容器之间的通讯问题

1ip link add macvlan0-shim link eth0 type macvlan  mode bridge
2ip addr add 172.18.31.34/32 dev macvlan0-shim
3ip link set macvlan0-shim up
4ip route add 172.18.31.0/24 dev macvlan0-shim

这样就可以通了

注意,这样宿主机占了两个IP,eth0子接口的ip不能胡乱,必须跟独立ip同段。 浪费了一个IP,但是解决了宿主机和容器之间的网络问题。


LXC更新到Docker之后的存储部分修改
Ucarp和nginx提供内网vip
comments powered by Disqus