docker网络问题解决办法“大全”:宿主机访问不了docker容器中web服务,容器内访问不了外网的问题的解决办法...

本文记录了在Ubuntu Kylin 15上安装Docker后遇到的问题及解决过程,包括容器内外无法互访、重建docker0网络、安装bridge-utils等步骤,并提供了升级Docker版本的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ubuntu kylin 15 安装docker后 ,启动包含web应用的容器,在宿主机上死活访问不了web服务。后来发现进入容器后,安装不了软件,访问不了外网。

因此网上查原因,有大神说让重建docker0网络,重建的过程中,发现brctl未安装,因此安装了bridge-utils,执行如下命令,一切正常。

nnd,困惑了好久!!!

 

重建docker0网络

pkill docker
iptables -t nat -F
ifconfig  docker0 down
brctl delbr docker0
docker -d


转折:过了一天启动docker,发现容器内又访问不了外网了,容器外也访问不了容器内的web服务。

按照上面的命令清理iptables,重建docker0也没有效果。查了stackoverflow又很多人也有同样的问题,解决办法如上,对我无效。

但是下面留言有如下方案,照做后问题解决,不知道以后是否会出现。

1,在docker run命令启动容器时,增加--net=host ,问题解决,但是无法进行端口映射,只能用容器暴漏的端口。

2,上面是临时解决办法,使用systemctl restart docker之后,问题解决,可以进行端口映射。

 

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

转折: docker version 查看,我的docker版本是1.6,而最新版本是1.9.1,我准备升级到最新版本。命令如下:

设置下载docker的源地址为: https://get.docker.io/ubuntu apt-get -y installapt-transport-https

# apt-keyadv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
# bash -c "echo deb https://get.docker.io/ubuntu docker main >/etc/apt/sources.list.d/docker.list"
# apt-get update
# apt-get -y install lxc-docker
# docker -v  //查看docker版本
# ps -ef | grep docker 
root    17311    1  0 Feb13 ?        00:00:43 /usr/bin/docker -d
 旧版本Docker升级
注:使用ubuntu源安装的Docker是不能升级到最新版本的,因为ubuntu源中是没用最新版本Docker的
注:升级中所有运行容器都会自动关闭,最好升级前备份容器。
# apt-getupdate
以下是两种升级方式:
# apt-get -u -y upgrade lxc-docker    安全升级
# apt-get -u -y dist-upgrade lxc-docker  安全升级失败可用这个强制解决依赖包升级
# docker -v  //查看docker版本

升级完成后,启动docker,  systemctl start docker, 报错:

Failed to start docker.service: Unit docker.service is masked.
百度后,使用如下命令解决
systemctl unmask docker.service
systemctl unmask docker.socket
systemctl start docker.service
重新启动docker,一切正常。启动容器,在宿主机浏览器中访问容器中的web服务,也能正常访问。
root@liu-Rev-1-0:/home/liu# docker run -d -P --name=webapp training/webapp python app.py
94b07bd9b88d4460eba794b081586756fe4329ba04995c2c9faa342951f803bd


 

转载于:https://www.cnblogs.com/ldw85/p/5218766.html

### 配置 Docker 容器访问宿主机 MySQL 数据库 为了使 Docker 容器能够成功连接到宿主机上的 MySQL 数据库,需执行几个关键配置: #### 编辑 MySQL 配置文件 找到并编辑 MySQL 的配置文件 `mysqld.cnf` 或者 `my.cnf` 文件位置通常位于 `/etc/mysql/` 下面的子目录中。将绑定地址由默认仅监听本地回环接口改为监听所有网络接口或指定 IP 地址。 ```bash # 使用vi或其他文本编辑工具打开配置文件 sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf ``` 注释掉原有 bind-address 行或将之更改为 0.0.0.0 来接受来自任何地方的请求[^1]。 #### 设置 MySQL 用户权限 确保 MySQL 已经创建了一个可以被容器使用的账户,并赋予该账号足够的操作权限给特定数据库。假设要授予名为 `showx` 的用户对 `showx` 库的所有权限,则可以在 MySQL 命令行客户端里输入如下命令来完成授权: ```sql GRANT ALL PRIVILEGES ON showx.* TO 'showx'@'%' IDENTIFIED BY 'your_password'; FLUSH PRIVILEGES; ``` 这里 `'%'` 表示允许从任意IP地址发起连接;如果只希望让某个具体的网段内的机器能连入的话则应替换为实际范围如 `'172.17.%.%'`. 对于某些情况可能还需要显式地给予通配符形式下的具体 IP 访问权限,比如针对Docker默认桥接网络中的设备(通常是类似于 `172.17.0.x` 这样的私有IPv4),可以通过下面语句实现: ```sql GRANT ALL PRIVILEGES ON showx.* TO 'showx'@'172.17.0.%' IDENTIFIED BY 'password'; ``` 这一步骤是为了防止由于防火墙策略等原因造成只有本机才能正常建立TCP/IP通信的情况发生[^2]. #### 测试连接性 进入目标应用所在的容器内部环境尝试手动建立与外部MySQL实例之间的连接关系作为初步验证手段之一: ```shell docker exec -it container_id_or_name bash # 如果不是基于Alpine Linux镜像构建的服务端程序建议使用此方式启动交互模式终端会话 mysql -uusername -ppassword --host=host_ip_address --port=3306 dbname ``` 其中 `-u`, `-p`, `--host`, `dbname` 参数分别对应着之前设定好的用户名、密码字符串以及宿主机的实际公网/局域网可达IP加上所选端口号还有想要操作的目标DB名称[^5]. #### 修改应用程序配置 最后,在Web服务或者其他依赖于持久化存储的应用层面上调整其对应的数据库连接参数部分使之指向正确的服务器定位信息即宿主机的真实外网或者内网固定IP而非简单的 `"localhost"` 字样.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值