Docker容器内部无法访问外网原因之一

这篇具有很好参考价值的文章主要介绍了Docker容器内部无法访问外网原因之一。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题描述

部署了一个Docker环境,宿主机可以访问Internet,启动了一个容器发现容器里的服务无法访问Internet,Docker网络使用的是桥接(bridge)模式。

问题分析

使用Docker桥接模式启动的容器,宿主机如果可以访问外网,按理来说Docker容器本身也可以访问外网的。其原理:容器网卡与宿主机的docker0网桥互联,在通过nat的转换,通过宿主机的网卡,连接到外网。那可以初步判断容器内部访问不了外网,可能是某些配置的原因。

问题解决

检查docker bridge网络配置:

# docker network inspect bridge 
[
    {
        "Name": "bridge",
        "Id": "52d99eec11c4706581e4b8235613d5258ef2c318557baddbb79766136d7b0868",
        "Created": "2022-10-22T19:31:19.358514137+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "false",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

发现:com.docker.network.bridge.enable_ip_masquerade值为false,代表是否开启IP伪装,false代表未开启。

查看docker服务启动命令:

#ps -ef|grep dockerd
root     15273     1  6 11:35 ?        00:14:25 /usr/bin/dockerd --iptables=false --exec-opt native.cgroupdriver=systemd --data-root=/var/lib/docker --log-opt max-size=50m --log-opt max-file=5

发现参数:--iptables=false,查阅docker官网:

Docker容器内部无法访问外网原因之一

 大概意思是否禁止docker进程添加iptables规则,false代表禁止,禁止后即使开启IP伪装也不生效。可以猜到就是这个参数搞的问题。

Docker服务是yum install部署的,可能有些参数读取的一些预先定义的包环境变量里。

让我们将--iptables改为true,最简单的方式就是覆盖原启动命令中的参数,在docker启动命令最后添加--iptables=true:

# vim /etc/systemd/system/docker.service

[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker.com
After=network.target  containerd.service
BindsTo=containerd.service


[Service]
Type=notify
Environment=GOTRACEBACK=crash
ExecReload=/bin/kill -s HUP $MAINPID
Delegate=yes
KillMode=process
ExecStart=/usr/bin/dockerd \
          $DOCKER_OPTS \
          $DOCKER_STORAGE_OPTIONS \
          $DOCKER_DNS_OPTIONS \
          --ip-masq=true \
          --iptables=true
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity
TimeoutStartSec=1min
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s

[Install]
WantedBy=multi-user.target

然后重启docker进程: 

# systemctl daemon-reload
# systemctl restart docker

然后发现,容器内部可以访问外网了~~~

参考资料:dockerd | Docker Documentation

---------------------------------------------------------------------------------------------------

查阅官网发现:iptables默认值是true的,应该是yum源下载的包里启动命令加了这个参数而且改成了false,这也是导致容器内部无法访问外网的原因之一。文章来源地址https://www.toymoban.com/news/detail-425243.html

到了这里,关于Docker容器内部无法访问外网原因之一的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • docker内无法通过域名访问外网问题解决方案一

    docker中有的时候需要从容器内向外网环境进行访问,这个时候我边出现了一个诡异的问题,从容器的宿主机直接通过curl命令使用域名可以正常的访问并返回正确的解决,但是从容器中向外调用外网环境的这个域名的时候,curl命令会被卡住,一直到超时都没有任何返回数据,

    2024年02月08日
    浏览(49)
  • docker搭建minio服务器,解决内网穿透后外网无法访问问题

    搭建MinIo 内部搭建的MinIo服务器映射到外网后访问文件资源一直报认证异常,经资料查阅minio有自己一套加密校验逻辑,访问时不可改动其桶名 解决内网穿透minio访问异常问题 通过nginx进行代理,代理时不改变访问路径,外网映射时映射nginx的代理地址 修改Nginx配置

    2024年02月11日
    浏览(50)
  • 解决docker容器无法访问的问题

    服务器上的docker容器都无法访问了,而且裸机部署的应用则没有任务问题。 docker容器重启多次均无法访问!!! docker服务重启也无济于事!!! 服务器网卡重启也不行!!! 网上搜了一堆方法: 1、Linux内核和docker版本不匹配的问题,需要重启服务器所以没有试,服务器上

    2024年02月04日
    浏览(45)
  • docker容器项目无法访问mysql

    使用docker容器部署的项目无法访问在主机中安装的mysql? 从项目安全角度考虑,大多数公司在线上项目中都会开启防火墙,并针对指定端口添加白名单的方式进行访问。恰好就遇到了安装在宿主机中的mysql的端口3306没有开启访问,而是需要通过添加ip白名单的方式进行访问。

    2024年02月16日
    浏览(38)
  • docker内部ip与内网其它ip网段冲突导致无法访问的解决方法

    宿主机和docker内部能互相访问非常正常,但docker内部访问外部网络内网其中一个网段172.18.0.x则无法访问。 由于docker是精简过的系统,需另外安装网络相关命令 首先更新apt-get,否则在apt-get install 命令时会报E: Unable to locate package xx错误 安装网络工具 安装ping和telnet 查看本机

    2024年02月08日
    浏览(53)
  • docker 容器无法通过 IP 访问宿主机

    一次部署项目过程中,将Java项目与中间件服务部署在同一远程机器上,出现连接不上中间件服务的问题,而项目在本地运行时是可以连接的,没有问题。 这是因为项目与服务都是通过docker容器运行的,而docker 容器无法通过 IP 访问宿主机(貌似高版本解决了这个问题),所以

    2024年02月09日
    浏览(48)
  • Docker 容器正常启动但通过ip加端口无法访问

    前置条件:使用的阿里云轻量云服务器,ECS服务器应该也是类似的。 问题排查过程 排查linux服务器本身的防火墙是否开启,查看后是关闭的。 排查轻量云服务器的安全组是否将端口加入安全组,否则也是无法访问的,端口已加入安全组,可以排除这个问题。 通过tcping等端口

    2024年02月08日
    浏览(39)
  • 解决docker容器之间网络互通 启动web服务只能本地localhost访问无法从外部访问

    docker容器之间相互访问 1.查看当前的网络 Copy [root@host ~]# docker network ls NETWORK ID          NAME                DRIVER              SCOPE 3dd4643bb158        bridge              bridge              local 748b765aca52        host                host                local 4d59a0cd3ff

    2024年02月10日
    浏览(50)
  • Docker创建tomcat容器实例后无法访问(HTTP状态 404 - 未找到)

    天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。 不指定版本默认拉取的最新的latest版本 查看运行的容器 看到容器正在运行,且端口映

    2024年02月12日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包