上一篇 docker 使用教程4-(Docker创建Java容器运行SpringBoot项目)
本篇主要介绍Docker容器互联的几种方式,并通过例子演示了自定义网络的好处
Docker容器互联有3种方式:
1、虚拟IP
Docker创建的容器默认是可以相互访问的,每个需要进行网络访问容的器Docker在创建容器时都会为容器分配IP,如MySQL、Tomcat、JDK等容器。但是这个IP是会变化的,当重启Docker之后这个IP就会被重新分配,这就使得之前在配置文件中写的数据库的地址要重新修改,因此不推荐使用这种方式。
2、--link
通过link参数可以把容器的 名称、IP 写入到要连接的容器当中,如:B link A, B就知道A的地址和名称了,但是A容器是已经运行的容器,所有A不知道B,这就是 link 的局限,再则官方已经弃用 link,因此不推荐使用连接容器这种方式。
3、Docker网络
Docker网络一共有4种网络模式,bridge是其中的一种,使用 bridge 创建的网络可以通过容器名称直接映射 IP 决解了重启时 IP 变化的问题。
bridge:桥接 docker(默认,自己创建也是用 bridge模式)
none:不配置网络,一般不用
host:和所主机共享网络
container:容器网络连通(用得少!局限很大)
本教程通过java容器运行SpringBoot项目访问MySQL容器的例子来学习容器互联。
思路:
1、创建网络
2、创建MySQL容器,创建数据库及表,导入数据。
3、创建Java容器、导入SpringBoot项目jar包,运行jar包。
创建网络
①、查看网络
docker network ls
②、创建网络
docker network create my_net
创建MySQL容器
①、拉取镜像
docker pull mysql:8.0.22
②、创建容器
docker run -p 3336:3306 --name mysql_test --network my_net -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.22
参数解释:
-p | 端口映射,格式为:主机端口:容器端口 |
--name | 容器名称 |
--network | 加入网络 |
-e | 设置容器的环境变量(MYSQL_ROOT_PASSWORD=123456 是设置root用户密码为123456) |
-d | 后台运行 |
③、创建数据库和表,插入数据
操作步骤可以参考:Docker安装MySQL
SQL语句:
-- ---------------------------- -- 创建数据库 -- ---------------------------- DROP DATABASE IF EXISTS `network_test`; CREATE DATABASE `network_test` CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_bin'; -- ---------------------------- -- 使用数据库 -- ---------------------------- USE network_test; -- ---------------------------- -- 创建表 -- ---------------------------- DROP TABLE IF EXISTS `news`; CREATE TABLE `news` ( `id` int(0) NOT NULL, `title` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, `content` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic; -- ---------------------------- -- 插入数据 -- ---------------------------- INSERT INTO `news` VALUES (1, '标题1', '内容1创建MySQL容器'); INSERT INTO `news` VALUES (2, '标题2', '内容2创建Java容器');
创建Java容器
①、拉取镜像
docker pull java:8
②、下载SpringBoot项目jar包
下载地址:https://gitee.com/cnetopro/mbatis-plus-demo
下载之后把 jar包 和 Dockerfile 传到服务器。
③、构建镜像
有了java基础镜像、jar包、Dockerfile 就能创建镜像了
docker build -t springbootdemo .
④、运行刚刚构建的镜像
docker run -p 8848:8002 --name java_test --network my_net -d springbootdemo
参数解释:
-p | 端口映射,把主机8848端口映射到容器8002端口 |
--name | 容器名称 |
--network | 加入 my_net 网络 |
-d | 后台运行 |
④、查看
在浏览器输入:http://ip:8848/news 即可看到数据库中的数据
[News(id=1, title=标题1, content=内容1创建MySQL容器), News(id=2, title=标题2, content=内容2创建Java容器)]
总结:
①、SpringBoot项目
数据库地址写的是容器名称,因为 mysql_test 容器和 java_test 容器都被加入了 my_net 网络中,所有可以直接通过容器名称相互访问。这样的话网络名称不变容器名称不变就不用担心 IP 变了。
这里可以把 容器名称想象成 域名,通过容器名称即可访问容器。
port | 8002 |
数据库url |
jdbc:mysql://mysql_test:3306/network_test
|
②、查看网络
docker network inspect my_net
执行命令即可看到两个容器的IP:这里的IP是my_net网络注册的IP
"Containers": { "28709a8d10104d28fce767df56eac99a0c243806a491fdc17bbfd8c1a5914173": { "Name": "java_test", "EndpointID": "45da2e7fcca4e3f339ee054d6237499c64014aacecb2c5e3502268599854f6c9", "MacAddress": "02:42:ac:16:00:03", "IPv4Address": "172.22.0.3/16", "IPv6Address": "" }, "a67d57b93d5041cc2be93bbde95603b1e38615e69d82b1bb080b86b25191c589": { "Name": "mysql_test", "EndpointID": "eb0b01b82e404dfaa1404fb4fb039ebf4b72c069ae3bd9aad082219d9677dbe2", "MacAddress": "02:42:ac:16:00:02", "IPv4Address": "172.22.0.2/16", "IPv6Address": "" } },
上面的IP和进入容器看到的IP是一致的:
进入mysq_test容器
docker exec -it mysql_test bash
查看本机IP:
cat /etc/hosts
进入mysq_test容器
docker exec -it java_test bash
查看本机IP:
cat /etc/hosts