精华内容
下载资源
问答
  • 目标是实现在宿主——Windows10下面可以访问docker中centos容器里的MySQL数据库。 之前一篇博客记录的是喵哥妥协解决这个问题的方案——在172.17.0.0这个网段里面设置两个centos容器,这样就可以保证两者互相访问...

     

    时隔二十天,喵哥又开始设置docker里centos容器的网络。目标是实现在宿主——Windows10下面可以访问docker中centos容器里的MySQL数据库。

    之前一篇博客记录的是喵哥妥协解决这个问题的方案——在172.17.0.0这个网段里面设置两个centos容器,这样就可以保证两者互相访问数据库,但这没有达到喵哥对数据库服务器的要求——在宿主(Windows10)下编程使用数据库。

    这一次,喵哥从docker的网络模式开始学习、理解、然后去解决问题。

    1.docker的网络模式

    Docker常见的网络模式有:

    1. Bridge模式 --net=bridge(默认)
    2. Host模式 --net=host
    3. Container模式 --net=container:指定容器名
    4. None模式 --net=none
    5. 用户自定义模式

    1.1bridge模式

    Docker网络的默认模式,在docker run启动容器的时候,如果不加--net参数,就默认采用这种网络模式。其特点如下:

    • 使用一个 linux bridge,默认为 docker0

    • 使用 veth 对,一头在容器的网络 namespace 中,一头在 docker0 上

    • 该模式下Docker Container不具有一个公有IP,因为宿主机的IP地址与veth pair的 IP地址不在同一个网段内

    • Docker采用 NAT 方式,将容器内部的服务监听的端口与宿主机的某一个端口port 进行“绑定”,使得宿主机以外的世界可以主动将网络报文发送至容器内部

    • 外界访问容器内的服务时,需要访问宿主机的 IP 以及宿主机的端口 port

    • NAT 模式由于是在三层网络上的实现手段,故肯定会影响网络的传输效率。

    • 容器拥有独立、隔离的网络栈;让容器和宿主机以外的世界通过NAT建立通信

     

    Docker完成以上网络配置的过程大致是这样的:

    1. 在主机上创建一对虚拟网卡veth pair设备。veth设备总是成对出现的,它们组成了一个数据的通道,数据从一个设备进入,就会从另一个设备出来。因此,veth设备常用来连接两个网络设备。 

    2. Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0。另一端放在主机中,以veth65f9这样类似的名字命名,并将这个网络设备加入到docker0网桥中。

     

    容器要跟外埠网络通信,还需要一个NAT路由器,在Windows下它的名称为dockerNAT。

    外界的机器要访问docker容器,可以用端口映射的办法把docker容器的端口跟宿主的端口做一个映射即可。

    iptables -t nat -A  DOCKER -p tcp --dport 8001 -j DNAT --to-destination 172.17.0.19:8000

    在Windows下是:

    netsh interface portproxy add v4tov4 listenaddress=主机的IP listenport=50001 connectaddress=172.17.0.2 connectport=3306

    然而,对于我来说,这些还是不够。虽然,仿佛打通了外界机器与容器的通信,但是消息往往就到宿主就找不到路了。因为没有路由表。在宿主添加10.0.75.1到172.17.0.0网段的路由表,这样就可以了。

     

    1.2host模式

    定义:

    Host 模式并没有为容器创建一个隔离的网络环境。而之所以称之为host模式,是因为该模式下的 Docker 容器会和 host 宿主机共享同一个网络 namespace,故 Docker Container可以和宿主机一样,使用宿主机的eth0,实现和外界的通信。换言之,Docker Container的 IP 地址即为宿主机 eth0 的 IP 地址。其特点包括:

    • 这种模式下的容器没有隔离的 network namespace

    • 容器的 IP 地址同 Docker host 的 IP 地址

    • 需要注意容器中服务的端口号不能与 Docker host 上已经使用的端口号相冲突

    • host 模式能够和其它模式共存

     

    1.3container模式

     Container 网络模式是 Docker 中一种较为特别的网络的模式。处于这个模式下的 Docker 容器会共享其他容器的网络环境,因此,至少这两个容器之间不存在网络隔离,而这两个容器又与宿主机以及除此之外其他的容器存在网络隔离。  

     

    1.4none模式

     

     网络模式为 none,即不为 Docker 容器构造任何网络环境。一旦Docker 容器采用了none 网络模式,那么容器内部就只能使用loopback网络设备,不会再有其他的网络资源。Docker Container的none网络模式意味着不给该容器创建任何网络环境,容器只能使用127.0.0.1的本机网络。

     

    2.解决

    其实在1.1中已经把解决的方案大致说明了。

    只要添加一个10.0.75.1网关到172.17.0.0网段的路由表即可。由于是在宿主访问,不需要添加端口映射表。

     

    route add -p 172.17.0.0 mask 255.255.255.0 10.0.75.2

    然后只要在容器中的MySQL设置好访问权限即可:

    mysql> grant all PRIVILEGES on db_name.* to 'username'@'xxx.xxx.xx.x' identified by 'password' WITH GRANT OPTION;
     
    #说明#
     
    /*
      数据库的授权用grant:
                  grant 权限 on 数据库.表 to 用户 【identified by '密码'】 with grant option;
      其中,
                  权限有:select、insert、update、delete和all privileges。
                  数据库为本地存在的数据库名,表为数据库中的表,如果要全选某个项目,可用*代替,如
                        *.*表示所有数据库的表,exp_country.*表示exp_country中的所有表,max_sal.k1表示max_sal中的k1表。
                  用户,可以在本地自建。也可以是远程的,用'username'@'IP地址'表示。
                  密码为可选项。
                  附带的with grant option可以使得被授权用户也有赋予其他用户权限的权力
      数据库收回权限用revoke:
                  revoke 权限 【on 数据库.表】 option from 用户; 
    */

    例如,喵哥的centos容器需要通过10.0.75.1来转发数据包,所以在MySQL中赋予权限的对象是10.0.75.1.

    grant all PRIVILEGES on db_name.* to 'username'@'10.0.75.1' identified by 'password' WITH GRANT OPTION;

    然后就可以在Windows端的MySQL登录centos的MySQL数据库了。

     

     

     

     

     

    展开全文
  • Docker容器间通信Docker会为每个创建的容器自动分配一个虚拟IP,这个虚拟IP无法从容器外侧进行访问,只是Docker环境内部容器间彼此通信的标识,容器间的网络是互通互联的。但是通过这种虚拟IP方式,进行容器间的通信...

    Docker容器间通信

    Docker会为每个创建的容器自动分配一个虚拟IP,这个虚拟IP无法从容器外侧进行访问,只是Docker环境内部容器间彼此通信的标识,容器间的网络是互通互联的。

    但是通过这种虚拟IP方式,进行容器间的通信,有一些局限性。因为在Docker中创建一个容器非常容易,比如说新创建的MySQL容器可能会替代之前创建的MySQL容器,而此时Tomcat服务器中配置的是之前的MySQL容器的Ip地址,因此随着新容器的创建,之前Tomcat配置的Ip地址需要不断的变更,并重启服务。当有很多Tomcat服务器同时连接MySQL数据库时,这个修改工作就是一个很大的工作量。

    那这个问题如何解决呢?

    容器创建时进行命名,配置连接时不在配置IP地址,而是配置容器的名字,这样以后再创建容器时,只要名字不变,就可以自动连接到新创建的容器。

    举例说明:

    (1)创建web服务

    12345
    # 创建容器 运行Tomcat服务 --name 为容器命名docker run -d --name webserver tomcat

    (2)创建数据库服务(模拟)

    1
    docker run -d --name database -it centos /bin/bash

    注:命令添加中的-d -it 和/bin/bash 是因为centos容器创建完成后,默认就进入退出状态。如果想让其保持运行状态,后台必须保持一个进程在运行,/bin/bash表示启动容器后启动bash。

    (3)查看正在运行的容器

    264e29b37e660fa8711fdff238378a5c.png

    (4)查看两个容器的虚拟IP地址

    通过docker inspect [OPTIONS] NAME|ID 命令查看

    docker inspect : 获取容器/镜像的元数据。

    • 首先查看webserver容器的Ip地址

    1
    docker inspect webserver

    73b71abd6c5acbb3955bcd3c51cad38f.png

    • 查看database容器的IP地址

    1
    docker inspect database

    1fc157d374f875b39b3682884e2d4c42.png

    (5)进入webserver容器内容,测试网络

    1
    docker exec -it webserver /bin/bash

    5fb3070f112d6c7e363e5b9e1a47f853.png

    但是直接ping database却是不通的,因为我们并没有进行相应的网络设置,docker并不知道database和哪个IP是对应的,因此我们可以在创建webserver容器时指定webserver到database的单向通信。

    1、容器间单向通信

    移除上面创建的web容器,并重新创建

    1234567
    # 强制移除webserver容器docker rm -f webserver# 重新创建webserver容器 --link 要链接的容器名称 (--link 可以使新生成的容器链接到已在运行的容器)docker run -d --name webserver --link database tomcat

    cf0a5845446449613d9e25c6fb2f644a.png

    Tomcat中的数据库连接配置文件中的url中的IP地址即可换成database

    2、容器间双向通信

    f6678fafe7a6d14698af64587aba7aaf.png

    图中的网桥充当了Docker容器和外界宿主机之间的通信源,使得容器内部也可以访问互联网

    例如在webserver内部可以访问百度

    507d81745f9c551df78b11dc90b8204a.png

    网桥也可以用于容器内部,实现容器间的双向通信。不仅如此网桥还有另一个重要作用,就是对容器从网络层面进行分组

    (1)通过【docker network ls 】列出当前网络状况明细

    3a737e618e9c1865a2d0f623bcb1941c.png

    上图中列出的bridge即为容器和外界通信的桥梁,如果我们想实现容器内部的双向通信也可以创建一个网桥,具体操作过程如下:

    (2)创建网桥

    1234567
    # 创建网桥docker network create -d bridge my-bridge# 执行命令进行查看docker network ls

    4d5062462ad00ade1a7a5bd3308ff812.png

    (3)将需要通信的容器添加到网桥中

    123
    docker network connect my-bridge webserverdocker network connect my-bridge database

    (4)进入容器进行验证是否能够互相通信

    e9d088940dd69c613daad5fc7f5e34e9.png)3a7089cbc055c08d5972501aedb55407.png

    网桥的原理:创建一个网桥,就相当于在宿主机上安装了一个虚拟网卡,这个虚拟网卡也承担了网关的作用。虚拟网卡和物理网卡之间需要做地址转换

    28154a9bf59b9dbd33694af1f516c77c.png

    展开全文
  • 无法访问Docker容器映射到宿主上的端口启动容器命令:docker run -d -p 3306:3306 mysql在容器内访问3306端口是通的,在宿主上访问3306端口是通的在外界能ping通宿主IP,但无法访问宿主3306端口经检测发现数据包已...

    无法访问Docker容器映射到宿主上的端口

    启动容器命令:docker run -d -p 3306:3306 mysql

    在容器内访问3306端口是通的,在宿主上访问3306端口是通的

    在外界能ping通宿主IP,但无法访问宿主3306端口

    经检测发现数据包已到达iptables的nat链:

    -A DOCKER ! -i docker0 -p tcp -m tcp --dport 3306 -j DNAT --to-destination 172.17.0.3:3306

    未到达forward链:

    -A DOCKER -d 172.17.0.3/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 3306 -j ACCEPT

    重启Docker后在外界可以访问宿主3306端口,防火墙及路由规则与之前一样

    怀疑是路由规则没有生效,但不知道如何检测

    防火墙规则:

    service iptables status表格:filter

    Chain INPUT (policy ACCEPT)

    num target prot opt source destination

    1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED

    2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0

    3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0

    4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22

    5 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:4243

    6 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited

    Chain FORWARD (policy ACCEPT)

    num target prot opt source destination

    1 DOCKER all -- 0.0.0.0/0 0.0.0.0/0

    2 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED

    3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0

    4 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0

    5 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited

    Chain OUTPUT (policy ACCEPT)

    num target prot opt source destination

    Chain DOCKER (1 references)

    num target prot opt source destination

    1 ACCEPT tcp -- 0.0.0.0/0 172.17.0.3 tcp dpt:3306

    表格:nat

    Chain PREROUTING (policy ACCEPT)

    num target prot opt source destination

    1 DOCKER all -- 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL

    Chain POSTROUTING (policy ACCEPT)

    num target prot opt source destination

    1 MASQUERADE all -- 172.17.0.0/16 0.0.0.0/0

    2 MASQUERADE tcp -- 172.17.0.3 172.17.0.3 tcp dpt:3306

    Chain OUTPUT (policy ACCEPT)

    num target prot opt source destination

    1 DOCKER all -- 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL

    Chain DOCKER (2 references)

    num target prot opt source destination

    1 DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:3306 to:172.17.0.3:3306

    路由规则:

    route -nKernel IP routing table

    Destination Gateway Genmask Flags Metric Ref Use Iface

    172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0

    0.0.0.0 x.x.x.x 0.0.0.0 UG 0 0 0 eth0

    没有找到相关结果

    已邀请:

    与内容相关的链接

    展开全文
  • docker访问宿主

    2020-02-20 21:44:54
    Linux中Docker容器访问宿主 只需要查看 docker0 网卡的IP ifconfig 如图所示: 通常是:172.17.0.1 Mac中Docker容器访问宿主 使用 docker.for.mac.host.internal 因为Docker For Mac的Docker Daemon是运行于...

    Linux中Docker容器访问宿主

    只需要查看 docker0 网卡的IP

    ifconfig

    如图所示:
    在这里插入图片描述
    通常是:172.17.0.1

    Mac中Docker容器访问宿主

    使用

    docker.for.mac.host.internal

    因为Docker For Mac的Docker Daemon是运行于虚拟机(xhyve)中的,而不是像Linux上那样作为进程运行于宿主机,因此Docker For Mac没有docker0网桥;

    展开全文
  • macOS访问docker宿主vm

    2019-12-10 18:00:04
    访问vm:screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty 退出vm:ctl+a d
  • [Docker]Mac访问Docker容器IP

    千次阅读 2020-05-25 00:25:01
    Docker for Mac无法在macOS通过IP直接访问Docker中容器,只能通过EXPOSE端口来访问,这个问题在官方文档中有描述,对于大多数情况EXPOSE是够用的。但是对于测试某些集群的时候就会有问题,比如搭建HBase集群,集群会...
  • windows宿主机访问docker容器ip无法ping通容器IPping容器IPC:\WINDOWS\system32>ping 172.17.0.2正在 Ping 172.17.0.2 具有 32 字节的数据:请求超时。请求超时。请求超时。请求超时。172.17.0.2的 Ping 统计信息:...
  • 同理,我在docker里面配置了redis ,里面默认也是127.0.0.1 ,结果宿主机器无法访问docker端口 。这里根据上面的情况也将redis 配置成0.0.0.0   # # Examples: # # bind 192.168.1.100 10.0.0.1 #bind ...
  • 宿主机器不能直接ping容器IP,容器本身内部如果设置的127.0.0.1亦指其容器本身,如果容器需要访问宿主,此时不能简单的使用127.0.0.1而应该使用宿主的内网IP地址或公网地址。 构建和运行服务和数据库容器 通过...
  • 环境 宿主主机 系统window7 ...docker开放远程访问 在作为docker远程服务的centos7机器中配置: 在/usr/lib/systemd/system/docker.service,配置远程访问。主要是在[Service]这个部分,加上下面两个参数
  • 要在防火墙添加docker容器的网段 请允许访问host iptables -F 为什么现在用Toolbox版的Docker,直接使用Docker for Mac最新版你的问题就不是问题了…… Docker其实是运行在Mac系统中的Linux虚拟机中的,Toolbox版的...
  • 转载:https://my.oschina.net/jywm/blog/760183
  • docker部署项目访问宿主数据库

    千次阅读 2019-05-20 11:40:57
    yum安装mariadb 启动数据库, 启动容器加 --net=host 来公用宿主机localhost docker run --net=host -p 8080:8080 hu/ttt
  • 在防火墙开启的状态下,docker容器内部无法访问宿主机服务(能够访问非宿主机的其他局域网计算机的服务),解决方法:1. 配置防火墙规则firewall-cmd --zone=public --add-port={port}/tcp --permanent,并重载防火墙...
  • 例如一个如下场景,在Docker环境下面运行了一个...原理:当docker服务启动起来时,宿主机器便作为网关的存在与其他Docker容器处在同一个网段内,就像是路由器和各个连接终端之间的关系,宿主机就类似于路由器。1、...
  • 在《Docker桥接网络入门》基础知识上,本文将通过实例来创建Docker的桥接网络,包括默认的桥接网络和用户自定义的桥接网络。并通过桥接网络和网络连接来测试各独立容器之间的连通性。环境说明1. 安装docker,可参考...
  • 内容摘要容器访问外部网络外部网络访问容器本节讨论容器与外部...下面分别测试下这3三种网络是否能够访问www.baidu.com:none网络:运行容器,进入容器,使用ping连接百度官网,命令如下:docker run -d --name tom...
  • 1.首先打开 vim /etc/mysql/mysql.conf.d/mysqld.cnf 这个文件,然后将 bind-address = ... 这样就可以了,但是要注意,你的docker容器中程序写的localhost应该改为172.17.0.1,才可以访问宿主机器的mysql
  • docker run --rm -e PMA_HOST=172.17.0.1 -e PMA_PORT=3306 -e PMA_USER=root -e PMA_PASSWORD=root -p 20001:80 phpmyadmin/phpmyadmin
  • 1.问题描述就在今天,我用docker容器跑的FBE突然无法访问了(https访问)。host机工作正常,且host机上的其它容器也都工作正常。只有FBE无法正常工作。具体的表现为:FBE并不是完全无法打开, 而是有时候能打开,有...
  • 内容摘要容器网络连接特性Docker DNS容器共享网络栈在本节开始前,请使用快照恢复容器环境,回到最初的环境。在上一节初步讲解了容器的三种自带网络,以及自定义bridge网络,在容器中使用最多的是bridge网络。下面...

空空如也

空空如也

1 2 3 4 5 ... 17
收藏数 330
精华内容 132
关键字:

宿主访问docker