Docke 使用教程5-(容器互联)

上一篇 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
原文地址:https://www.cnblogs.com/easyidea/p/14246657.html