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 | 后台运行 |
③、创建数据库和表,插入数据
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包
下载之后把 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 |
|
②、查看网络
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