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
host模式,容器和宿主机共享同一网络栈,不会新建虚拟网卡
[root@server1 ns]# docker run -it --rm --network host busybox
//--network host 表示使用主机的网络命名空间,而不是 Docker 默认的网络命名空间
none禁用网络,只用回环接口
[root@server1 harbor]# docker run -it --rm --network none busybox
//--network none 表示不使用任何网络,即不将容器连接到Docker的默认网络中,也不创建新的网络
自定义网络
[root@server1 ~]# docker network create my_net1
//创建一个名为my_net1的Docker自定义网络
自定义网络地址段
[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 用于指定自定义网络的网关
自定义网络内嵌dns解析
[root@server1 ~]# docker run -d --name web1 --network my_net1 nginx
[root@server1 ~]# docker run -it --rm --network my_net1 busybox
不同网络之间是被隔离的,默认不能通信
[root@server1 ~]# docker run -it --rm --network my_net2 busybox
不同网络之间的通信需要附加虚拟网卡
把demo接入到my_net1网络
[root@server1 ~]# docker network connect my_net1 demo
//将Docker容器 "demo" 连接到 "my_net1" Docker网络中
再进入容器
[root@server1 ~]# docker attach demo
joined容器
两个容器共享一个网络栈
[root@server1 ~]# docker run -it --rm --network container:web1 --name web2 busybox
//创建web2,并连接到web1的网络上
端口映射
外部主机访问容器可以通过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
也可以手动添加
iptables -t nat -A DOCKER -j DNAT -p tcp --dport 80 --to-destination 172.17.0.2:80
重启容器后,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 managed volume
[root@server1 ~]# docker run -d --name web1 webserver:v3
[root@server1 ~]# docker inspect web1
[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"")}'
创建数据卷
[root@server1 ~]# docker volume create vol1
[root@server1 ~]# docker volume inspect vol1
使用bind mount方式挂载数据卷
[root@server1 ~]# docker run -d --name web1 -v vol1:/usr/local/nginx/html webserver:v3
还能在挂载时控制权限
[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安全
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 &
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 &
测试时只保留一个cpu核心可用,只有争抢cpu资源时优先级才会生效
[root@server1 docker]# cd /sys/devices/system/cpu/cpu1
[root@server1 cpu1]# echo 0 > online
内存资源限制
[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,即使容器尝试使用更多的内存,系统也不会分配更多的内存给它
[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
多出的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
控制用户内存
[root@server1 shm]# useradd shx
[root@server1 shm]# vim /etc/cgrules.conf
shx memory x1/
[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
磁盘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
容器特权
默认容器内的用户是受限的
[root@server1 ~]# docker run -it --rm busybox
/ # ip a
/ # id
/ # fdisk -l
开启容器特权
[root@server1 ~]# docker run -it --rm --privileged busybox
/ # fdisk -l
/ # ip link set down eth0
/ # ip link set up eth0
设置容器白名单
[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