打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
使用docker的自定义网络network实现服务之间通过容器名称访问
userphoto

2023.08.08 江苏

关注
1. 介绍
1.1 介绍
前面福哥带着大家学习了使用Dockerfile制作PHP、MySQL、Redis和Elasticsearch的镜像,还使用PHP镜像连接了MySQL和Redis。大家可能发现一个问题,就是福哥在使用tfphp去连接tfmysql和tfredis的时候都会先查一下tfmysql和tfredis容器的IP地址,最后通过IP地址连接的tfmysql和tfredis容器上面的服务。为什么一定要用IP地址连接呢?这个IP地址还需要查询一下,而且重启容器后IP地址还会发送变化,太不靠谱了吧?
是的,使用IP地址确实存在各种问题,为了要解决这个问题需要建立一个自定义的docker网络,通过这个自定义的docker网络就可以使tfphp、tfmysql、tfredis、tfelasticsearch几个容器之间通过容器名称连接了!
今天福哥就带着大家建立一个自定义的docker网络tfnet,然后将tfphp、tfmysql、tfredis和tfelasticsearch都加入到tfnet网络里面,容器之间通过tfnet连接!
1.2 环境
操作系统
CentOS 7 x86_64 2009
服务器TFCentOS7x64
IP192.168.168.68
Docker18.06.3-ce, build d7080c1
Docker网络tfnet
2. docker默认网络
docker本身有三类默认网络,我们如果要自定义一个网络的话,也是基于这三类默认网络建立的。
2.1 bridge桥接网络
bridge网络是以桥接的方式建立的一个虚拟网络,每一个使用bridge网络创建的容器都会在网络列表里有一个对应的虚拟网络设备,每一个使用bridge网络创建的容器也都会有一个独立的内网IP地址。
使用bridge网络的容器通过虚拟网络的网关连接互联网!有独立IP地址!
创建一个基于bridge网络的容器network-bridge。
docker run -tid \--name network-bridge \-h network-bridge \--net bridge \registry.tongfu.net:5000/centos:centos7.9.2009
测试容器是否可以联网。
docker exec -ti network-bridge curl -sS https://tongfu.net/api/status
查看容器的IP地址。
docker inspect network-bridge | grep IPAddress
2.2 host主机网络
host网络是共享主机的方式建立的一个虚拟网络,使用host网络创建的容器不会在网络列表里创建虚拟网络设备,因此也不会有独立的内网IP地址。
使用host网络的容器通过共享主机网络连接互联网!没有独立IP地址!
创建一个基于host网络的容器network-host。
docker run -tid \--name network-host \-h network-host \--net host \registry.tongfu.net:5000/centos:centos7.9.2009
可以连接互联网!但是没有IP地址!
docker exec -ti network-host curl -sS https://tongfu.net/api/statusdocker inspect network-host | grep IPAddress
2.3 none无网络
none网络就是没有网络,使用none网络创建的容器是不能连接互联网的!
使用none网络的容器不能连接互联网!
创建一个基于none网络的容器network-none。
docker run -tid \--name network-none \-h network-none \--net none \registry.tongfu.net:5000/centos:centos7.9.2009
不能连接互联网!也没有IP地址!
docker exec -ti network-none curl -sS https://tongfu.net/api/statusdocker inspect network-none | grep IPAddress
3. 创建自定义网络
3.1 查看网络
使用下面的目录查看现有网络。
docker network ls
3.2 创建自定义网络
福哥创建了一个的自定义网络tfnet,网络是10.16.18.0,网关是10.16.18.1。
docker network create \--subnet=10.16.18.0/16 \--gateway=10.16.18.1 \--opt com.docker.network.bridge.name=tfnet \tfnet
再次查看一下网络列表,有了我们的自定义网络tfnet了!
4. 重建所有容器
要想让之前建立的容器使用tfnet网络只能删除旧的容器再建立新的容器才行,建立新的容器的时候使用--net参数指定容器网络为自定义网络tfnet,这样新的容器就会分配10.16.18.0的网络的IP地址了。
4. 重建tfphp
docker rm -f tfphpdocker run -tid \--name tfphp \-h tfphp \--net tfnet \-p 80:80 \-p 443:443 \-v /tongfu.net/data/docker/data/tfphp/html:/var/www/html \registry.tongfu.net:5000/tfphp:7.4-nginx-1.0.0
4. 重建tfmysql
docker rm -f tfmysqldocker run -tid \--name tfmysql \-h tfmysql \--net tfnet \-p 3306:3306 \-v /tongfu.net/data/docker/data/tfmysql:/var/lib/mysql \-e MYSQL_ROOT_PASSWORD=abcdef \registry.tongfu.net:5000/tfmysql:5.7-1.0.0
4. 重建tfredis
docker rm -f tfredisdocker run -tid \--name tfredis \-h tfredis \--net tfnet \-p 6379:6379 \-v /tongfu.net/data/docker/data/tfredis:/var/lib/redis \registry.tongfu.net:5000/tfredis:6.0-1.0.0
4. 重建tfelasticsearch
docker rm -f tfelasticsearch docker run -tid \--name tfelasticsearch \-h tfelasticsearch \--net tfnet \-p 9200:9200 \-v /tongfu.net/data/docker/data/tfelasticsearch:/usr/share/elasticsearch/data \registry.tongfu.net:5000/tfelasticsearch:6-1.0.0
5. 测试连通性
5.1 tfmysql.php
把IP地址172.17.0.3改成tfmysql容器名称,然后测试用PHP连接MySQL数据库。
<?php
header("Content-Type: text/html; charset=utf-8");
try{ // 连接数据库 $pdo = new \PDO("mysql:host=tfmysql;dbname=tfmysql", "root", "abcdef", [\PDO::MYSQL_ATTR_INIT_COMMAND => "set names utf8mb4"]); $pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
// 获取数据库列表 $rs = $pdo->prepare("show databases"); $rs->execute(); $dbs = $rs->fetchAll(\PDO::FETCH_ASSOC);
// 获取数据表列表 $rs = $pdo->prepare("show tables"); $rs->execute(); $tables = $rs->fetchAll(\PDO::FETCH_ASSOC);
// 获取数据表数据 $rs = $pdo->prepare("select * from user"); $rs->execute(); $data = $rs->fetchAll(\PDO::FETCH_ASSOC);
// 数据库 echo "<table border=\"1\"><tbody>"; echo "<tr><th>Database</th></tr>"; foreach ($dbs as $db){ echo "<tr><td>". $db['Database']. "</td>"; } echo "</tbody></table>";
// 数据表 echo "<table border=\"1\"><tbody>"; echo "<tr><th>Table</th></tr>"; foreach ($tables as $table){ echo "<tr><td>". $table['Tables_in_tfmysql']. "</td>"; } echo "</tbody></table>";
// 数据 echo "<table border=\"1\"><tbody>"; echo "<tr>"; foreach ($data[0] as $field => $value){ echo "<th>". $field. "</th>"; } echo "</tr>"; foreach ($data as $row){ echo "<tr>"; foreach ($row as $field => $value){ echo "<td>". $value. "</td>"; } echo "</tr>"; } echo "</tbody></table>";}catch (\PDOException $e){ echo $e->getMessage();}
5.2 tfredis.php
把IP地址172.17.0.3改成tfredis容器名称,然后测试用PHP连接Redis数据库。
<?php
$redis = new \Redis();$redis->connect("tfredis", 6379);$redis->auth("tongfu.net");
echo "<b>String</b><br>";print_r($redis->get("userNick"));echo "<br><br><b>Hash</b><br>";print_r($redis->hgetall("user"));echo "<br><br><b>Set inter</b><br>";print_r($redis->sinter("userTags", "userTags2"));echo "<br><br><b>Set diff</b><br>";print_r($redis->sdiff("userTags", "userTags2"));echo "<br><br><b>Set union</b><br>";print_r($redis->sunion("userTags", "userTags2"));echo "<br><br><b>ZSet</b><br>";print_r($redis->zrevrange("hotSubDomains", 0, -1));
6. 总结
今天福哥带着大家学习了docker的自定义网络network的使用技巧,通过自定义的docker网络就可以让网络内的容器之间通过容器名称进行相互访问,这样实在是太方便了~
虽然有了自定义的docker网络解决了容器之间互联的问题,但是这么多服务管理起来还是有点繁琐的,有没有什么工具可以轻松管理这些容器呢?
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
基于 Docker 开发 NodeJS 应用(2)
Docker安装Redis
Dcoker人性化创建容器脚本
Docker 安装 Redis(指定配置文件方式启动)
Docker系列~配置外部访问容器中的Redis服务(十)
docker 安装redis 并运行
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服