zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    python 包与模块
    互斥锁与自旋锁
    TCP三次握手四次挥手
    缓存击穿、缓存穿透、缓存雪崩
    五种IO模型
    MySQL使用mysqldump进行数据备份
    golang数据库连接池参数设置
    golang代码文件目录组织、包目录组织学习笔记
    【转】如何用Vim提高开发效率
    emacs显示行号
  • 原文地址:https://www.cnblogs.com/easyidea/p/14246657.html
Copyright © 2011-2022 走看看