Docker学习笔记

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:v1

docker 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    #导入容器为镜像 image

docker 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/
echo hello 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


 

你可能感兴趣的:(linux运维)