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