当前位置:   article > 正文

docker container 访问外部宿主机服务_host.docker.internal

host.docker.internal

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

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

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

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

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

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

  1. # Start the Alpine container and drop into a Shell prompt.
  2. docker container run --rm -it alpine sh
  3. # Install the ping utility.
  4. apk update && apk add iputils
  5. # Ping your local network IP address (replace my IP address with yours).
  6. ping 192.168.1.3
  7. # You should see this output (hit CTRL+C to stop it):
  8. PING host.docker.internal 56(84) bytes of data.
  9. 64 bytes from 192.168.1.3: icmp_seq=1 ttl=37 time=0.539 ms
  10. 64 bytes from 192.168.1.3: icmp_seq=2 ttl=37 time=0.417 ms
  11. 64 bytes from 192.168.1.3: icmp_seq=3 ttl=37 time=0.661 ms

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

  1. # 授权
  2. mysql> grant all privileges on *.* to root@'%' identified by "yourpwd";
  3. # 报错及处理方式
  4. ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
  5. mysql> SET GLOBAL validate_password_policy=LOW;
  6. Query OK, 0 rows affected (0.00 sec)
  7. mysql> grant all privileges on *.* to root@'%' identified by "yourpwd";
  8. Query OK, 0 rows affected, 1 warning (0.01 sec)
  9. # 刷新权限
  10. mysql>FLUSH PRIVILEGES
  11. mysql> quit
  12. 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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/258233
推荐阅读
相关标签
  

闽ICP备14008679号