使用第三方工具连接docker数据库

一、背景

​ 为了把测试环境迁移至docker上,我在centos7上安装了docker,具体安装方法可参考《CentOS7下安装docker》本文不再论述。有些同学可能会有疑问,为什么要那样子做?我给大家看看目前我的docker环境究竟是怎么样的?

# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                    NAMES
9e1ae7ac8ead        postgres:10.6       "docker-entrypoint.s…"   7 seconds ago       Up 4 seconds        192.168.56.8:5433->5432/tcp              chenzx-postgres10.6
927842f243da        postgres:9.6.11     "docker-entrypoint.s…"   16 seconds ago      Up 14 seconds       192.168.56.8:5432->5432/tcp              chenzx-postgres9.6
dcc880f0a503        mysql:5.7.25        "docker-entrypoint.s…"   30 minutes ago      Up 30 minutes       33060/tcp, 192.168.56.8:3307->3306/tcp   chenzx-mysql5.7
56c8605d7d22        mysql:5.6.43        "docker-entrypoint.s…"   About an hour ago   Up About an hour    192.168.56.8:3306->3306/tcp              chenzx-mysql5.6

​ 迁移后,可以在容器中非常快速地建立不同版本的数据库容器,可以做相关的测试。如果测试环境中把数据库弄崩了,咋办?很简单把容易删除重建就好,而且时间就是那么几秒钟的事情。不再像以往可能要花半天一天去弄。当然啦,这种玩法只适合在个人的测试环境中,生产环境暂时不建议使用这些方式,风险太大了。

二、Docker网络知识科普

# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
90270239cfd6        bridge              bridge              local
f97e248a7301        host                host                local
8833271a493a        none                null                local

​ 使用docker命令查看docker的网络模式,这里可以看到有三种,但实际上是有4种模式,最后一种应该是我还无配置所以无法显示出来。下面我们开始介绍这四种模式:

  • bridge模式:使用–net=bridge指定,默认设置。

  • host模式:使用–net=host指定。

  • container模式:使用–net=container:NAME_or_ID指定。

  • none模式:使用–net=none指定。

1. bridge模式

​ Docker 容器默认使用 bridge 模式的网络。其特点如下:

  • 使用一个 linux bridge,默认为 docker0
  • 使用 veth 对,一头在容器的网络 namespace 中,一头在 docker0 上
  • 该模式下Docker Container不具有一个公有IP,因为宿主机的IP地址与veth pair的 IP地址不在同一个网段内
  • Docker采用 NAT 方式,将容器内部的服务监听的端口与宿主机的某一个端口port 进行“绑定”,使得宿主机以外的世界可以主动将网络报文发送至容器内部
  • 外界访问容器内的服务时,需要访问宿主机的 IP 以及宿主机的端口 port
  • NAT 模式由于是在三层网络上的实现手段,故肯定会影响网络的传输效率。
  • 容器拥有独立、隔离的网络栈;让容器和宿主机以外的世界通过NAT建立通信

Screenshot from 2018-06-18 21-23-01.png

2. host模式

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

  • 这种模式下的容器没有隔离的 network namespace
  • 容器的 IP 地址同 Docker host 的 IP 地址
  • 需要注意容器中服务的端口号不能与 Docker host 上已经使用的端口号相冲突
  • host 模式能够和其它模式共存

Screenshot from 2018-06-18 21-25-54.png

3. container模式

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

Screenshot from 2018-06-18 21-26-38.png

4. none模式

网络模式为 none,即不为 Docker 容器构造任何网络环境。一旦Docker

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

三、创建带IP地址、端口映射的容器

​ 了解完docker网络模式,我们根据image的帮助文档结合网络映射等配置,以MySQL为例,得出以下的命令:

docker run --name <ContrinerName> -p IPAddr:HostPort:ContainerPort -d  MYSQL_ROOT_PASSWORD=<MYSQL_ROOT_PASSWORD> -d mysql:<TargetVersion>

执行:

docker run --name chenzx-mysql5.6 -p 192.168.56.8:3306:3306 --network=bridge -e MYSQL_ROOT_PASSWORD=****** -d mysql:5.6.43

执行后就会创建出上文展示的容器chenzx-mysql5.6。MySQL的远程连接端口为3306,故需把这端口映射。PostgreSQL需映射5432端口,Oracle需映射1521端口。

​ 创建容器就行了,为何需要做网络映射?为了是可以让第三方工具进行连接,如Navicat等。

最终效果:

四、参考文献

《docker 之网络配置》

原文地址:https://www.cnblogs.com/nolanchan/p/10396294.html