nacos雌雄同体于分布式太重要了 | 如何docker网络打通容器数据持久化

4,697 阅读3分钟

本文正在参加「金石计划 . 瓜分6万现金大奖」

搭建容器网络

image-20221005152153753.png

  • 如上图我们需要先创建一个网络
 docker network create common-network
  • 创建好之后我们查看下
 docker network ls

容器有哪几种网络

bridge模式

  • 上面我们自己创建了 common-network 网络,通过查看我们能够发现默认是bridge模式,说明docker模式的网络模式就是bridge模式。该模式下容器是没有一个对外IP的。这个和虚拟机有点像Docker采用的NAT方式,容器内部监听的端口于宿主机的端口进行绑定,达到可以访问容器内部功能。

Host模式

Host 模式并没有为容器创建一个隔离的网络环境。而之所以称之为host模式,是因为该模式下的 Docker 容器会和 host 宿主机共享同一个网络 namespace,如果启动容器的时候使用 host 模式,那么这个容器将不会获得一个独立的 Network Namespace,而是和宿主机共用一个 Network Namespace。容器将不会虚拟出自己的网卡,配置自己的 IP 等,而是使用宿主机的 IP 和端口。

container模式

  • 多个docker容器在同一个Network Namespace , 这样两边的容器网络是通的,且在同一个网段中。

none模式

网络模式为 none,即不为 Docker 容器构造任何网络环境。一旦Docker 容器采用了none 网络模式,那么容器内部就只能使用loopback网络设备,不会再有其他的网络资源。Docker Container的none网络模式意味着不给该容器创建任何网络环境,容器只能使用127.0.0.1的本机网络。

安装mysql

 docker run -p 3306:3306 --name mysql -d –restart=always –network common-network -v /data/mysql/conf:/etc/mysql/conf.d -v /data/mysql/logs:/logs -v /data/mysql/data:/data -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0

或者 将 -network 替换成--net

安装nacos

  • 首先我们先通过docker 拉取nacos 镜像。
 docker pull nacos/nacos-server
  • 因为安装好之后涉及 nacos 容器访问 mysql 容器,所以我们需要使用同一个网络启动
 docker run --network common-network --env MODE=standalone --name nacos -d -p 8848:8848 nacos/nacos-server

已经安装的服务如何加入网络

  • 有的时候服务先后间隔时间很长,比如我本地mysql 早就装好了,那个时候没想过要共享网络所以启动的时候就没有添加网络这个选项,虽然说文件都是宿主机挂载的,但是我就不想重新使用新的长串命令去添加网络。
 docker network connect  common-network mysql

查看容器网络

 docker inspect containid

image-20221005154153506.png

  • 如果想看两个容器是否在同一个网络中查网络,比如我们刚才新建的common-network , 通过 docker network ls 查看到是bridge
  • 然后再docker network inspect common-network

image-20221005154520147.png

  • 我们可以看下容器IP
 sudo docker inspect -f='{{.Name}}      {{.NetworkSettings.IPAddress}}' $(sudo docker ps -a -q)

image-20221005160448956.png

  • 刚才自己启动的nacosmysql8.0 因为不在一个网络所以这里没有显示。我们可以通过docker network inspect common-network 分别查看IP

image-20221005160610580.png

配置nacos

  • 刚才启动nacos的时候没有挂在宿主机目录文件,所以这时候我们需要修改nacos配置就只能进入容器手动修改了

进入容器

 docker exec -it nacos bash

image-20221005160823454.png

  • 修改application.properties 中数据库IP和用户名密码 172.18.0.2+root+123456

image-20221005161248794.png

  • 我们只需要配置下MYSQL_SERVICE_HOST 环境变量就行了。

image-20221005161412389.png

  • 配置完成后 exit 后 到宿主机上执行docker restart nacos 重启即可生效。那么还剩下一个问题就是nacos 的配置如何导入到我们新装的mysql 数据库中。
  • 在修改nacos application.properties 文件时截图中应该能够发现同级目录下存在schema.sql ,这个虽然很像是sql结构及数据,但是我自测后发现那个文件并不可行。真正的文件点我下载
  • 需要注意的是nacos不同版本对应不同的初始化sql文件,最好的方式是在github下载nacos安装包,里面会附带sql文件。我下面提供的是2.0.3安装包里的sql文件。
 /*
  * Copyright 1999-2018 Alibaba Group Holding Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
  *      http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
 ​
 /******************************************/
 /*   数据库全名 = nacos_config   */
 /*   表名称 = config_info   */
 /******************************************/
 CREATE TABLE `config_info` (
   `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
   `data_id` varchar(255) NOT NULL COMMENT 'data_id',
   `group_id` varchar(255) DEFAULT NULL,
   `content` longtext NOT NULL COMMENT 'content',
   `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
   `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
   `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
   `src_user` text COMMENT 'source user',
   `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
   `app_name` varchar(128) DEFAULT NULL,
   `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
   `c_desc` varchar(256) DEFAULT NULL,
   `c_use` varchar(64) DEFAULT NULL,
   `effect` varchar(64) DEFAULT NULL,
   `type` varchar(64) DEFAULT NULL,
   `c_schema` text,
   PRIMARY KEY (`id`),
   UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info';
 ​
 /******************************************/
 /*   数据库全名 = nacos_config   */
 /*   表名称 = config_info_aggr   */
 /******************************************/
 CREATE TABLE `config_info_aggr` (
   `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
   `data_id` varchar(255) NOT NULL COMMENT 'data_id',
   `group_id` varchar(255) NOT NULL COMMENT 'group_id',
   `datum_id` varchar(255) NOT NULL COMMENT 'datum_id',
   `content` longtext NOT NULL COMMENT '内容',
   `gmt_modified` datetime NOT NULL COMMENT '修改时间',
   `app_name` varchar(128) DEFAULT NULL,
   `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
   PRIMARY KEY (`id`),
   UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='增加租户字段';
 ​
 ​
 /******************************************/
 /*   数据库全名 = nacos_config   */
 /*   表名称 = config_info_beta   */
 /******************************************/
 CREATE TABLE `config_info_beta` (
   `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
   `data_id` varchar(255) NOT NULL COMMENT 'data_id',
   `group_id` varchar(128) NOT NULL COMMENT 'group_id',
   `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
   `content` longtext NOT NULL COMMENT 'content',
   `beta_ips` varchar(1024) DEFAULT NULL COMMENT 'betaIps',
   `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
   `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
   `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
   `src_user` text COMMENT 'source user',
   `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
   `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
   PRIMARY KEY (`id`),
   UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_beta';
 ​
 /******************************************/
 /*   数据库全名 = nacos_config   */
 /*   表名称 = config_info_tag   */
 /******************************************/
 CREATE TABLE `config_info_tag` (
   `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
   `data_id` varchar(255) NOT NULL COMMENT 'data_id',
   `group_id` varchar(128) NOT NULL COMMENT 'group_id',
   `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
   `tag_id` varchar(128) NOT NULL COMMENT 'tag_id',
   `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
   `content` longtext NOT NULL COMMENT 'content',
   `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
   `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
   `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
   `src_user` text COMMENT 'source user',
   `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
   PRIMARY KEY (`id`),
   UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_tag';
 ​
 /******************************************/
 /*   数据库全名 = nacos_config   */
 /*   表名称 = config_tags_relation   */
 /******************************************/
 CREATE TABLE `config_tags_relation` (
   `id` bigint(20) NOT NULL COMMENT 'id',
   `tag_name` varchar(128) NOT NULL COMMENT 'tag_name',
   `tag_type` varchar(64) DEFAULT NULL COMMENT 'tag_type',
   `data_id` varchar(255) NOT NULL COMMENT 'data_id',
   `group_id` varchar(128) NOT NULL COMMENT 'group_id',
   `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
   `nid` bigint(20) NOT NULL AUTO_INCREMENT,
   PRIMARY KEY (`nid`),
   UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`),
   KEY `idx_tenant_id` (`tenant_id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tag_relation';
 ​
 /******************************************/
 /*   数据库全名 = nacos_config   */
 /*   表名称 = group_capacity   */
 /******************************************/
 CREATE TABLE `group_capacity` (
   `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
   `group_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群',
   `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
   `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
   `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
   `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数,,0表示使用默认值',
   `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
   `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
   `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
   `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
   PRIMARY KEY (`id`),
   UNIQUE KEY `uk_group_id` (`group_id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表';
 ​
 /******************************************/
 /*   数据库全名 = nacos_config   */
 /*   表名称 = his_config_info   */
 /******************************************/
 CREATE TABLE `his_config_info` (
   `id` bigint(64) unsigned NOT NULL,
   `nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
   `data_id` varchar(255) NOT NULL,
   `group_id` varchar(128) NOT NULL,
   `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
   `content` longtext NOT NULL,
   `md5` varchar(32) DEFAULT NULL,
   `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
   `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
   `src_user` text,
   `src_ip` varchar(50) DEFAULT NULL,
   `op_type` char(10) DEFAULT NULL,
   `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
   PRIMARY KEY (`nid`),
   KEY `idx_gmt_create` (`gmt_create`),
   KEY `idx_gmt_modified` (`gmt_modified`),
   KEY `idx_did` (`data_id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租户改造';
 ​
 ​
 /******************************************/
 /*   数据库全名 = nacos_config   */
 /*   表名称 = tenant_capacity   */
 /******************************************/
 CREATE TABLE `tenant_capacity` (
   `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
   `tenant_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Tenant ID',
   `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
   `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
   `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
   `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数',
   `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
   `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
   `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
   `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
   PRIMARY KEY (`id`),
   UNIQUE KEY `uk_tenant_id` (`tenant_id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='租户容量信息表';
 ​
 ​
 CREATE TABLE `tenant_info` (
   `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
   `kp` varchar(128) NOT NULL COMMENT 'kp',
   `tenant_id` varchar(128) default '' COMMENT 'tenant_id',
   `tenant_name` varchar(128) default '' COMMENT 'tenant_name',
   `tenant_desc` varchar(256) DEFAULT NULL COMMENT 'tenant_desc',
   `create_source` varchar(32) DEFAULT NULL COMMENT 'create_source',
   `gmt_create` bigint(20) NOT NULL COMMENT '创建时间',
   `gmt_modified` bigint(20) NOT NULL COMMENT '修改时间',
   PRIMARY KEY (`id`),
   UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`),
   KEY `idx_tenant_id` (`tenant_id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info';
 ​
 CREATE TABLE `users` (
   `username` varchar(50) NOT NULL PRIMARY KEY,
   `password` varchar(500) NOT NULL,
   `enabled` boolean NOT NULL
 );
 ​
 CREATE TABLE `roles` (
   `username` varchar(50) NOT NULL,
   `role` varchar(50) NOT NULL,
   UNIQUE INDEX `idx_user_role` (`username` ASC, `role` ASC) USING BTREE
 );
 ​
 CREATE TABLE `permissions` (
     `role` varchar(50) NOT NULL,
     `resource` varchar(255) NOT NULL,
     `action` varchar(8) NOT NULL,
     UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE
 );
 ​
 INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE);
 ​
 INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');
  • 顺便提一下下载容器文件的指令
 docker cp nacos:/home/nacos/conf/schema.sql /home/zxhtom/zxh/
  • 通过上述命令schema.sql 就会被下载到宿主机的/home/zxhtom/zxh目录下。
  • 下载好上面github提供的nacos-mysql.sql 我们就可以导入了。
  • 有了sql文件你可以通过工具也可以通过命令来操作
 mysqladmin -uroot -h127.0.0.1 -p create nacos-config  # 创建nacos数据库
 mysql -u -h -p nacos-config<nacos-mysql.sql # 导入数据到nacos数据库中

本文正在参加「金石计划 . 瓜分6万现金大奖」