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,可以自行修改