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\n";
        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,可以自行修改

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM