docker容器使用host主机模式修改宿主机的iptables规则

有时遇到需要在容器内部修改宿主机的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 rundocker-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命令应用及配置规则

posted on 2021-05-10 19:06  进击的davis  阅读(1236)  评论(0编辑  收藏  举报

导航