一、背景
为了把测试环境迁移至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建立通信
2. host模式
Host 模式并没有为容器创建一个隔离的网络环境。而之所以称之为host模式,是因为该模式下的 Docker 容器会和 host 宿主机共享同一个网络 namespace,故 Docker Container可以和宿主机一样,使用宿主机的eth0,实现和外界的通信。换言之,Docker Container的 IP 地址即为宿主机 eth0 的 IP 地址。其特点包括:
- 这种模式下的容器没有隔离的 network namespace
- 容器的 IP 地址同 Docker host 的 IP 地址
- 需要注意容器中服务的端口号不能与 Docker host 上已经使用的端口号相冲突
- host 模式能够和其它模式共存
3. container模式
Container 网络模式是 Docker 中一种较为特别的网络的模式。处于这个模式下的 Docker 容器会共享其他容器的网络环境,因此,至少这两个容器之间不存在网络隔离,而这两个容器又与宿主机以及除此之外其他的容器存在网络隔离。
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等。
最终效果: