Docker(2)

Docker网络

原生网络

[root@server1 harbor]# docker network  ls

默认使用桥接模式,桥接到docker0上

[root@server1 ~]# docker run -d --name demo  nginx
[root@server1 ~]# yum install -y bridge-utils
[root@server1 ~]# brctl show

Docker(2)_第1张图片

host模式,容器和宿主机共享同一网络栈,不会新建虚拟网卡

[root@server1 ns]# docker run -it --rm --network host busybox
//--network host 表示使用主机的网络命名空间,而不是 Docker 默认的网络命名空间

Docker(2)_第2张图片

none禁用网络,只用回环接口

[root@server1 harbor]# docker run -it --rm --network none busybox
//--network none 表示不使用任何网络,即不将容器连接到Docker的默认网络中,也不创建新的网络

Docker(2)_第3张图片

自定义网络

[root@server1 ~]# docker network  create my_net1
//创建一个名为my_net1的Docker自定义网络

Docker(2)_第4张图片

自定义网络地址段

[root@k8s1 ~]# docker network  create --subnet 10.0.0.0/24 --gateway 10.0.0.1 my_net2
//--subnet 10.0.0.0/24 用于指定自定义网络的子网。
  --gateway 10.0.0.1 用于指定自定义网络的网关

Docker(2)_第5张图片

自定义网络内嵌dns解析

[root@server1 ~]# docker run -d --name web1 --network my_net1 nginx
[root@server1 ~]# docker run -it --rm --network my_net1 busybox

Docker(2)_第6张图片

不同网络之间是被隔离的,默认不能通信

[root@server1 ~]# docker run -it --rm --network my_net2 busybox

Docker(2)_第7张图片

不同网络之间的通信需要附加虚拟网卡

把demo接入到my_net1网络
[root@server1 ~]# docker network  connect my_net1 demo
//将Docker容器 "demo" 连接到 "my_net1" Docker网络中
再进入容器
[root@server1 ~]# docker attach demo

Docker(2)_第8张图片

joined容器

两个容器共享一个网络栈

[root@server1 ~]# docker run -it --rm --network container:web1 --name web2 busybox
//创建web2,并连接到web1的网络上

Docker(2)_第9张图片

端口映射

外部主机访问容器可以通过DNAT规则和docker-proxy,只要有一种正常就能通信

[root@server1 ~]# docker rm -f web1
[root@server1 ~]# docker run -d --name web1 -p 80:80 nginx
[root@server1 ~]# iptables -t nat -nL

Docker(2)_第10张图片

也可以手动添加

iptables -t nat -A DOCKER -j DNAT -p tcp --dport 80 --to-destination 172.17.0.2:80

Docker(2)_第11张图片

重启容器后,DNAT规则和docker-proxy策略会自动恢复

Docker数据卷

bind mount

[root@server1 ~]# docker run -it --rm -v /tmp/data1:/data1 -v /tmp/data2:/data2:ro -v /etc/passwd:/mnt/passwd:ro busybox
//
-v /tmp/data1:/data1 表示在容器内创建一个名为 /data1 的目录,并将宿主机的 /tmp/data1 目录与之绑定。
-v /tmp/data2:/data2:ro 表示在容器内创建一个名为 /data2 的目录,并将宿主机的 /tmp/data2 目录与之绑定。:ro 表示该目录是只读的,因此容器中的 /data2 目录只能读取 /tmp/data2 目录的内容,而不能对其进行写入操作。
-v /etc/passwd:/mnt/passwd:ro 同上

Docker(2)_第12张图片

docker managed volume

[root@server1 ~]# docker run -d --name web1 webserver:v3
[root@server1 ~]# docker inspect  web1

Docker(2)_第13张图片

[root@server1 ~]# cd /var/lib/docker/volumes/4cce189f3287a048f2244ac73435f4f12d8bc8c8732b1401e0629fa3d1aa1ec0/_data

docker managed volume会复制目标挂载点的数据

查询docker managed volume,清理所有数据卷
[root@server1 volumes]# docker volume  ls
[root@server1 volumes]# docker volume  ls | grep -v DRIVER | awk '{system("docker volume rm "$2"")}'

Docker(2)_第14张图片创建数据卷

[root@server1 ~]# docker volume  create vol1
[root@server1 ~]# docker volume  inspect vol1

Docker(2)_第15张图片

使用bind mount方式挂载数据卷

[root@server1 ~]# docker run -d --name web1 -v vol1:/usr/local/nginx/html webserver:v3

Docker(2)_第16张图片Docker(2)_第17张图片

还能在挂载时控制权限

[root@server1 ~]# docker rm -f web1
[root@server1 ~]# docker run -d --name web1 -v vol1:/usr/local/nginx/html:ro webserver:v3
[root@server1 ~]# docker create -v /tmp/data1:/data1:rw -v /tmp/data2:/data2:ro -v /etc/passwd:/mnt/passwd:ro --name datavol busybox
[root@server1 ~]# docker run -it --rm --volumes-from datavol busybox

Docker(2)_第18张图片

Docker安全

cgroup

cpu资源限制

[root@server1 cpu]# docker run -it --rm --cpu-period 100000 --cpu-quota 20000 ubuntu
//
--cpu-period 100000 表示为容器设置 CPU 周期。在这个例子中,CPU 周期设置为 100000 微秒,即 100 毫秒。这表示 CPU 将在每个周期内被分配一部分使用时间。
--cpu-quota 20000 表示为容器设置 CPU 配额。在这个例子中,CPU 配额设置为 20000 微秒,即 20 毫秒。这表示容器将在每个周期内最多使用 20 毫秒的 CPU 时间。

root@4058001bed50:/# dd if=/dev/zero of=/dev/null &

Docker(2)_第19张图片

Docker(2)_第20张图片

cpu优先级

[root@server1 docker]# docker run -it --rm  ubuntu
root@94b9979d15ad:/# dd if=/dev/zero of=/dev/null &

[root@server1 docker]# docker run -it --rm --cpu-shares 100 ubuntu
root@294265e00ba3:/# dd if=/dev/zero of=/dev/null &

Docker(2)_第21张图片

测试时只保留一个cpu核心可用,只有争抢cpu资源时优先级才会生效

[root@server1 docker]# cd /sys/devices/system/cpu/cpu1
[root@server1 cpu1]# echo 0 > online

Docker(2)_第22张图片

内存资源限制

[root@server1 ~]# docker run -d --name demo --memory 200M --memory-swap=200M nginx
//容器的内存限制被设置为 200M,同时也将内存交换限制设置为 200M.
[root@server1 ~]# cd /sys/fs/cgroup/memory
[root@server1 memory]# mkdir x1
[root@server1 memory]# cd x1/
[root@server1 x1]# echo 209715200 > memory.limit_in_bytes //系统会将容器能够使用的内存限制设置为 200M,即使容器尝试使用更多的内存,系统也不会分配更多的内存给它

Docker(2)_第23张图片

[root@server1 x1]# yum install -y libcgroup-tools.x86_64
[root@server1 x1]# cd /dev/shm/
[root@server1 shm]# cgexec -g memory:x1 dd if=/dev/zero of=bigfile bs=1M count=300 //bigfile运行在x1中
[root@server1 shm]# free -m

Docker(2)_第24张图片

多出的100M会写入swap

[root@server1 shm]# cd /sys/fs/cgroup/memory/x1/
[root@server1 x1]# echo 209715200 > memory.memsw.limit_in_bytes
[root@server1 x1]# cd -
[root@server1 shm]# cgexec -g memory:x1 dd if=/dev/zero of=bigfile bs=1M count=300

Docker(2)_第25张图片

控制用户内存

[root@server1 shm]# useradd shx
[root@server1 shm]# vim /etc/cgrules.conf
shx     memory  x1/

Docker(2)_第26张图片

[root@server1 shm]# systemctl  start cgred.service
[root@server1 shm]# su - shx
[wxh@server1 ~]$ cd /dev/shm/
[wxh@server1 shm]$ dd if=/dev/zero of=bigfile bs=1M count=200

Docker(2)_第27张图片

磁盘io限制

[root@server1 ~]# docker run -it --rm --device-write-bps /dev/sda:30MB ubuntu
root@c2f964991414:/# dd if=/dev/zero of=bigfile bs=1M count=100 oflag=direct

lxcfs隔离

[root@server1 ~]# yum install lxcfs-2.0.5-3.el7.centos.x86_64.rpm
[root@server1 ~]# lxcfs /var/lib/lxcfs &
[root@server1 ~]# docker run  -it -m 256m \
>       -v /var/lib/lxcfs/proc/cpuinfo:/proc/cpuinfo:rw \
>       -v /var/lib/lxcfs/proc/diskstats:/proc/diskstats:rw \
>       -v /var/lib/lxcfs/proc/meminfo:/proc/meminfo:rw \
>       -v /var/lib/lxcfs/proc/stat:/proc/stat:rw \
>       -v /var/lib/lxcfs/proc/swaps:/proc/swaps:rw \
>       -v /var/lib/lxcfs/proc/uptime:/proc/uptime:rw \
>       ubuntu
rootafcdd4e8190ec:/# free -m

Docker(2)_第28张图片

Docker(2)_第29张图片 容器特权

默认容器内的用户是受限的

[root@server1 ~]# docker run -it --rm busybox
/ # ip a
/ # id
/ # fdisk -l

Docker(2)_第30张图片

开启容器特权

[root@server1 ~]# docker run -it --rm --privileged busybox
/ # fdisk -l
/ # ip link set down eth0
/ # ip link set up eth0

Docker(2)_第31张图片

设置容器白名单

[root@server 1 ~]# docker run -it --rm --cap-add=NET_ADMIN busybox
/ # fdisk -l
/ # ip a a 10.0.0.1/24 dev eth0
/ # ip a
/ # ip a d 10.0.0.1/24 dev eth0
/ # ip a

Docker(2)_第32张图片

你可能感兴趣的:(docker,容器,运维)