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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值