Docker是一个开源的应用容器引擎,主要利用linux内核namespace实现沙河隔离,用cgroup实现资源限制。
Docker支持三种不同的镜像层次存储drivers:aufs,devicemapper,btrfs。
1.安装docker,使用7.3的yum源
docker是操作系统的特殊进程,docker kvm:对外部没有影响,docker共享物理机,linuxgroup控制
安装软件:
yum install docker-engine-17.03.1.ce-1.el7.centos.x86_64.rpm docker-engine-selinux-17.03.1.ce-1.el7.centos.noarch.rpm
2.docker镜像的导入,删除,已经修改的镜像的保存
docker image #查看现在镜像的环境
docker load -i #docker的加载
docker rmi #docker的删除
docker hub #国内镜像
[root@foundation38 11.17]# docker load -i game2048.tar #下载2048导入
[root@foundation38 11.17]# docker load -i rhel7.tar
[root@foundation38 11.17]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
game2048 latest 19299002fdbe 23 months ago 55.5MB
rhel7 latest 0a3eb3fde7fd 4 years ago 140MB
[root@foundation38 11.17]# docker run -d --name vm1 game2048
0b3aece0ad1e147e3ca91b50c1865114863e301a6812c44503bf2a1a667ccfb3
docker inspect vm1 查看ip,访问首页打开游戏
docker run -it --name vm2 ubuntu #创建容器
docker attach vm2 #连接容器
touch file{1..100} #在容器中进行建立文件
docker commit vm2 ubuntu:v1 #提交容器为镜像
docker images #查看提交的容器
测试:删除vm2容器,重新用提交完成的v1创建新的容器,成功,ls可以列出文件的信息
docker rm vm2
docker run -it --name vm2 ubuntu:v1docker cp /etc/passwd vm2:/xue #本地文件复制到容器中
docker attach vm2 #查看是否复制成功
ls 查看
如果不想登录可以执行查看,也可以对容器的数据直接操作,比如:删除
[root@foundation61 ~]# docker exec vm2 ls / | grep xue
xue
[root@foundation61 ~]# docker exec vm2 ls /xue
/xue
[root@foundation61 ~]# docker exec vm2 rm /xue
[root@foundation61 ~]# docker exec vm2 ls /xue
ls: cannot access /xue: No such file or directory
3.docker的命令:
docker三大组建:registry->images->container
仓库->镜像->容器
镜像->子镜像,代理,国内加速,cache
存储驱动,设备映射
runc:lxc docker遵守oci规范:docker制定规则,tomcat jdk jvm(runtime)
runtime提供daoker的运行环境
docker attach 连接镜像
build 构建image
commit 提交
config 配置 --help 管理配置文件
container管理容器的 容器可操作
cp
docker kill vm1 删除vm1
docker rm vm1 删除vm1
docker history ubuntu:latest #查看层次
docker export vm1 > vm1.tar #导出容器
docker import vm1.tar image #导入容器为镜像 imagedocker run -d --name vm1 -p 8080:80 game2048
iptables -t nat -nL
端口地址映射:本地8080到80
2.1https://www.aliyun.com/阿里云镜像获取
镜像仓库-> 镜像加速器->
配置镜像加速器,针对Docker客户端版本大于 1.10.0 的用户,修改daemon配置文件/etc/docker/daemon.json来使用加速器
cd /etc/docker
vim daemon.json
{
"registry-mirrors": ["https://lko9esfi.mirror.aliyuncs.com"]
}
systemctl daemon-reload
systemctl restart docker
systemctl status docker.service
docker search nginx #查找nginx
docker pull nginx #拉取下载nginx
docker images
docker run -d --name vm1 -p 8080:80 nginx
docker ps
mkdir -p /tmp/docker/
cd /tmp/docker/
echohello xaut > index.html
docker cp index.html vm1:/usr/share/nginx/html
测试浏览器访问:
[root@foundation61 docker]# curl http://172.17.0.2/
hello xaut
如果需要修改主页内容,可以修改index.html发送给vm1显然这样太麻烦,进入vm1修改 docker exec -it vm1 bash, echo xue > index.html,ctrl+p+q退出后台运行,
[root@foundation61 docker]# curl http://172.17.0.2/ion61 docker]# #修改生效
xue
3.数据卷的管理
docker run 在创建容器时使用 -v 参数可以挂载一个或多个数据卷到当前运行的容器中,-v
的作用是将宿主机上的目录作为容器的数据卷挂载到容器中,使宿主机和容器之间可以共
享一个目录。
docker ps -a
docker container prune #删除容器
docker rm `docker ps aq`
docker images
#docker run -d --name vm1 -p 8080:80 -v /tmp/docker/website/:/usr/share/nginx/html nginx #数据卷挂载,只需要改本地的文件,容器中的也就改变了。-v 参数可以重复使用,挂载多个数据卷到容器中,冒号前面的是宿主机的目录(本地目录不存在 docker 会自动创建),冒号后面的是容器中的挂载目录。
[root@foundation61 docker]# docker port vm1
80/tcp -> 0.0.0.0:8080
[root@foundation61 docker]# docker run -it --name vm2 ubuntu
root@0a14574504b1:/# ping baidu.com
PING baidu.com (220.181.57.216) 56(84) bytes of data.
64 bytes from 220.181.57.216: icmp_seq=1 ttl=48 time=89.8 ms
64 bytes from 220.181.57.216: icmp_seq=2 ttl=48 time=107 ms
cd /tmp/docker
[root@foundation61 docker]# cat dvd.repo
[dvd]
name=rhel7.3
baseurl=http://172.25.254.61/rhel7.3
gpgcheck=0
默认挂载可以读写数据卷,也可以只读挂载:
[root@foundation61 docker]# docker run -it --name vm2 -v /tmp/docker/dvd.repo:/etc/yum.repos.d/dev.repo:ro -v /tmp/docker/data1:/data1 -v /tmp/docker/data2:/data2 rhel7 bash
在vm2的data1中建立file{1..10},在物理机/tmp/docker/data1下也建立了file{1..10},文件读写挂载
数据的挂载,yum可以安装软件
12 yum install httpd
13 /usr/sbin/httpd
14 netstat -antlp
15 cd /var/www/html/
16 ls
17 vim index.html
20 curl 172.17.0.2
21 echo xue > index.html
22 curl 172.17.0.2
[root@foundation61 docker]# docker create datavol -v /tmp/docker/dvd.repo:/etc/repos.d/dvd.repo:ro -v /tmp/docker/data1:/data1:ro -v /tmp/docker/data2:/data2 rhel7 #data1中以ro挂载不能删除文件只读形式
4.网络管理四种模式
Docker 在启动时会创建一个虚拟网桥 docker0,默认地址为 172.17.0.1, 容器启动后都会
被桥接到 docker0 上,并自动分配到一个 IP 地址。
vm4没有网络,自己手动添加ip
ip netns add test #添加一个netns
cd /var/run/netns
ls #有test
ip netns del test #删除test 这几个步骤的目的是创建netbns目录,也可以mkdir创建[root@foundation61 netns]# docker inspect vm4 | grep Pid "Pid": 31348, "PidMode": "", "PidsLimit": 0, [root@foundation61 netns]# cd /proc/31348/ns/ [root@foundation61 ns]# ln -s /proc/31348/ns/net /var/run/netns/31348 [root@foundation61 ns]# ip netns list 31348 ip link add name veth0 type veth peer name veth1 ip link set up veth1@veth0 ip link set up veth1 ip link set up veth0 ip addr brctl show brctl addif docker0 veth0 ip addr brctl show ip link set veth1 netns 31348 ip netns exec 31348 ip link set veth1 name eth0 ip netns exec 31348 ip addr add 172.17.0.100/24 dev eth0 ip netns exec 31348 ip link set eth0 up ip netns exec 31348 ip route add default via 172.17.0.1 在server4中测试ip addr,添加网关ping主机 root@b4ef51c7a807:/# ip addr 1: lo:
mtu 65536 qdisc noqueue state UNKNOWN group default 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 69: eth0@if70: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 46:ee:06:14:d7:fe brd ff:ff:ff:ff:ff:ff inet 172.17.0.100/24 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::44ee:6ff:fe14:d7fe/64 scope link valid_lft forever preferred_lft forever root@b4ef51c7a807:/# ping 172.17.0.1 PING 172.17.0.1 (172.17.0.1) 56(84) bytes of data. 64 bytes from 172.17.0.1: icmp_seq=1 ttl=64 time=0.077 ms 64 bytes from 172.17.0.1: icmp_seq=2 ttl=64 time=0.043 ms root@b4ef51c7a807:/# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 172.17.0.1 0.0.0.0 UG 0 0 0 eth0 172.17.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 root@b4ef51c7a807:/# ping 172.25.254.61 PING 172.25.254.61 (172.25.254.61) 56(84) bytes of data. 64 bytes from 172.25.254.61: icmp_seq=1 ttl=64 time=0.056 ms 64 bytes from 172.25.254.61: icmp_seq=2 ttl=64 time=0.056 ms
5.docker的安全:设置特权级运行的容器:--privileged=true
[root@foundation61 docker]# docker run -it --name vm2 --privileged=true ubuntu
[root@foundation61 docker]# docker inspect -f {{.HostConfig.Privileged}} vm2
true
[root@foundation38 docker]# docker rm `docker ps -aq`
6.容器间的互连
docker run -it --name vm1 ubuntu
docker run -it --name vm2 --net container:vm1 ubuntu
[root@foundation38 docker]# docker run -d --name vm3 nginx
root@f700912b4b5f:/# ping vm3
root@f700912b4b5f:/# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3 nginx c827037ce082 vm3
172.17.0.4 f700912b4b5f
root@f700912b4b5f:/# ping nginx
6.如何控制一个程序对CPU的使用率:
dd if=/dev/zero of=/dev/null & #创建一个ddcpu使用率为100%
top #top监控cpu
4033 root 20 0 107936 620 532 R 99.7 0.0 0:56.74 dd
cd /sys/fs/cgroup/
cd cpu
mkdir x1
cd x1/
[root@foundation61 x1]# cat cpu.cfs_quota_us
-1
[root@foundation61 x1]# cat cpu.cfs_period_us
100000
[root@foundation61 x1]# echo 10000 > cpu.cfs_quota_us #修改配置文件
[root@foundation61 x1]# cgset -r cpu.cfs_quota_us=10000 x1 #命令行修改参数
[root@foundation61 x1]# echo 4033 > tasks
[root@foundation61 x1]# cgget -g cpu:x1
x1:
cpu.rt_period_us: 1000000
cpu.rt_runtime_us: 0
cpu.stat: nr_periods 3580
nr_throttled 3580
throttled_time 303868352309
cpu.cfs_period_us: 100000
cpu.cfs_quota_us: 10000
cpu.shares: 1024
t 20 0 107936 620 532 R 10.6 0.0 6:18.07 dd #占用率为10%
[root@foundation61 cpu]# cgdelete -g cpu:x1 #删除控制 4033 root 20 0 107936 620 532 R 100.0 0.0 7:01.43 dd #占用率为100%
[root@foundation61 ns]# docker run -d --name vm2 --cpu-quota 10000 nginx
9192bd73a85f1172ff8c02ca04d1b25a45fd5703ad8eaa065c2fc8c98b268436
ab -c 100 -n 10000000 172.17.0.2/index.html
在server1中(rhel6.5)内存的限制,有一个memapp1和memapp2,需要的内存大小不同,cgroup可以限制进程的内存使用量。
1.安装[root@server1 ~]# yum -y install libcgroup
/etc/init.d/cgconfig start
mount -t cgroup
[root@server1 ~]# ls
memapp1 memapp2
[root@server1 ~]# chmod +x *
[root@server1 ~]# yum install glibc.i686
[root@server1 ~]# su - xuemiao
[xuemiao@server1 ~]$ ./memapp1
Process ID is: 1377
Grabbing 4096 pages of memory
Success!
[root@server1 ~]# cd /dev/shm/
[root@server1 shm]# rm -rf bigfile
[root@server1 shm]# su - xuemiao
[root@server1 shm]# vim /etc/cgconfig.conf
group x1 {
memory {
memory.limit_in_bytes = 20480000;
memory.memsw.limit_in_bytes = 20480000;
}
}
[root@server1 shm]# /etc/init.d/cgconfig restart
Stopping cgconfig service: [ OK ]
Starting cgconfig service: [ OK ]
[xuemiao@server1 ~]$ vim /etc/cgrules.conf
xuemiao:memapp1 memory x1/
xuemiao:memapp2 memory x1/
[root@server1 shm]# /etc/init.d/cgred start
Starting CGroup Rules Engine Daemon: [ OK ]
[xuemiao@server1 ~]$ ./memapp1
Process ID is: 1479
Grabbing 4096 pages of memory
Success!
Press any key to exit
^C
[xuemiao@server1 ~]$ ./memapp2
Process ID is: 1480
Grabbing 8192 pages of memory
Killed