docker container 访问外部宿主机服务

本文介绍了docker容器连接数据库的相关内容。docker容器默认网络采用桥接形式,生产环境连接数据库等只需配置服务地址。开发环境中,若服务在docker运行、数据库在本机,配置127.0.0.1无效,可通过配置宿主机局域网或公网IP,或使用host.docker.internal解决,还提到要手动开启本地数据库外部访问权限。

docker 容器的默认网络是采用桥接的形式(和主机在同一个局域网中,但是单独使用一个独立的局域网IP),程序在生产环境中运行时,连接数据库、redis等只需要配置对应的服务地址就可以了。

在开发环境中,如果服务在docker中运行,数据库在本机运行,配置数据库连接的时候配置 127.0.0.1 就不好使了。

可以用两种方式解决这个问题。

一是将宿主机和容器看着是独立的两台机器,在配置地址的时候配置宿主机的局域网ip或是公网ip。

二是将宿主机地址直接写成: host.docker.internal,不过第二种方式需要docker 版本 大于 18.03,且要在windows和mac下才能用。

要测试这两个方式能不能访问宿主机,可以直接用docker运行一个镜像在命令行进行ping测试:

# Start the Alpine container and drop into a Shell prompt.
docker container run --rm -it alpine sh

# Install the ping utility.
apk update && apk add iputils

# Ping your local network IP address (replace my IP address with yours).
ping 192.168.1.3

# You should see this output (hit CTRL+C to stop it):
PING host.docker.internal 56(84) bytes of data.
64 bytes from 192.168.1.3: icmp_seq=1 ttl=37 time=0.539 ms
64 bytes from 192.168.1.3: icmp_seq=2 ttl=37 time=0.417 ms
64 bytes from 192.168.1.3: icmp_seq=3 ttl=37 time=0.661 ms

最后,本地的数据库,像mysql这种,默认是没有开启外部访问权限的,需要去手动开启。

# 授权
mysql> grant all privileges  on *.* to root@'%' identified by "yourpwd";
# 报错及处理方式
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
mysql> SET GLOBAL validate_password_policy=LOW;
Query OK, 0 rows affected (0.00 sec)

mysql> grant all privileges  on *.* to root@'%' identified by "yourpwd";
Query OK, 0 rows affected, 1 warning (0.01 sec)

# 刷新权限
mysql>FLUSH PRIVILEGES

mysql> quit
Bye

参考资料: 

    https://nickjanetakis.com/blog/docker-tip-35-connect-to-a-database-running-on-your-docker-host

    https://nickjanetakis.com/blog/docker-tip-65-get-your-docker-hosts-ip-address-from-in-a-container?

    https://www.cnblogs.com/cnblogsfans/archive/2009/09/21/1570942.html

<think>好的,我需要帮助用户解决在Docker容器中通过EasyDataset访问宿主机上的Ollama的问题。首先,我得回忆一下Docker容器访问宿主机服务的常见方法。根据之前提供的引用,有几种方法,比如使用host.docker.internaldocker0网桥的IP,或者直接配置网络模式。 用户提到的EasyDataset和Ollama,这两个可能是具体的应用或服务。虽然我对它们的具体细节不太清楚,但访问宿主机服务的通用方法应该适用。接下来,我需要整理出几种可行的方法,并参考之前的引用资料来确保准确性。 首先,host.docker.internal这个方法在Mac和Windows的Docker中是预定义的,但Linux可能需要额外配置。用户可能是在不同的操作系统上运行,所以需要分情况说明。然后,使用docker0网桥的IP,比如172.17.0.1,这个方法在Linux宿主机上有效,但需要确认容器的网络配置是否正确,以及宿主机防火墙是否放行端口。另外,还有一种方法是使用host网络模式,这样容器和宿主机共享网络,可以直接通过localhost访问,但可能会有安全风险。 接下来,我需要考虑权限问题,比如Ollama服务是否监听在正确的接口上,以及是否需要配置身份验证。例如,MySQL的例子中提到需要授权容器的IP访问,可能Ollama也有类似的需求,需要用户检查服务配置。 最后,应该验证连接是否成功,可以通过进入容器内部使用curl或telnet测试端口连通性。同时,提供相关问题的建议,帮助用户进一步解决问题,比如性能优化或网络配置问题。 需要确保步骤清晰,语言简洁,并且引用正确的参考资料。比如提到host.docker.internal时引用[^1]和[^2],使用docker0的IP引用[^3]和[^5],host网络模式引用[^4]。同时,提醒用户注意操作系统差异和权限设置,确保解决方案的全面性。</think>### 如何从 Docker 容器中的 EasyDataset 访问宿主机上的 Ollama #### 1. **使用 `host.docker.internal` 域名** - **适用场景**:Docker for Mac/Windows 默认支持此域名,可直接指向宿主机。Linux 需在容器启动时添加参数 `--add-host=host.docker.internal:host-gateway`[^1]。 - **操作方法**: ```bash # Linux 环境下启动容器时添加参数 docker run --add-host=host.docker.internal:host-gateway -it easydataset-image ``` 在 EasyDataset 配置中,将 Ollama 的地址设置为 `http://host.docker.internal:11434`(假设 Ollama 默认端口为 11434)。 #### 2. **通过 `docker0` 网桥 IP 访问** - **步骤**: 1. 查看宿主机 `docker0` 网桥的 IP: ```bash ip addr show docker0 # 输出中查找 "inet" 字段,如 172.17.0.1 ``` 2. 在 EasyDataset 容器中,通过 `172.17.0.1:11434` 访问宿主机 Ollama 服务[^5]。 3. 确保 Ollama 服务绑定到 `0.0.0.0`(而非仅 `127.0.0.1`)以允许外部访问: ```bash # 启动 Ollama 时指定监听地址(以实际命令为准) ollama serve --host 0.0.0.0:11434 ``` #### 3. **使用 `host` 网络模式(高风险)** - **说明**:容器与宿主机共享网络命名空间,可直接通过 `localhost:11434` 访问 Ollama。 - **启动命令**: ```bash docker run --network=host -it easydataset-image ``` - **注意**:此模式会暴露所有宿主机端口到容器,需谨慎使用[^4]。 #### 4. **验证连接** - 进入容器内部测试端口连通性: ```bash docker exec -it easydataset-container /bin/sh curl http://host.docker.internal:11434 # 或 telnet 172.17.0.1 11434 ``` - 若返回连接失败,检查宿主机防火墙是否放行端口: ```bash ufw allow 11434/tcp # Ubuntu 示例 ``` #### 5. **权限与安全配置** - 若 Ollama 需要身份验证,需在 EasyDataset 中配置对应密钥或 Token。 - 若使用 IP 白名单(如 MySQL 的 `GRANT` 机制),需允许容器 IP 或 `docker0` 网段访问。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值