有时遇到需要在容器内部修改宿主机的iptables规则的需要,比如笔者最近就遇到这样的需求,有什么办法可以实现呢?
答案肯定是有,慢慢道来。
docker的容器运行时,其network namespace是默认bridge形式,可以简单理解为nat形式,通过端口映射可以实现遇主机外的host通信。除此以外还有多种net形式,比如host,none,container等,感兴趣可以参考博文:docker 网络的几种模式
通常我们启动docker运行时,虽然也是root用户,但不是真正的root权限,很多内核态的权限并没有开放,比如iptables,具体权限可以参考:docker容器权限设置--cap-add | --cap-drop | privileged
比如,我们本文开头说到的容器内部修改宿主机的iptables需求,我们可以通过cap-add及network-mode这两项实现。
启动docker容器有多种方式,常见的有docker run
和docker-compose up
两种方式,分别对应单容器启动与多容器形成服务的启动,下面看看单容器启动与compose启动。
docker run
举个例子:
docker run -td --name=test --cap-add=NET_ADMIN --cap-add=NET_RAW --net=host [-p | -v ] image_name|ID /bin/bash
docker-compose
举个例子:
在docker-compose.yaml
文件里面设置
version: "3.6"
service:
server_name:
image: xxx
hostname: xxx-test2
container_name: xxx-test2
# privileged: true
cap_add:
- NET_ADMIN
- NET_RAW
network_mode: "host"
# depends_on:
# redis:
# condition: service_started
volumes:
- /opt/xxx/:/opt/xxx/
- /var/log/xxx/:/opt/log/xxx/
restart: always
command: /bin/bash
tty: true
stdin_open: true
logging:
options:
max-size: "200M"
max-file: "5"
通过上面的两种方式设置,即可实现容器修改宿主机的iptables的目的,具体的iptables的修改参考博文:linux下iptables命令应用及配置规则