SpringCloudAlibaba微服务项目部署到Docker最细节教程

关于本篇

如何一步步的部署Dokcer
如何用IDEA把SpringCloudAlibaba微服务项目一步步的部署到Docker中
环境:腾讯云2核4G6M,CentOS7.8版本最小化安装
常用端口放行,一定要启动防火墙,不然可能连接不上docker
systemctl start firewalld
systemctl enable firewalld
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd --zone=public --add-port=6379/tcp --permanent
firewall-cmd --zone=public --add-port=5672/tcp --permanent
firewall-cmd --zone=public --add-port=15672/tcp --permanent
firewall-cmd --zone=public --add-port=8848/tcp --permanent
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --zone=public --add-port=2376/tcp --permanent
firewall-cmd --reload

CentOS7安装Docker

1.安装必要依赖
yum install -y yum-utils device-mapper-persistent-data lvm2 lrzsz

2.设置为阿里源仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache

3.可以查看所有仓库中所有docker版本
yum list docker-ce --showduplicates | sort -r

4.安装最新docker
yum install -y docker-ce-18.06.3.ce

5.启动,开机自启
systemctl start docker
systemctl enable docker

6.使用阿里镜像加速
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://xxxxxx.mirror.aliyuncs.com"]  #这里登录阿里云查看自己的地址
}
EOF

7.docker网络可恢复
vim /etc/sysctl.conf
     net.ipv4.ip_forward=1

8.重启network
systemctl restart network

给Docker配置TSL,安全的外部连接

idea需要配置Docker部署项目
但2375端口经常被黑客扫描放入挖矿软件
所以我们关闭2375端口,开启2376用TSL来远程连接Dokcer

首先创建一个目录用于存储生成的证书和秘钥
mkdir -p /mydata/docker-ca && cd /mydata/docker-ca

创建CA证书私钥,生成文件为ca-key.pem,期间需要输入两次私钥密码
openssl genrsa -aes256 -out ca-key.pem 4096

根据私钥创建CA证书,生成文件为ca.pem,期间需要输入CA证书私钥密码
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -subj "/CN=*" -out ca.pem

创建服务端私钥,生成文件为server-key.pem
openssl genrsa -out server-key.pem 4096

创建服务端证书签名请求文件,用于CA证书给服务端证书签名,IP需要换成自己服务器的IP地址或域名,生成文件server.csr
openssl req -subj "/CN=81.70.103.2" -sha256 -new -key server-key.pem -out server.csr

配置白名单,用多个用逗号隔开,例如IP:81.70.103.2,IP:0.0.0.0,如果省略会造成错误
echo subjectAltName = IP:81.70.103.2,IP:0.0.0.0 >> extfile.cnf

将Docker守护程序密钥的扩展使用属性设置为仅用于服务器身份验证
echo extendedKeyUsage = serverAuth >> extfile.cnf

创建CA证书签名好的服务端证书,生成文件为server-cert.pem,期间需要输入CA证书私钥密码
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf

创建客户端私钥,生成文件为key.pem
openssl genrsa -out key.pem 4096

创建客户端证书签名请求文件,用于CA证书给客户证书签名,生成文件client.csr;
openssl req -subj '/CN=client' -new -key key.pem -out client.csr

要使密钥适合客户端身份验证,请创建扩展配置文件
echo extendedKeyUsage = clientAuth >> extfile.cnf

创建CA证书签名好的客户端证书,生成文件为cert.pem,期间需要输入CA证书私钥密码
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf

删除多余的文件
rm -rf ca.srl server.csr client.csr extfile.cnf

修改证书为只读权限保证证书安全
chmod -v 0400 ca-key.pem key.pem server-key.pem
chmod -v 0444 ca.pem server-cert.pem cert.pem

归集服务器证书
cp server-*.pem  /mydata/docker-ca/ && cp ca.pem /mydata/docker-ca/

配置Docker支持TLS,修改以ExecStart开头的配置
vim /usr/lib/systemd/system/docker.service

修改内容如下
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --tlsverify --tlscacert=/mydata/docker-ca/ca.pem --tlscert=/mydata/docker-ca/server-cert.pem --tlskey=/mydata/docker-ca/server-key.pem

重启Docker服务,这样就支持使用TLS进行远程访问
systemctl daemon-reload && systemctl restart docker

sz ca.pem cert.pem key.pem
将三个文件复制到本机指定目录,这里复制到了G:\Java\certfile
ca.pem	     -----CA证书
cert.pem 	 -----客户端证书
key.pem 	 -----客户端证书私钥

测试提示docker版本信息则表示成功
docker --tlsverify --tlscacert=/mydata/docker-ca/ca.pem --tlscert=/mydata/docker-ca/server-cert.pem --tlskey=/mydata/docker-ca/server-key.pem -H=81.70.103.2:2376 version

Win10+IDEA连接Docker

IDEA安装Docker插件,重启IDEA
SpringCloudAlibaba微服务项目部署到Docker最细节教程_第1张图片
Win10配置系统环境变量,重启Win10
SpringCloudAlibaba微服务项目部署到Docker最细节教程_第2张图片

SpringCloudAlibaba微服务项目部署到Docker

  1. Docker安装mysql
1.拉取镜像
docker pull mysql:latest

2.运行容器并密码设置
docker run -p 3306:3306 --name mysql \
-e MYSQL_ROOT_PASSWORD=123@abc \
-d mysql

3.内存小,优化一下mysql内存
进入容器依次执行
docker exec -it mysql /bin/bash
cd /etc/mysql/conf.d
apt-get update
apt-get install -y vim
vim /etc/mysql/conf.d/docker.cnf
	#添加内容如下
	performance_schema_max_table_instances=400  
	table_definition_cache=400
	table_open_cache=256
	performance_schema = off
保存

4.防止此容器重新生成镜像后没有表数据
	在mysql容器的根目录创建
		mkdir /workdir
	将/var/lib/mysql复制到新建目录中
		cp -r /var/lib/mysql /workdir/
	修改配置文件
		vim /etc/mysql/my.cnf
			datadir = /workdir/mysql

5.exit退出容器,重启mysql容器
	docker restart mysql
  1. Docker安装nacos
1拉取镜像
	docker pull nacos/nacos-server:latest
2查看mysql容器ip
	docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql
3...
4运行nacos
	docker run -d -p 8848:8848 --name nacos \
	-e MODE=standalone \
	-e JVM_XMS=256m -e JVM_XMX=512m \
	-e MYSQL_SERVICE_HOST=172.17.0.8 \           ------这里写刚才查到的mysql容器ip
	-e MYSQL_SERVICE_DB_NAME=nacos_config \
	-e MYSQL_SERVICE_USER=root \
	-e MYSQL_SERVICE_PASSWORD=123@abc \
	nacos/nacos-server

这是上面的第三步:创建一个nacos_config数据库,(也可以参考nacos官方文档)以下sql复制执行

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_info   */
/******************************************/
CREATE DATABASE IF NOT EXISTS nacos_config
DEFAULT CHARACTER SET utf8mb4
DEFAULT COLLATE utf8mb4_general_ci;
use nacos_config

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(20) 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(20) 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(20) 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(20) 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');

现在有nacos和mysql服务
在这里插入图片描述在这里插入图片描述

  1. 项目父pom.xml,注释掉插件spring-boot-maven-plugin
    SpringCloudAlibaba微服务项目部署到Docker最细节教程_第3张图片
  2. shop-common是通用模块,没有启动类所以pom.xml中设置无启动类。
    点右侧maven插件中install安装好了,通用模块改动了需要再次点击右侧的install,依赖它的模块再package打包才有效
    SpringCloudAlibaba微服务项目部署到Docker最细节教程_第4张图片
  3. cloud-gateway网关模块没有引入通用模块,所以他的pom.xml文件。
    根目录创建Dockerfile文件:蓝色D图标,可以更换FROM openjdk:14.0.2-oraclelinux7
    SpringCloudAlibaba微服务项目部署到Docker最细节教程_第5张图片
    SpringCloudAlibaba微服务项目部署到Docker最细节教程_第6张图片
  4. 这里的端口对应Dockerfile里的端口
    SpringCloudAlibaba微服务项目部署到Docker最细节教程_第7张图片
  5. 部署网关服务到Docker,依次点击右侧插件clean,package,下载openjdk:14.0.2-oraclelinux7的时候会比较慢
    SpringCloudAlibaba微服务项目部署到Docker最细节教程_第8张图片
  6. 打包上传完成,查看Docker里会出现镜像,右击镜像创建容器,设置容器名,端口号和运行的jvm参数
    SpringCloudAlibaba微服务项目部署到Docker最细节教程_第9张图片
    SpringCloudAlibaba微服务项目部署到Docker最细节教程_第10张图片
    因为服务器内存4G,所以jvm内存设置小点,点击加号
    再设置上海时区
    name: TZ, value: Asia/Shanghai
    SpringCloudAlibaba微服务项目部署到Docker最细节教程_第11张图片
    容器启动成功,可以点Log查看日志
    SpringCloudAlibaba微服务项目部署到Docker最细节教程_第12张图片
    SpringCloudAlibaba微服务项目部署到Docker最细节教程_第13张图片
  7. 部署shop-member服务到Docker,这个服务用了common通用模块,所以pom.xml要打包依赖的jar
    SpringCloudAlibaba微服务项目部署到Docker最细节教程_第14张图片
    其余服务类似,点击package就会一键部署至docker了(只是镜像,需要再启动容器)
    SpringCloudAlibaba微服务项目部署到Docker最细节教程_第15张图片
    SpringCloudAlibaba微服务项目部署到Docker最细节教程_第16张图片
    SpringCloudAlibaba微服务项目部署到Docker最细节教程_第17张图片
    日志中文乱码,以后解决
    SpringCloudAlibaba微服务项目部署到Docker最细节教程_第18张图片
    nacos的占用内存很高
    SpringCloudAlibaba微服务项目部署到Docker最细节教程_第19张图片
  8. 最后nginx部署vue前端项目
    docker的nginx反向代理失效,代理不到网关上去,是什么坑。后面直接在Centos安装nginx

你可能感兴趣的