zoukankan      html  css  js  c++  java
  • docker学习笔记一:基本安装和设置容器静态ip

    docker是一个lxc升级版的容器类虚拟环境,具有快速部署,灵活,易迁移的虚拟机模式,现在各大公司已经开始广泛使用
    为了自己方便学习linux,需要多台虚拟机环境,但是vmware开启多台虚拟机时需要花费大量内存,所以研究了一下docker,操作方便,真的很好用
    发现好多文章都是使用ubuntu的,但是在真实环境中,使用centos居多(国内形势。。。。。。)

    使用环境:Centos6.8 x64

    1.安装eprl
      yum -y install http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
    2.禁用selinux
      vim /etc/sysconfig/selinux
      SELINUX=disabled
      setenforce 0
    3.检查内核是否符合标准
      uname -r
      2.6.32-431.el6.x86_64 内核最低标准
    4.安装docker-io
      yum -y install docker-io
    5.启动docker
      service docker start
      查看是否有docker接口
      4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
      link/ether 66:b2:39:4c:25:46 brd ff:ff:ff:ff:ff:ff
      inet 172.17.42.1/16 scope global docker0
      inet6 fe80::64b2:39ff:fe4c:2546/64 scope link
      valid_lft forever preferred_lft forever
    6.创建容器,因为以前都是使用的openvz,就尝试导入,发现可以使用(现在网上都是别人修改过的容器,并不是自己想要的,想要一个干净的环境)  

      我选用的是centos-6-x86_64-devel.tar.gz,这个包含编译需要的环境,方便编译安装需要的工具
      导入容器
      cat centos-6-x86_64-devel.tar.gz | docker import - centos:v1.0
      查看镜像是否导入
      docker images
      这个环境是干净环境,没有服务,所以需要自己去定制服务(docker在定制方面很灵活,好多地方以后好好研究)
      定制自己的环境(我的环境只启用了ssh服务,能登录即可)
      docker run -h test -it centos:v1.0 /bin/bash 创建虚拟机,并登录

      在root目录下增加文件run,加入如下内容
      #!/bin/bash
      service sshd restart
      /bin/bash

      这个时候启动ssh是无法登录的,修改/etc/ssh/sshd_config

      UsePAM no   修改yes为no

      同时设置root密码,docker默认是没有root密码的

      passwd  root

      然后退出,exit,这个时候容器会停止关闭
      这个时候我们的容器就定制好了,现在保存容器到image中以后使用
      docker commit test centos:latest
      docker images 查看是否多了一个centos latest的镜像

      上面已经定制好了自己的镜像,这个时候就可以创建自己的容器了
      docker run -h node1 --name=node1 --ulimit nofile=65535:655350 -m 512M --memory-swap=1024M --net=none -d -it centos:latest /root/run
      这个时候容器就已经启动,但是不符合我的环境
      -h 主机名
      --name 给容器定义名字
      -ulimit 配置ulimit,当容器启动后就无法更改
      -m 分配内存
      --net=none 不使用docker网络,如果不配置会docker会自动分配ip地址给容器,但是每次重启后ip地址会改变,导致不符合我的环境,也可以用-p把端口映射出去,这样 端口不会改变,使用端口即可,但是正如我所说,不符合我的环境要求,后面采用脚本控制命名空间给容器配置静态ip

    7.使用脚本控制所有

    1.创建网桥接口br0
        brctl addbr br0
        brctl addif br0 eth0
    
    2.创建容器脚本create_container.pl
        #!/usr/bin/perl
        use strict;
        use warnings;
        my $num;
        my $name;
        print "input images name[default->centos]: ";    
        chomp(my $c_img=<STDIN>);
        unless ($c_img) {$c_img='centos'};
        print "input container name: ";
        chomp($name=<STDIN>);
        $num=substr($name,-1);
        my $cmd = "docker run -h $name --name=$name --ulimit nofile=65535:655350  -m 512M --memory-swap=1024M --net=none -d -it $c_img /root/run"; #该行是创建命令,可自己根据要求修改
        system($cmd);
    
    3.配置容器为静态ip地址脚本start_container.pl,该脚本修改后可用ln建立软链接到bin目录下,方便以后调用
        需要添加目录mkdir -pv /var/run/netns/ 
        调用方法: ./start_container.pl node1   后面需要跟容器名,
        #!/usr/bin/perl 
        use strict;
        use warnings;
        my $num = @ARGV;
        if ($num == 0) {
            print "error
    ";
            exit;
        }
        (my $hostname) = @ARGV;
        system("docker start $hostname");
        my @host_info;
        for (<DATA>){
            if (/^$hostname/) {
                @host_info = split('=',$_);
            }
        }
        ($hostname,my $ip) = @host_info;
        chomp($ip);
        my $pid = readpipe("docker inspect -f '{{.State.Pid}}' $hostname");
        chomp($pid);
        system("ln -sf /proc/$pid/ns/net /var/run/netns/$pid");
        system("ip link add neto_$hostname type veth peer name neti_$hostname");
        system("brctl addif br0 neto_$hostname");
        system("ip link set neto_$hostname up");
        system("ip link set neti_$hostname netns $pid");
        system("ip netns exec $pid ip link set dev neti_$hostname name eth0");
        system("ip netns exec $pid ip link set eth0 up");
        system("ip netns exec $pid ip  addr add $ip/24 dev eth0");            #这里为虚拟机添加ip,如果是别的掩码,可以自行修改
        system("ip netns exec $pid ip route add default via 192.168.89.2");   #这里调用shell,如果网关ip是别的,可以自行修改
    
        __DATA__
        node1=192.168.89.11
        node2=192.168.89.12
        node3=192.168.89.13
        node4=192.168.89.14
        node5=192.168.89.15
        node6=192.168.89.16
        #脚本会根据__DATA__下面的配置设置ip,前面是容器名--name定义的,后面=,在后面是ip地址,格式是必须严格按照样例配置,
        #如果懂perl,可以自行修改
    每一次启程都是从搬砖开始......
  • 相关阅读:
    不要同时使用ReentrantLock类与synchronized关键字锁定会修改同一个资源的不同方法
    java中volatile关键字的含义
    浅谈操作系统对内存的管理
    Java线程池使用说明
    写在清明节之后
    PY一天一学
    24小时只睡了1个小时
    关于团队关于吐槽
    出尔反尔
    时间都去哪儿了?
  • 原文地址:https://www.cnblogs.com/djoker/p/5768604.html
Copyright © 2011-2022 走看看