>  기사  >  운영 및 유지보수  >  Docker 기본 게이트웨이 수정

Docker 기본 게이트웨이 수정

王林
王林앞으로
2020-10-26 17:00:167178검색

Docker 기본 게이트웨이 수정

기사 배경:

근거리 통신망에서 Docker를 사용할 때 우리가 직면하는 가장 일반적인 혼란 중 하나는 네트워크 세그먼트 전체에서 네트워크가 차단되는 경우가 있다는 것입니다. 그 이유는 Docker가 기본적으로 생성한 게이트웨이가 때때로 LAN 세그먼트와 충돌하기 때문입니다. 예를 들어 Docker가 172.16 네트워크 세그먼트의 시스템에 배포되고 결과 docker0 브리지가 172.17 네트워크 세그먼트인 경우 이는 동일합니다. 실제 환경에서 사용되는 것과 같습니다. 네트워크 세그먼트의 머신 간에 충돌이 있습니다. 즉, 172.17 네트워크 세그먼트의 머신은 핑을 할 수 없습니다.

(권장 튜토리얼: docker 튜토리얼)

충돌을 피하기 위해 가장 먼저 떠오르는 것은 게이트웨이를 변경하는 것입니다. 예를 들어 Centos를 예로 들면 다음과 같습니다.

service docker stop
# 删除docker防火墙过滤规则
iptables -t nat -F POSTROUTING
# 删除docker默认网关配置
ip link set dev docker0 down
ip addr del 172.17.0.1/16 dev docker0
# 增加新的docker网关配置
ip addr add 192.168.2.1/24 dev docker0
ip link set dev docker0 up
# 检测是否配置成功,如果输出信息中有 192.168.5.1,则表明成功
ip addr show docker0
service docker start
# 验证docker防火墙过滤规则

이 변경 후에는 믿을 수 있나요? 대답은 '아니요'입니다. 왜냐하면 docker가 다시 시작된 후에도 docker0이 여전히 다시 빌드되어 우리가 수정한 내용을 덮어쓸 수 있기 때문입니다. 이는 Docker의 IP 규칙이 하드 코딩되어 있으며 이를 임의로 변경할 수 없음을 보여줍니다. 하지만 생각을 바꿔 docker0을 직접 종료하고 새 브리지를 다시 구축해 보겠습니다.

먼저 브리지 생성 도구 brctl을 설치해야 합니다.

sudo yum install -y bridge-utils

생성 작업 시작:

# 1.停止 Docker 服务
service docker stop
 
# 2.创建新的网桥(新的网段)
brctl addbr bridge0
ip addr add 192.168.2.1/24 dev bridge0
ip link set dev bridge0 up
 
# 3.确认网桥信息
ip addr show bridge0
# 4.修改配置文件
/etc/docker/daemon.json(如不存在则创建一个 touch daemon.json),使Docker启动时使用自定义网桥
 
{
  "bridge": "bridge0"
}
# 5.重启 Docker
service docker start
    
# 确认 NAT 网络路由
iptables -t nat -L -n
 
# 6.删除不再使用的网桥
ip link set dev docker0 down
 
brctl delbr docker0
 
iptables -t nat -F POSTROUTING

4단계에서 수정한 구성에 대해서는 여기를 참조하세요. 새 브리지는 실제로 docker 구성 파일에서 참조될 수 있습니다.

echo 'DOCKER_OPTS="-b=bridge0"' >> /etc/sysconfig/docker
sudo service docker start

그러나 이것이 default/docker 또는 sysconfig/docker가 없는 경우 docker 사용자 정의 구성 파일을 확실히 볼 수 있다는 의미는 아닙니다. 해결 방법은 다음과 같습니다.

$ vi /lib/systemd/system/docker.service
#添加一行
$ EnvironmentFile=-/etc/default/docker
或者
$ EnvironmentFile=-/etc/sysconfig/docker
#-代表ignore error
 
#并修改
$ ExecStart=/usr/bin/docker daemon -H fd://
#改成
$ ExecStart=/usr/bin/docker daemon -H fd:// $DOCKER_OPTS
#这样才能使用/etc/default/docker里定义的DOCKER_OPTS参数
 
$ systemctl daemon-reload 重载
$ sudo service docker restart

bridge0 생성을 완료하고 docker0에서 bridge0으로 전환한 후 보고 싶지 않은 172.17 네트워크 세그먼트가 있는지 확인하기 위해 라우팅할 수 있습니다.

Docker 기본 게이트웨이 수정

없는 한 우리는 심장이 172.17 네트워크 세그먼트의 기계에 연결될 뿐만 아니라. 아직 남아 있는 경우 지워질 때까지 ip addr del 172.17.0.1/16 dev docker0 을 사용하십시오(새 docker 브리지가 설정되었으므로 이전 브리지를 삭제해도 docker 사용에 영향을 미치지 않습니다).

기기를 다시 시작한 후 brctl로 생성된 네트워크 브리지가 손실될 수 있는 경우 Linux 자체 시작 스크립트에 다음 명령을 작성하여 다시 시작할 때마다 실행할 수 있습니다.

brctl addbr bridge0
ip addr add 192.168.2.1/24 dev bridge0
ip link set dev bridge0 up

자체 시작 스크립트를 전달할 수 있습니다. /etc/rc에서 실행 가능한 명령문(예: sh /opt/script.sh &)을 .local 파일에 추가합니다. 이렇게 하면 기본적으로 머신을 다시 시작할 때마다 bridge0이 생성되는 것을 보장하고 docker 서비스가 정상적으로 시작될 수 있습니다.

추가: IP 네트워크 세그먼트 충돌을 해결하고 위의 복잡한 프로세스를 실행하고 싶지 않은 경우 실제로 "bip" 콘텐츠를 추가하여 /etc/docker/daemon.json을 변경할 수 있습니다: "ip/ netmask". docker0 브리지의 네트워크 세그먼트를 다음과 같이 변경합니다.

[root@iZ2ze278r1bks3c1m6jdznZ ~]# cat /etc/docker/daemon.json
{
 "bip":"192.168.2.1/24"
}

위 내용은 Docker 기본 게이트웨이 수정의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제