70.容器分配ip

1.创建容器并赋予ip操作:

# 启动容器
linux.LinuxSend('docker run --privileged -itd --name %s  --net=none -h localhost jmeter_influxdb_grafana:0.4 /usr/sbin/init' %info['dockername'])
# 设置ip,子网掩码,网管
linux.LinuxSend('pipework br0 %s %s/%s@%s' % (info['dockername'], info['dockerip'], info['mask'], info['gateway']))

2.docker容器ssh配置:

只能宿主机连接

docker search centos
docker pull centos:centos7.8.2003

1.# ssh默认的端口为22,我们将docker中centos的22端口映射到宿主机的5000端口
docker run -d -p 5001:22 --name centos7.8-base --privileged=true centos:centos7.8.2003 /usr/sbin/init
2. # 进入容器
docker exec -it centos76-javabase /bin/bash
3. # 安装常用工具
yum install -y openssh-server vim lrzsz wget gcc-c++ pcre pcre-devel zlib zlib-devel ruby openssl 
openssl-devel patch bash-completion zlib.i686 libstdc++.i686 lsof unzip zip
4.service安装
 yum install initscripts -y
5.ifconfig安装
    yum install net-tools.x86_64
6.openssh安装
	yum install openssh-server -y
    yum -y install openssh-clients
    
7.启动sshd服务(这个是ssh服务的进程,但是一般会报错)
/usr/sbin/sshd -D

8.报错之执行下面的命令,将ssh服务的各种公私钥生成
ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N '' 
ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ''
ssh-keygen -t dsa -f /etc/ssh/ssh_host_ed25519_key -N ''

9.启动sshd,并查看22端口是否开启
systemctl start sshd /service start sshd

ss -an|grep 22   

10.开启docker-centos76 ssh远程连接
修改/etc/ssh/sshd_config 文件 38行
RSAAuthentication yes #启用 RSA 认证
PubkeyAuthentication yes #启用公钥私钥配对认证方式
AuthorizedKeysFile .ssh/authorized_keys #公钥文件路径(和上面生成的文件同)
PermitRootLogin yes #root能使用ssh登录

11.给容器配置密码
passwd root

12.将修改后的容器制作成一个基础镜像,以供生成容器
docker commit -m 'install openssh' -a 'Docker Newbee' f8513ec39154 centos6-jdk7:ssh
其中,-m 来指定提交的说明信息,跟我们使用的版本控制工具一样;-a 可以指定更新的用户信息;之后是用来创建
镜像的容器的ID;最后指定目标镜像的仓库名和 tag 信息。创建成功后会返回这个镜像的 ID 信息。

13.使用制作好的镜像生成容器
将新的镜像启动,并将docker服务器的50001端口映射到容器的22端口上
docker run -d -p 50001:22 --name centos1 base-centos:v1 /usr/sbin/sshd -D
其中50001是docker容器的端口,22是宿主机的端口

14.在宿主机上连接容器
[root@docker-test docker]# ssh root@172.17.0.2

3.pipework分配容器ip:

其他服务器可以连接

1.需求
在使用Docker的过程中,有时候我们会有将Docker容器配置到和主机同一网段的需求。要实现这个需求,我们只要将
Docker容器和主机的网卡桥接起来,再给Docker容器配上IP就可以了。
下面我们就使用pipework工具来实现这一需求。

2.安装pipework
$ git clone https://github.com/jpetazzo/pipework
$ sudo cp pipework/pipework /usr/local/bin/

3.pipework使用
首先创建一个容器
$ sudo docker run -itd --name centos1  base-centos:v1 /bin/bash

4.查看此时服务器的ip
# 只用lo和eth0(这是我调整的,你的有可能是ens33)和docker0网卡
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
    link/ether 00:0c:29:3d:1e:4d brd ff:ff:ff:ff:ff:ff
    inet6 fe80::e6dc:247e:5d7c:2522/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:7f:0a:21:e6 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:7fff:fe0a:21e6/64 scope link 
       valid_lft forever preferred_lft forever

5.使用pipework为容器配置ip
pipework br0 centos1 10.20.70.230/24@10.20.70.2
这一步中,pipework首先会检查主机是否存在br0网桥,若不存在,就自己创建一个。这里以”br”开头,所以创建的是
Linux bridge。如果以”ovs”开头,就会创建OpenVswitch网桥。
另外,如果主机环境中有DHCP服务,也可以通过DHCP的方式获取IP
# pipework br0 test dhcp  

6.再次查看服务器ip
多出来一个br0网卡,只需要让它有这个网卡就行了,分配的ip是随机的
12: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 00:0c:29:3d:1e:4d brd ff:ff:ff:ff:ff:ff
    inet 170.17.0.3/24 scope global br0
       valid_lft forever preferred_lft forever
    inet6 fe80::7411:7ff:fefc:3172/64 scope link 
       valid_lft forever preferred_lft forever

7.桥接网络
将主机eth0桥接到br0上,并把eth0的IP配置在br0上。这里由于是远程操作,中间网络会断掉,所以放在一条命令中执行。
    
yum install bridge-utils -y
sudo ip addr add 10.20.70.230/24 dev br0; 
sudo ip addr del 10.20.70.230/24 dev eth0; 
sudo brctl addif br0 eth0; 
sudo ip route del default; 
sudo ip route add default via 10.20.70.2 dev br0

8.分配容器ip
注:上面这一步只有在第一次绑定容器地址的时候会用到,一旦执行过后,就会在主机上把原来eth0的IP地址分配给br0,然后把eth0
和br0连起来。所以以后再创建容器就不需要执行这一步了。而只需要执行下面的绑定容器地址的命令就可以了。
pipework br0 centos1 10.20.70.235/24@10.20.70.2

9.查看宿主机ip a
会发现br0将原本eth0的ip替代了.
12: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 00:0c:29:3d:1e:4d brd ff:ff:ff:ff:ff:ff
    inet 10.20.70.230/24 scope global br0
       valid_lft forever preferred_lft forever
    inet6 fe80::7411:7ff:fefc:3172/64 scope link 
       valid_lft forever preferred_lft forever
    
10.通过其他服务器连接容器
230宿主机
235容器ip
222其他服务器
通过222连接235 ssh root@10.20.70.235你会发现可以连接了,虽然有点慢,可以自己调整/etc/ssh/sshd_config文件.

如何手动形式实现和pipework一样的功能:

1.创建两个容器
--privileged 容器内的root用户和宿主root用户具有同样的admin权限,否则你在容器中很多操作动干不了
docker run -d -p 5002:22 --name test1 --privileged=true base-centos:v1 /usr/sbin/init
docker run -d -p 5003:22 --name test2 --privileged=true base-centos:v1 /usr/sbin/init

2.给进程号分配网络
ip netns list命令在/var/run/netns目录下查找network namespace。由于Docker创建的network namespace并不在此目录下。所以我们需要把Docker创建的network namesapce的文件链接到/var/run/netns目录下,就可以使用ip netns命令操作了,步骤方法如下:

docker inspect  --format '{{.State.Pid}}' test1
1979
docker inspect  --format '{{.State.Pid}}' test2
2029

创建软连接
mkdir /var/run/netns
ln -s /proc/1979/ns/net  /var/run/netns/test1
ln -s /proc/2029/ns/net  /var/run/netns/test2

查看两个network namespace(容器)
[root@localhost ~]# ip netns list
test2 (id: 1)
test1 (id: 0)

3.创建网桥br0
ip link add br0 type bridge
ip link set  br0 up

然后创建两对 veth-pair,分别放到两个ns中
ip link add veth0 type veth peer name br-veth0 
ip link add veth1 type veth peer name br-veth1

分别将两对 veth-pair 加入两个 ns 和 br0
ip link set veth0 netns test1 
ip link set br-veth0 master br0 
ip link set br-veth0 up 
 
ip link set veth1 netns test2 
ip link set br-veth1 master br0 
ip link set br-veth1 up

4.给两个 ns 中的 veth 配置 IP 并启用

ip netns exec test1 ip addr add 10.1.1.2/24 dev veth0 
ip netns exec test1 ip link set veth0 up
 
ip netns exec test2 ip addr add 10.1.1.3/24 dev veth1 
ip netns exec test2 ip link set veth1 up

验证:ip netns exec test1 ping 10.1.1.3

5.编写网卡配置文件
和上面不一样的就是网桥的配置:我们需要将主机eth0桥接到br0上,并把eth0的IP配置在br0上。
备份自己的网卡:  /etc/sysconfig/network-scripts/ifcfg-ens33      (根据自己的情况修改)
修改网卡  ifcfg-eth0

DEVICE=ens33
ONBOOT=yes
BOOTPROTO=none
TYPE=Ethernet
BRIDGE=br0

新建ifcfg-br0  (根据自己的情况修改)

TYPE=Bridge
USERCTL=no
DELAY=0
NETMASK=255.255.255.0
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=br0
UUID=d5e66258-de2e-4819-97e2-ef3b51604759
DEVICE=br0
ONBOOT=yes
IPADDR=10.20.70.230
PREFIX=24
GATEWAY=10.20.70.2
DNS1=8.8.8.8

systemctl restart network
echo 'DOCKER_NETWORK_OPTIONS="-b=none"' > /etc/sysconfig/docker-network

6.验证使用其他服务器连接容器发现可以输入密码连接了一切ok
[root@lala ~]# ssh root@10.20.70.238
root@10.20.70.238's password:

参考:
https://www.qedev.com/cloud/139821.html
https://blog.csdn.net/u013355826/article/details/97399078

原文地址:https://www.cnblogs.com/liuzhanghao/p/13328175.html