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,可以自行修改
    每一次启程都是从搬砖开始......
  • 相关阅读:
    leetcode33. Search in Rotated Sorted Array
    pycharm 设置sublime text3 monokai主题
    django class Meta
    leetcode30, Substring With Concatenation Of All Words
    Sublime text3修改tab键为缩进为四个空格,
    sublime text3 python打开图像的问题
    安装上imesupport输入法依然不跟随的解决办法,
    sublime text3 的插件冲突弃用问题,
    sublime text3 BracketHighlighter括号匹配的设置
    windows 下wget的使用
  • 原文地址:https://www.cnblogs.com/djoker/p/5768604.html
Copyright © 2011-2022 走看看