• 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

  • 相关阅读:
    八、JVM视角浅理解并发和锁
    七、JVM类加载机制
    六、JVM命令和工具
    五、jvm垃圾回收3(几种垃圾收集器)
    四、JVM垃圾回收2(垃圾收集算法)
    jvm引用类型
    三、JVM垃圾回收1(如何寻找垃圾?)
    【原创】Android 对话框的使用
    【原创】CMD常用命令:解决实际问题
    【原创】开机出现grub rescue,修复办法
  • 原文地址:https://www.cnblogs.com/liuzhanghao/p/13328175.html
Copyright © 2020-2023  润新知