docker container 访问外部宿主机服务

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Docker是一种开源的容器化平台,可以在其中运行应用程序,并且可以使用映射外部文件夹的功能。 映射外部文件夹是指将宿主机上的文件夹与Docker容器中的文件夹进行关联,使得容器中的文件夹能够直接访问宿主机上的文件。这个功能在许多场景中非常有用,比如在容器中运行一个Web服务器,将宿主机上的网站文件夹映射到容器中,使得网站的内容能够实时同步更新。 要实现映射外部文件夹的功能,首先需要创建一个Docker容器,并指定要映射的外部文件夹路径。然后,在运行容器时,通过命令行参数或者配置文件指定宿主机上的文件夹路径和容器中的文件夹路径的对应关系。 在命令行中,使用"-v"选项可以进行映射外部文件夹的操作。例如,可以使用以下命令将宿主机上的"/host_folder"文件夹映射到容器中的"/container_folder"文件夹: docker run -v /host_folder:/container_folder image_name 这样,容器中的程序就可以访问容器中的"/container_folder"路径下的文件,并且修改宿主机上的"/host_folder"中的文件也会直接反映在容器中。 除了命令行参数,也可以使用Docker Compose等工具来进行映射外部文件夹的操作。通过编辑配置文件,指定宿主机上的文件夹路径和容器中的文件夹路径的关联关系,然后使用相应的命令来启动容器。 总的来说,Docker可以通过映射外部文件夹的功能,实现和宿主机的文件系统的交互,方便了数据的共享和实时更新。 ### 回答2: 在Docker中,可以使用卷(Volumes)功能来映射外部文件夹。 首先,我们需要创建一个外部文件夹,可以在宿主机上的任何位置创建。例如,我们可以在宿主机上创建一个名为“/data”的文件夹。 然后,在运行Docker容器时,可以使用“-v”参数来将外部文件夹映射到容器内部。语法为“-v <外部文件夹路径>:<容器内部文件夹路径>”。例如,我们可以使用以下命令来运行一个nginx容器,并将宿主机上的“/data”文件夹映射到容器内的“/var/www/html”文件夹: docker run -d -p 80:80 -v /data:/var/www/html nginx 这样,宿主机上的文件夹“/data”中的内容将会被映射到容器内的“/var/www/html”,在容器内进行修改将同步到宿主机上的文件夹。 值得注意的是,如果外部文件夹不存在,Docker会自动创建一个空文件夹。如果外部文件夹已经存在,容器中的数据将会覆盖宿主机上的数据。因此,在映射外部文件夹时要注意文件夹路径的选择。 此外,使用卷映射外部文件夹还有另一个好处,即容器删除后,外部文件夹中的数据仍然保持不变。这使得数据的持久化存储和共享变得更加简单和可靠。 总结一下,通过在Docker运行时使用“-v”参数,我们可以将外部文件夹映射到容器内部,实现数据的共享和持久化存储。 ### 回答3: Docker 是一个开放源代码的平台,用于自动化应用程序的部署、运行和管理。在 Docker 中,可以通过映射外部文件夹的方式实现容器与主机之间的数据共享。 在 Docker 中,可以使用 `-v` 或 `--volume` 参数来实现容器和主机文件夹的映射。通过指定主机的文件夹路径和容器内的文件夹路径,Docker 将会在运行容器时,自动将主机文件夹的内容映射到容器内部。例如,可以使用以下命令来在 Docker 中映射外部文件夹: ```bash docker run -v /host/folder:/container/folder docker_image ``` 其中,`/host/folder` 是主机上的文件夹路径,`/container/folder` 是容器内部对应的文件夹路径,`docker_image` 是要运行的 Docker 镜像。 通过这种映射方式,可以在容器内部对外部文件夹进行读写操作,并且对外部进行的任何修改都会反映到主机文件夹上。这对于让容器可以访问主机上的文件资源非常有用,特别是在需要共享配置文件、日志文件等情况下。 需要注意的是,当使用映射外部文件夹时,需要确保主机上的文件夹和容器内的文件夹都存在,否则会报错。此外,还要注意文件权限的问题,容器内的操作可能会导致文件权限问题,需要根据实际情况进行适当的调整。 总结来说,通过 Docker 的文件夹映射功能,可以实现容器内外的数据共享,方便地在容器中访问和修改主机上的文件资源。这为开发和部署提供了便利,使得应用程序能够在容器中独立运行,并与主机进行数据交互。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值