Docker相关操作

本文记录Docker相关操作,备忘。


前言

保证Linux内核为3.0+,否则建议升级内核版本

1
2
3
# 查看linux内核
[root@docker ~]# uname -r
3.10.0-1127.el7.x86_64

以下操作请使用root用户操作

注意:以下部分脚本需要根据自身情况和容器镜像版本自行改动,比如挂载目录,相关环境参数等。

不同版本镜像的容器内目录也不一样,需要自己去查看,然后挂载启动。

内网安装Docker

下载二进制安装包

https://download.docker.com/linux/static/stable/x86_64/docker-20.10.7.tgz

https://download.docker.com/linux/static/stable/x86_64/

我这边选择的是 docker-20.10.7.tgz 这个版本

下载完成后放到 /opt/docker/install-packages 目录下

1
2
3
4
[root@docker ~]# mkdir -p /opt/docker/install-packages
[root@docker ~]# /opt/docker/install-packages
[root@docker install-packages]# ls
docker-20.10.7.tgz

解压安装包

1
2
cd /opt/docker/install-packages
tar -zxvf docker-20.10.7.tgz

将docker文件移到系统可执行文件目录下

如果不移到可执行文件目录下则docker指令用不了

1
2
3
[root@docker docker]# ls
docker docker-20.10.7.tgz
[root@docker docker]# mv docker/* /usr/bin

配置docker.service

1
vi /usr/lib/systemd/system/docker.service

内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target

[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd --selinux-enabled=false --insecure-registry=127.0.0.1
ExecReload=/bin/kill -s HUP $MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s

[Install]
WantedBy=multi-user.target

启动docker服务

1
2
systemctl daemon-reload
systemctl start docker.service

开机自启动docker

1
systemctl enable docker

注意:内网安装docker没有办法从公网拉取任何东西,除非自己打包镜像到服务器运行

公网安装Docker

安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 1、卸载旧版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 2、需要的安装包
yum install -y yum-utils

# 3、设置镜像的仓库
# 推荐使用国内的,比如阿里云镜像,十分快
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

#更新yum软件包索引(centos7)
yum makecache fast
#更新yum软件包索引(centos8)
dnf makecache

# 4、安装docker相关的 docker-ce 社区版 而ee是企业版
# 查看yum源支持的docker版本
yum list docker-ce --showduplicates | sort -r
# 安装docker 这里我们使用社区版即可
yum install -y docker-ce docker-ce-cli containerd.io
# 如果要安装指定版本,执行如下语句,后面跟的是版本号
# 使用 docker-compose-plugin 安装的docker-compose命令是 docker compose
# 如果用后面那种方式安装的话,命令为 docker-compose
yum install -y docker-ce-20.10.7-3.el7 docker-ce-cli-20.10.7-3.el7 containerd.io docker-compose-plugin

# 5、启动docker
systemctl start docker

# 6、使用docker version查看是否安装成功
docker version

阿里云镜像加速

推荐安装 1.10.0 以上版本的 Docker 客户端

配置镜像加速器

您可以通过修改 daemon 配置文件 /etc/docker/daemon.json 来使用加速器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 1.创建一个目录
sudo mkdir -p /etc/docker

# 2.编写配置文件
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://n2zg5mlq.mirror.aliyuncs.com"]
}
EOF

# 3.重启服务
sudo systemctl daemon-reload
sudo systemctl restart docker

# 设置开机自启
systemctl enable docker.service

# 关闭开机自启
systemctl disable docker.service

常用命令

帮助命令

1
2
3
4
5
6
# 查看docker的版本信息
docker version
# 显示docker的系统信息
docker info
# 帮助命令,万能命令
docker 命令 --help

镜像命令

1
2
3
4
5
6
7
8
9
10
11
# 查看所有本地主机上的镜像 可以使用 docker image ls 代替
docker images

# 搜索镜像,例如搜索mysql镜像:docker search mysql
docker search

# 下载镜像(docker image pull),例如下载mysql5.7:docker pull mysql:5.7
docker pull

# 删除镜像(docker image rm),例如删除某个容器:docker rmi -f bf756fb1ae65,bf756fb1ae65为容器id
docker rmi

容器命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 # 新建容器并启动
docker run 镜像id
# 列出所有运行的容器(docker container list)
docker ps
# 删除指定容器
docker rm 容器id
# 启动容器
docker start 容器id
# 重启容器
docker restart 容器id
# 停止当前正在运行的容器
docker stop 容器id
# 强制停止当前容器
docker kill 容器id
# 查看日志
docker logs 容器id

退出容器

1
2
3
4
# 容器直接退出
exit
# 容器不停止退出
ctrl + P + Q

删除容器

1
2
3
4
5
6
# 删除指定的容器,不能删除正在运行的容器,如果要强制删除 rm -rf
docker rm 容器id
# 删除所有的容器
docker rm -f $(docker ps -aq)
# 删除所有的容器
docker ps -a -q|xargs docker rm

查看容器中进程信息

1
docker top 容器id

查看镜像的元数据

1
docker inspect 容器id

保存对应镜像

保存对应的镜像,以便于在无网环境中使用

1
2
# 进入到保存镜像的目录,执行如下命令
docker save -o mysql_5.7.tar mysql:5.7

将安装包保存起来,上传到对应服务器

1
2
# 将安装包加载到镜像中
docker load -i mysql_5.7.tar

Docker安装各个组件

MySQL

公网

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 拉取镜像
docker pull mysql:5.7

# 查看全部镜像
docker images

# 启动容器
docker run -d -p 3306:3306 --name mysql5.7 \
-v /my-container/mysql5.7/conf:/etc/mysql \
-v /my-container/mysql5.7/logs:/var/log/mysql \
-v /my-container/mysql5.7/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=Hallo@123 \
-e TZ=Asia/Shanghai \
--restart=always mysql:5.7 \
--lower_case_table_names=1 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_general_ci \
--default-authentication-plugin=mysql_native_password

内网

公网环境保存对应镜像,上传到对应服务器,启动容器即可。

1
2
# 进入到保存镜像的目录,执行如下命令
docker save -o mysql_5.7.tar mysql:5.7

将安装包保存起来,上传到对应服务器

1
2
# 将安装包加载到镜像中
docker load -i mysql_5.7.tar

Redis

公网

1
2
3
4
5
6
7
8
# 拉取镜像
docker pull redis:6.0.8
# 查看镜像
docker images
# 启动容器
docker run -p 6379:6379 --name redis6.0.8 \
-v /my-container/redis6.0.8/data:/data \
-d redis:6.0.8 redis-server --appendonly yes --requirepass "123456"

内网

公网环境保存对应镜像,上传到对应服务器,启动容器即可。

1
2
# 进入到保存镜像的目录,执行如下命令
docker save -o redis_6.0.8.tar redis:6.0.8

将安装包保存起来,上传到对应服务器

1
2
# 将安装包加载到镜像中
docker load -i redis_6.0.8.tar

Nginx

搭建临时容器

为的是将初始配置拿出来,防止挂载是找不到文件报错。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 拉取镜像
docker pull nginx:1.21.1
# 查看镜像
docker images
# 启动临时容器
docker run \
-p 80:80 \
--name nginx-temp \
-d nginx:1.21.1

# 创建conf文件夹
mkdir -p /my-container/nginx/conf
# 复制conf
docker cp nginx-temp:/etc/nginx/ /my-container/nginx/conf
cd /my-container/nginx/conf
mv nginx/* .

# 删除临时容器
docker rm -f nginx-temp

公网

1
2
3
4
5
6
docker run -p 80:80 --name nginx1.21.1 \
-e TZ=Asia/Shanghai -e LANG=en_US.UTF-8 \
-v /my-container/nginx/html:/usr/share/nginx/html \
-v /my-container/nginx/logs/:/var/log/nginx \
-v /my-container/nginx/conf:/etc/nginx \
-d nginx:1.21.1

内网

公网环境保存对应镜像,上传到对应服务器,启动容器即可。

1
2
# 进入到保存镜像的目录,执行如下命令
docker save -o nginx_1.21.1.tar nginx:1.21.1

将安装包保存起来,上传到对应服务器

1
2
# 将安装包加载到镜像中
docker load -i nginx_1.21.1.tar

MinIO

公网

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 拉取镜像
docker pull minio/minio
# 查看镜像
docker images
# 启动容器
docker run \
-p 9000:9000 \
-p 9001:9001 \
-d --name minio \
-v /my-container/minio/data:/data \
-v /my-container/minio/conf:/root/.minio \
-e "MINIO_ROOT_USER=minio" \
-e "MINIO_ROOT_PASSWORD=Hallo@123" \
minio/minio server /data --console-address ":9000" --address ":9001"

内网

公网环境保存对应镜像,上传到对应服务器,启动容器即可。

1
2
# 进入到保存镜像的目录,执行如下命令
docker save -o minio.tar minio/minio

将安装包保存起来,上传到对应服务器

1
2
# 将安装包加载到镜像中
docker load -i minio.tar

登录控制台

访问 9000 端口,然后使用上面指定的用户和密码登录系统

Nacos

搭建临时容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 拉取镜像
docker pull nacos/nacos-server:v2.1.2
# 启动临时容器
docker run \
-p 8848:8848 -p 9848:9848 -p 9849:9849 \
--name nacos-temp \
-d nacos/nacos-server:v2.1.2

# 创建conf和logs文件夹
mkdir -p /my-container/nacos/conf
mkdir -p /my-container/nacos/logs
# 复制conf和logs文件夹
docker cp nacos-temp:/home/nacos/logs/ /my-container/nacos/
docker cp nacos-temp:/home/nacos/conf/ /my-container/nacos/

# 删除临时容器
docker rm -f nacos-temp

导入Nacos数据表

由于Nacos配置要持久到外部数据源中,这里使用MySQL作为持久化数据库,下面是SQL,创建nacos_config数据库,然后执行以下SQL

注意:此处的Nacos数据表需要根据自己安装的Nacos版本来,不同版本的数据表可能有差别,自己去官网获取即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
/******************************************/
/* 数据库全名 = 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(128) DEFAULT NULL,
`content` longtext NOT NULL COMMENT 'content',
`md5` varchar(32) DEFAULT NULL COMMENT 'md5',
`gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' 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,
`encrypted_data_key` text NOT NULL COMMENT '秘钥',
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(128) 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 '2010-05-05 00:00:00' COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间',
`src_user` text COMMENT 'source user',
`src_ip` varchar(20) DEFAULT NULL COMMENT 'source ip',
`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
`encrypted_data_key` text NOT NULL 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 '2010-05-05 00:00:00' COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' 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 '2010-05-05 00:00:00' COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' 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 '2010-05-05 00:00:00',
`gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00',
`src_user` text,
`src_ip` varchar(20) DEFAULT NULL,
`op_type` char(10) DEFAULT NULL,
`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
`encrypted_data_key` text NOT NULL 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 '2010-05-05 00:00:00' COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' 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,
constraint uk_username_role UNIQUE (username,role)
);

CREATE TABLE permissions (
role varchar(50) NOT NULL,
resource varchar(512) NOT NULL,
action varchar(8) NOT NULL,
constraint uk_role_permission UNIQUE (role,resource,action)
);

-- 初始密码
-- INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE);

-- Hallo@123
INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$C.oBUcKsqwLoFpbIfhH7rewh9fpEB2fFniImQ6dloKwzVLhe.QXe2', TRUE);

INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');

公网

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 启动容器
docker run -d \
--name nacos \
-p 8848:8848 -p 9848:9848 -p 9849:9849 \
-v /my-container/nacos/logs:/home/nacos/logs/ \
-v /my-container/nacos/conf:/home/nacos/conf/ \
--restart=always \
-e PREFER_HOST_MODE=hostname \
-e MODE=standalone \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=192.168.56.104 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=Hallo@123 \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
nacos/nacos-server:v2.1.2

内网

公网环境保存对应镜像,上传到对应服务器,启动容器即可。

1
2
# 进入到保存镜像的目录,执行如下命令
docker save -o nacos_v2.1.2.tar nacos/nacos-server:v2.1.2

将安装包保存起来,上传到对应服务器

1
2
# 将安装包加载到镜像中
docker load -i nacos_v2.1.2.tar

ES和Kibana

公网

elasticsearch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# 拉取镜像
docker pull elasticsearch:7.14.1

# 查看全部镜像
docker images

# 创建挂载目录
mkdir -p /my-container/elasticsearch/config
mkdir -p /my-container/elasticsearch/data
mkdir -p /my-container/elasticsearch/logs
mkdir -p /my-container/elasticsearch/plugins

# 赋予权限,保证可读可写可执行
chmod -R 777 /my-container/elasticsearch/

# 可以被远程任何机器访问
# echo "http.host: 0.0.0.0" >> /my-container/elasticsearch/config/elasticsearch.yml
vi /my-container/elasticsearch/config/elasticsearch.yml
# 输入以下内容
cluster.name: "docker-cluster"
network.host: 0.0.0.0
http.port: 9200
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true

# 启动es容器
# 9200 是发送 http 请求的端口
# 9300 是在分布式集群状态下节点之间的通信端口
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e TZ="Asia/Shanghai" \
-e LANG="en_US.UTF-8" \
-e ES_JAVA_OPTS="-Xmx512m -Xms512m" \
-e ELASTIC_PASSWORD="Hallo@123" \
-v /my-container/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /my-container/elasticsearch/data/:/usr/share/data \
-v /my-container/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-v /my-container/elasticsearch/logs:/usr/share/elasticsearch/logs \
-d elasticsearch:7.14.1
kibana
1
2
3
4
5
6
# 可视化工具kibana
# 拉取镜像
docker pull kibana:7.14.1

# 查看全部镜像
docker images

编写kibana配置

1
2
3
4
mkdir -p /my-container/elasticsearch/kibana/config
vi /my-container/elasticsearch/kibana/config/kibana.yml

chmod 777 /my-container/elasticsearch/kibana

输入以下内容

1
2
3
4
5
6
7
8
server.name: kibana
server.host: "0.0.0.0"
server.publicBaseUrl: "http://kibana:5601" # 这里地址改为你访问kibana的地址,不能以 / 结尾
elasticsearch.hosts: [ "http://192.168.56.104:9200" ] # TODO 修改为自己的ip
xpack.monitoring.ui.container.elasticsearch.enabled: true
elasticsearch.username: "elastic" # es账号
elasticsearch.password: "Hallo@123" # es密码
i18n.locale: zh-CN # 中文
1
2
3
4
# 启动kibana容器
docker run --name kibana \
-v /my-container/elasticsearch/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml \
-p 5601:5601 -d kibana:7.14.1
  1. ES访问地址:[ip地址:9200]
    账号密码:elastic/Hallo@123
  2. kibana访问地址:[ip地址:5601/app/dev_tools#/console]
    账号密码:elastic/Hallo@123

内网

公网环境保存对应镜像,上传到对应服务器,启动容器即可。

1
2
3
# 进入到保存镜像的目录,执行如下命令
docker save -o es_7.14.1.tar elasticsearch:7.14.1
docker save -o kibana_7.14.1.tar kibana:7.14.1

将安装包保存起来,上传到对应服务器

1
2
3
# 将安装包加载到镜像中
docker load -i es_7.14.1.tar
docker load -i kibana_7.14.1.tar

RocketMQ

用 docker-compose 方式创建,比较方便

公网

1
2
3
4
5
6
7
# 拉取镜像
docker pull foxiswho/rocketmq:server
docker pull foxiswho/rocketmq:broker
docker pull styletang/rocketmq-console-ng

# 查看全部镜像
docker images

内网

公网环境保存对应镜像,上传到对应服务器,启动容器即可。

1
2
3
4
# 进入到保存镜像的目录,执行如下命令
docker save -o rocketmq-server.tar foxiswho/rocketmq:server
docker save -o rocketmq-broker.tar foxiswho/rocketmq:broker
docker save -o rocketmq-console-ng.tar styletang/rocketmq-console-ng

将安装包保存起来,上传到对应服务器

1
2
3
4
# 将安装包加载到镜像中
docker load -i rocketmq-server.tar
docker load -i rocketmq-broker.tar
docker load -i rocketmq-console-ng.tar

Ftp

1
2
3
4
5
6
docker run -d -v /home/ftp:/home/vsftpd \
-p 20:20 -p 21:21 -p 21100-21110:21100-21110 \
-e FTP_USER=test -e FTP_PASS=test \
-e PASV_ADDRESS=10.10.11.240 \
-e PASV_MIN_PORT=21100 -e PASV_MAX_PORT=21110 \
--name vsftpd --restart=always fauria/vsftpd

PASV_ADDRESS的地址被动模式需要使用,需要设置为宿主机的IP,否则文件无权限查看。

镜像导入导出脚本

导出脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/bash
# 获取到 "image:tag" 格式的镜像名
IMG_NAME=`docker images | grep -v TAG | awk '{print $1":"$2}'`

# 定义镜像存放目录
DIR="/data/docker/image_tar"
if [ ! -d "$DIR" ]; then
echo -e "\033[34m${DIR}\033[0m 不存在"
mkdir -p "$DIR"
echo -e "\033[34m${DIR}\033[0m 已创建"
else
echo -e "\033[34m${DIR}\033[0m 已存在"
fi
echo ""
for IMAGE in $IMG_NAME
do
echo -e "正在保存 \033[33m${IMAGE}\033[0m"
SAVE_NAME=`echo $IMAGE | awk -F: '{print $1"_"$2}' | sed 's/\//_/g'`
docker save $IMAGE -o ${DIR}/${SAVE_NAME}.tar
echo -e "已保存到 \033[34m${DIR}/\033[31m${SAVE_NAME}.tar\033[0m"
echo ""
done

导入脚本

1
2
3
#!/bin/bash
DIR="/opt/docker/docker-images"
for i in `ls $DIR/*`;do docker load <$i;done

Docker-compose安装各个组件

注意以下内网环境的镜像均为从公网环境导出的

安装Docker-compose

公网

1
2
3
4
5
6
7
8
# 下载docker-compose二进制文件
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

# 授权
chmod +x /usr/local/bin/docker-compose

# 查看版本
docker-compose version

内网

从公网下载对应的docker-compose二进制文件,然后上传到服务器的 /usr/local/bin 目录,命名为 docker-compose

1
2
3
4
5
6
7
8
# 从公网下载,输出的路径即为公网下载路径
echo https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m`

# 授权
chmod +x /usr/local/bin/docker-compose

# 查看版本
docker-compose version

MySQL

1
2
3
mkdir -p /my-docker-compose/mysql
cd /my-docker-compose/mysql
vi docker-compose-mysql5.7.yml

编写yml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
version: '3'
services:
mysql:
# 需要使用的镜像
image: mysql:5.7
# 容器名称
container_name: mysql5.7
# 指定容器退出后的重启策略为始终重启,但是不考虑在Docker守护进程启动时就已经停止了的容器
restart: unless-stopped
# 数据卷挂载路径设置,将本机目录映射到容器目录
volumes:
- ./mysql5.7/conf:/etc/mysql
- ./mysql5.7/logs:/var/log/mysql
- ./mysql5.7/data:/var/lib/mysql
- /etc/localtime:/etc/localtime:ro
# 可执行初始化sql脚本的目录
# -- tips:`/var/lib/mysql`目录下无数据的时候才会执行(即第一次启动的时候才会执行)
- ./mysql5.7/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
command:
- --default-authentication-plugin=mysql_native_password
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_general_ci
- --lower_case_table_names=1
entrypoint: bash -c "chown -R mysql:mysql /var/log/mysql && exec /entrypoint.sh mysqld"
# 设置环境变量,相当于 docker run 命令中的 -e
environment:
- MYSQL_ROOT_PASSWORD=Hallo@123
- MYSQL_ROOT_HOST=%
# 初始化的数据库名称,这里设置为Nacos的持久化数据库
- MYSQL_DATABASE=nacos_config
- TZ=Asia/Shanghai
# 宿主机和容器的端口映射关系,左边宿主机端口:右边容器端口
ports:
- "3306:3306"

构建

1
docker-compose -f docker-compose-mysql5.7.yml -p mysql5.7 up -d

Redis

1
2
3
mkdir -p /my-docker-compose/redis
cd /my-docker-compose/redis
vi docker-compose-redis.yml

编写yml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
version: '3'
services:
redis:
image: redis:6.0.8
container_name: redis6.0.8
restart: unless-stopped
# 启动redis服务并添加密码为:123456,并开启redis持久化配置
command: redis-server --requirepass 123456 --appendonly yes
environment:
TZ: Asia/Shanghai
LANG: en_US.UTF-8
volumes:
- "./redis/data:/data"
- "./redis/conf/redis.conf:/etc/redis/redis.conf"
ports:
- "6379:6379"

构建

1
docker-compose -f docker-compose-redis.yml -p redis up -d

Nginx

1
2
3
mkdir -p /my-docker-compose/nginx
cd /my-docker-compose/nginx
vi docker-compose-nginx.yml

编写yml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
version: '3'
services:
nginx:
image: nginx:1.21.1 # 镜像`nginx:1.21.1`
container_name: nginx1.21.1 # 容器名为'nginx'
restart: unless-stopped
volumes: # 数据卷挂载路径设置,将本机目录映射到容器目录
- "./nginx/conf:/etc/nginx"
- "./nginx/html:/usr/share/nginx/html"
- "./nginx/log:/var/log/nginx"
environment: # 设置环境变量,相当于docker run命令中的-e
TZ: Asia/Shanghai
LANG: en_US.UTF-8
ports: # 映射端口
- "80:80"

构建

构建前记得复制对应的挂载文件,否则会报找不到文件错误

1
2
[root@docker nginx]# pwd
/my-docker-compose/nginx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 拉取镜像
docker pull nginx:1.21.1
# 查看镜像
docker images
# 启动临时容器
docker run \
-p 80:80 \
--name nginx-temp \
-d nginx:1.21.1

# 创建conf文件夹
mkdir -p ./nginx/conf
# 复制conf
docker cp nginx-temp:/etc/nginx/ ./nginx/conf
cd ./nginx/conf
mv nginx/* .

# 删除临时容器
docker rm -f nginx-temp
1
docker-compose -f docker-compose-nginx.yml -p nginx up -d

Nacos

1
2
3
mkdir -p /my-docker-compose/nacos
cd /my-docker-compose/nacos
vi docker-compose-nacos.yml

编写yml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# Nacos文档:https://nacos.io/zh-cn/index.html
version: '3'

services:
nacos:
image: nacos/nacos-server:v2.1.2
container_name: nacos-server
restart: unless-stopped
volumes:
- ./nacos/conf:/home/nacos/conf
- ./nacos/logs:/home/nacos/logs
environment: # 设置环境变量,相当于docker run命令中的-e
- PREFER_HOST_MODE=hostname
- MODE=standalone # 单机模式启动
- SPRING_DATASOURCE_PLATFORM=mysql # 数据源平台,仅支持mysql或不保存empty
# TODO 修改mysql连接信息
- MYSQL_SERVICE_HOST=192.168.56.104 # 注:这里不能为`127.0.0.1`或`localhost`方式!!!
- MYSQL_SERVICE_DB_NAME=nacos_config # 所需sql脚本位于 `nacos/nacos-mysql.sql`
- MYSQL_SERVICE_PORT=3306
- MYSQL_SERVICE_USER=root
- MYSQL_SERVICE_PASSWORD=Hallo@123
# TODO 修改JVM调优参数
- JVM_XMS=128m #-Xms default :2g
- JVM_XMX=128m #-Xmx default :2g
- JVM_XMN=64m #-Xmn default :1g
- JVM_MS=32m #-XX:MetaspaceSize default :128m
- JVM_MMS=32m #-XX:MaxMetaspaceSize default :320m
ports:
- "8848:8848"

构建

构建前记得复制对应的挂载文件,否则会报找不到文件错误

1
2
[root@docker nacos]# pwd
/my-docker-compose/nacos
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 拉取镜像
docker pull nacos/nacos-server:v2.1.2
# 启动临时容器
docker run \
-p 8848:8848 -p 9848:9848 -p 9849:9849 \
--name nacos-temp \
-d nacos/nacos-server:v2.1.2

# 创建conf和logs文件夹
mkdir -p ./nacos/conf
mkdir -p ./nacos/logs
# 复制conf和logs文件夹
docker cp nacos-temp:/home/nacos/logs/ ./nacos/
docker cp nacos-temp:/home/nacos/conf/ ./nacos/

# 删除临时容器
docker rm -f nacos-temp
1
2
# tips: 构建前请先保证对应数据源可用,并创建了nacos相关数据库表
docker-compose -f docker-compose-nacos.yml -p nacos up -d

MinIO

1
2
3
mkdir -p /my-docker-compose/minio
cd /my-docker-compose/minio
vi docker-compose-minio.yml

编写yml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
version: '3'
services:
minio:
image: minio/minio:latest
container_name: minio
restart: unless-stopped
volumes:
- "./minio/data:/data"
- "./minio/minio:/minio"
- "./minio/conf:/root/.minio"
environment: # 设置环境变量,相当于docker run命令中的-e
TZ: Asia/Shanghai
LANG: en_US.UTF-8
MINIO_PROMETHEUS_AUTH_TYPE: "public"
MINIO_ACCESS_KEY: "minio" # 登录账号
MINIO_SECRET_KEY: "Hallo@123" # 登录密码
command: server /data --console-address ":9000" --address ":9001"
logging:
driver: "json-file"
options:
max-size: "100m"
ports: # 映射端口
- "9000:9000"
- "9001:9001"
- "42330:42330"

构建

1
docker-compose -f docker-compose-minio.yml -p minio up -d

ES和Kibana

前置挂载

编写配置文件便于挂载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# ES配置
mkdir -p /my-docker-compose/elasticsearch/elasticsearch/config
mkdir -p /my-docker-compose/elasticsearch/elasticsearch/logs
mkdir -p /my-docker-compose/elasticsearch/elasticsearch/data
vi /my-docker-compose/elasticsearch/elasticsearch/config/elasticsearch.yml

# 输入以下内容
cluster.name: "docker-cluster"
network.host: 0.0.0.0
http.port: 9200
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true



# Kibana配置
mkdir -p /my-docker-compose/elasticsearch/elasticsearch/kibana/config
vi /my-docker-compose/elasticsearch/elasticsearch/kibana/config/kibana.yml

# 输入以下内容
server.name: kibana
server.host: "0.0.0.0"
server.publicBaseUrl: "http://kibana:5601" # 这里地址改为你访问kibana的地址,不能以 / 结尾
elasticsearch.hosts: [ "http://192.168.56.104:9200" ] # TODO 修改为自己的ip
xpack.monitoring.ui.container.elasticsearch.enabled: true
elasticsearch.username: "elastic" # es账号
elasticsearch.password: "Hallo@123" # es密码
i18n.locale: zh-CN # 中文

编写yml文件

1
2
3
mkdir -p /my-docker-compose/elasticsearch
cd /my-docker-compose/elasticsearch
vi docker-compose-elasticsearch.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
version: '3'

services:
elasticsearch:
image: elasticsearch:7.14.1 # 原镜像`elasticsearch:7.14.1`
container_name: elasticsearch # 容器名为'elasticsearch'
restart: unless-stopped
volumes: # 数据卷挂载路径设置,将本机目录映射到容器目录
- "./elasticsearch/data:/usr/share/elasticsearch/data"
- "./elasticsearch/logs:/usr/share/elasticsearch/logs"
- "./elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml"
environment: # 设置环境变量,相当于 docker run 命令中的 -e
TZ: Asia/Shanghai
LANG: en_US.UTF-8
discovery.type: single-node
ES_JAVA_OPTS: "-Xmx512m -Xms512m"
ELASTIC_PASSWORD: "Hallo@123" # elastic账号密码
ports:
- "9200:9200"
- "9300:9300"

kibana:
image: kibana:7.14.1
container_name: kibana
restart: unless-stopped
volumes:
- ./elasticsearch/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml
ports:
- "5601:5601"
depends_on:
- elasticsearch
links:
- elasticsearch

构建

1
2
3
4
5
6
7
8
# 当前目录下所有文件赋予权限(读、写、执行)
cd /my-docker-compose
chmod -R 777 ./elasticsearch
# 运行
cd /my-docker-compose/elasticsearch
docker-compose -f docker-compose-elasticsearch.yml -p elasticsearch up -d
# 运行后,再次给新创建的文件赋予权限
chmod -R 777 ./elasticsearch
  1. ES访问地址:[ip地址:9200]
    账号密码:elastic/Hallo@123
  2. kibana访问地址:[ip地址:5601/app/dev_tools#/console]
    账号密码:elastic/Hallo@123

RocketMQ

前置挂载

1
2
mkdir -p /my-docker-compose/rocketmq/rocketmq/rocketmq_broker/conf
vi /my-docker-compose/rocketmq/rocketmq/rocketmq_broker/conf/broker.conf

输入以下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You 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.


# 所属集群名字
brokerClusterName=DefaultCluster

# broker 名字,注意此处不同的配置文件填写的不一样,如果在 broker-a.properties 使用: broker-a,
# 在 broker-b.properties 使用: broker-b
brokerName=broker-a

# 0 表示 Master,> 0 表示 Slave
brokerId=0

# nameServer地址,分号分割
# namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876

# 启动IP,如果 docker 报 com.alibaba.rocketmq.remoting.exception.RemotingConnectException: connect to <192.168.56.104:10909> failed
# 解决方式1 加上一句 producer.setVipChannelEnabled(false);
# 解决方式2 brokerIP1 设置宿主机IP,不要使用 docker 内部IP
brokerIP1=192.168.56.104

# 在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4

# 是否允许 Broker 自动创建 Topic,建议线下开启,线上关闭 !!!这里仔细看是 false,false,false
autoCreateTopicEnable=true

# 是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true

# Broker 对外服务的监听端口
listenPort=10911

# 删除文件时间点,默认凌晨4点
deleteWhen=04

# 文件保留时间,默认48小时
fileReservedTime=120

# commitLog 每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824

# ConsumeQueue 每个文件默认存 30W 条,根据业务情况调整
mapedFileSizeConsumeQueue=300000

# destroyMapedFileIntervalForcibly=120000
# redeleteHangedFileInterval=120000
# 检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
# 存储路径
# storePathRootDir=/home/ztztdata/rocketmq-all-4.1.0-incubating/store
# commitLog 存储路径
# storePathCommitLog=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/commitlog
# 消费队列存储
# storePathConsumeQueue=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/consumequeue
# 消息索引存储路径
# storePathIndex=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/index
# checkpoint 文件存储路径
# storeCheckpoint=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/checkpoint
# abort 文件存储路径
# abortFile=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/abort
# 限制的消息大小
maxMessageSize=65536

# flushCommitLogLeastPages=4
# flushConsumeQueueLeastPages=2
# flushCommitLogThoroughInterval=10000
# flushConsumeQueueThoroughInterval=60000

# Broker 的角色
# - ASYNC_MASTER 异步复制Master
# - SYNC_MASTER 同步双写Master
# - SLAVE
brokerRole=ASYNC_MASTER

# 刷盘方式
# - ASYNC_FLUSH 异步刷盘
# - SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH

# 发消息线程池数量
# sendMessageThreadPoolNums=128
# 拉消息线程池数量
# pullMessageThreadPoolNums=128

编写yml文件

1
2
3
mkdir -p /my-docker-compose/rocketmq
cd /my-docker-compose/rocketmq
vi docker-compose-rocketmq.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
version: '3'
services:
# mq服务
rocketmq_server:
image: foxiswho/rocketmq:server
container_name: rocketmq_server
ports:
- 9876:9876
volumes:
- ./rocketmq/rocketmq_server/logs:/opt/logs
- ./rocketmq/rocketmq_server/store:/opt/store

# mq中间件
rocketmq_broker:
image: foxiswho/rocketmq:broker
container_name: rocketmq_broker
ports:
- 10909:10909
- 10911:10911
volumes:
- ./rocketmq/rocketmq_broker/logs:/opt/logs
- ./rocketmq/rocketmq_broker/store:/opt/store
- ./rocketmq/rocketmq_broker/conf/broker.conf:/etc/rocketmq/broker.conf
environment:
NAMESRV_ADDR: "rocketmq_server:9876"
JAVA_OPTS: " -Duser.home=/opt"
JAVA_OPT_EXT: "-server -Xms128m -Xmx128m -Xmn128m"
command: mqbroker -c /etc/rocketmq/broker.conf
depends_on:
- rocketmq_server

# mq可视化控制台
rocketmq_console_ng:
image: styletang/rocketmq-console-ng
container_name: rocketmq_console_ng
ports:
- 9002:8080
environment:
JAVA_OPTS: "-Drocketmq.namesrv.addr=rocketmq_server:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false"
depends_on:
- rocketmq_server

构建

注:修改 /my-docker-compose/rocketmq/rocketmq/rocketmq_broker/conf/broker.conf中配置brokerIP1宿主机IP

1
docker-compose -f docker-compose-rocketmq.yml -p rocketmq up -d

访问地址 http://ip地址:9002

前置挂载脚本

由于有不少组件需要提前将部分配置文件准备好,以便于和容器相关目录以及文件挂载,这里写个脚本统一创建以上组件需要的目录和配置文件及其内容

这里比如说我将上面各个组件都挂载在 /app/docker-compose

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
#!/bin/bash
# 挂载目录
MOUNT_DIR=/app/docker-compose
SERVER_IP=10.10.11.248

############挂载目录相关####################
mkdir -p $MOUNT_DIR/mysql/mysql5.7/conf
mkdir -p $MOUNT_DIR/redis/redis
mkdir -p $MOUNT_DIR/nginx/nginx
mkdir -p $MOUNT_DIR/minio/minio
mkdir -p $MOUNT_DIR/nacos/nacos
mkdir -p $MOUNT_DIR/elasticsearch/elasticsearch
mkdir -p $MOUNT_DIR/rocketmq/rocketmq
############挂载目录相关####################

############MySQL相关####################
cat > $MOUNT_DIR/mysql/mysql5.7/conf/my.conf << EOF
[mysqld]
user=root # MySQL启动用户
default-storage-engine=INNODB # 创建新表时将使用的默认存储引擎
character-set-server=utf8mb4 # 设置mysql服务端默认字符集
pid-file=/var/run/mysqld/mysqld.pid # pid文件所在目录
socket=/var/run/mysqld/mysqld.sock # 用于本地连接的socket套接字
datadir=/var/lib/mysql # 数据文件存放的目录
#log-error=/var/log/mysql/error.log
#bind-address=127.0.0.1 # MySQL绑定IP
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION # 定义mysql应该支持的sql语法,数据校验等!

# 允许最大连接数
max_connections=200

# ================= ↓↓↓ mysql主从同步配置start ↓↓↓ =================

# 同一局域网内注意要唯一
server-id=3306
# 开启二进制日志功能 & 日志位置存放位置/var/lib/mysql
#log-bin=mysql-bin
log-bin=/var/lib/mysql/mysql-bin
# binlog格式
# 1. STATEMENT:基于SQL语句的模式,binlog 数据量小,但是某些语句和函数在复制过程可能导致数据不一致甚至出错;
# 2. MIXED:混合模式,根据语句来选用是 STATEMENT 还是 ROW 模式;
# 3. ROW:基于行的模式,记录的是行的完整变化。安全,但 binlog 会比其他两种模式大很多;
binlog_format=ROW
# FULL:binlog记录每一行的完整变更 MINIMAL:只记录影响后的行
binlog_row_image=FULL
# 日志文件大小
# max_binlog_size=1G
max_binlog_size=100M
# 定义清除过期日志的时间(这里设置为7天)
expire_logs_days=7

# ================= ↑↑↑ mysql主从同步配置end ↑↑↑ =================

[mysql]
default-character-set=utf8mb4

[client]
default-character-set=utf8mb4 # 设置mysql客户端默认字符集
EOF
############MySQL相关####################

############Redis相关####################
cat > $MOUNT_DIR/redis/redis/conf/redis.conf << EOF
# 开启保护模式后,需要 bind ip 或 设置密码
protected-mode yes

port 6379

tcp-backlog 511

timeout 0

tcp-keepalive 300

daemonize no

supervised no

pidfile /var/run/redis_6379.pid

loglevel notice

logfile ""

databases 16

always-show-logo yes

# 900秒内,如果超过1个key被修改,则发起快照保存
save 900 1
# 300秒内,如果超过10个key被修改,则发起快照保存
save 300 10
# 60秒内,如果1万个key被修改,则发起快照保存
save 60 10000

stop-writes-on-bgsave-error yes

rdbcompression yes

rdbchecksum yes

dbfilename dump.rdb

rdb-del-sync-files no

dir ./

replica-serve-stale-data yes

replica-read-only yes

repl-diskless-sync no

repl-diskless-sync-delay 5

repl-diskless-load disabled

repl-disable-tcp-nodelay no

replica-priority 100

acllog-max-len 128

oom-score-adj no

oom-score-adj-values 0 200 800

appendonly yes

appendfilename "appendonly.aof"

# 每次操作都会立即写入aof文件中
# appendfsync always
# 每秒持久化一次(默认配置)
appendfsync everysec
# 不主动进行同步操作,默认30s一次
# appendfsync no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

aof-load-truncated yes

aof-use-rdb-preamble yes

lua-time-limit 5000

latency-monitor-threshold 0

notify-keyspace-events ""

hash-max-ziplist-entries 512
hash-max-ziplist-value 64

list-max-ziplist-size -2

list-compress-depth 0

set-max-intset-entries 512

zset-max-ziplist-entries 128
zset-max-ziplist-value 64

hll-sparse-max-bytes 3000

stream-node-max-bytes 4096
stream-node-max-entries 100

activerehashing yes

client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60

hz 10

dynamic-hz yes

aof-rewrite-incremental-fsync yes

rdb-save-incremental-fsync yes

EOF

echo -e "\e[31mRedis前置配置已完成 \e[0m"
############Redis相关####################

############Nginx相关####################
# 拉取镜像
docker pull nginx:1.21.1
# 启动临时容器
docker run \
-p 80:80 \
--name nginx-temp \
-d nginx:1.21.1

# 创建conf文件夹
mkdir -p $MOUNT_DIR/nginx/nginx/conf
# 复制conf
docker cp nginx-temp:/etc/nginx/ $MOUNT_DIR/nginx/nginx/conf
cd $MOUNT_DIR/nginx/nginx/conf
mv nginx/* .

# 删除临时容器
docker rm -f nginx-temp
echo -e "\e[31m #Nginx前置配置已完成 \e[0m"
############Nginx相关####################

############Nacos相关####################
# 拉取镜像
docker pull nacos/nacos-server:v2.1.2
# 启动临时容器
docker run \
-p 8848:8848 -p 9848:9848 -p 9849:9849 \
--name nacos-temp \
-d nacos/nacos-server:v2.1.2

# 创建conf和logs文件夹
mkdir -p $MOUNT_DIR/nacos/nacos/conf
mkdir -p $MOUNT_DIR/nacos/nacos/logs
# 复制conf和logs文件夹
docker cp nacos-temp:/home/nacos/logs/ $MOUNT_DIR/nacos/nacos/
docker cp nacos-temp:/home/nacos/conf/ $MOUNT_DIR/nacos/nacos/

# 删除临时容器
docker rm -f nacos-temp

echo -e "\e[31m #Nacos前置配置已完成 \e[0m"
############Nacos相关####################


############ES和Kibana相关####################
# ES配置
mkdir -p $MOUNT_DIR/elasticsearch/elasticsearch/config
mkdir -p $MOUNT_DIR/elasticsearch/elasticsearch/logs
mkdir -p $MOUNT_DIR/elasticsearch/elasticsearch/data

cat >${MOUNT_DIR}/elasticsearch/elasticsearch/config/elasticsearch.yml<<EOF
cluster.name: "docker-cluster"
network.host: 0.0.0.0
http.port: 9200
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true'
EOF

mkdir -p $MOUNT_DIR/elasticsearch/elasticsearch/kibana/config
cat >${MOUNT_DIR}/elasticsearch/elasticsearch/kibana/config/kibana.yml<<EOF
server.name: kibana
server.host: "0.0.0.0"
server.publicBaseUrl: "http://kibana:5601" # 这里地址改为你访问kibana的地址,不能以 / 结尾
elasticsearch.hosts: [ "http://$SERVER_IP:9200" ] # TODO 修改为自己的ip
xpack.monitoring.ui.container.elasticsearch.enabled: true
elasticsearch.username: "elastic" # es账号
elasticsearch.password: "Hallo@123" # es密码
i18n.locale: zh-CN # 中文
EOF
echo -e "\e[31m #ES和Kibana前置配置已完成 \e[0m"
############ES和Kibana相关####################

############Rocket相关###################
mkdir -p $MOUNT_DIR/rocketmq/rocketmq/rocketmq_broker/conf
cat >${MOUNT_DIR}/rocketmq/rocketmq/rocketmq_broker/conf/broker.conf<<EOF
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You 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.


# 所属集群名字
brokerClusterName=DefaultCluster

# broker 名字,注意此处不同的配置文件填写的不一样,如果在 broker-a.properties 使用: broker-a,
# 在 broker-b.properties 使用: broker-b
brokerName=broker-a

# 0 表示 Master,> 0 表示 Slave
brokerId=0

# nameServer地址,分号分割
# namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876

# 启动IP,如果 docker 报 com.alibaba.rocketmq.remoting.exception.RemotingConnectException: connect to <192.168.56.104:10909> failed
# 解决方式1 加上一句 producer.setVipChannelEnabled(false);
# 解决方式2 brokerIP1 设置宿主机IP,不要使用 docker 内部IP
brokerIP1=$SERVER_IP

# 在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4

# 是否允许 Broker 自动创建 Topic,建议线下开启,线上关闭 !!!这里仔细看是 false,false,false
autoCreateTopicEnable=true

# 是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true

# Broker 对外服务的监听端口
listenPort=10911

# 删除文件时间点,默认凌晨4点
deleteWhen=04

# 文件保留时间,默认48小时
fileReservedTime=120

# commitLog 每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824

# ConsumeQueue 每个文件默认存 30W 条,根据业务情况调整
mapedFileSizeConsumeQueue=300000

# destroyMapedFileIntervalForcibly=120000
# redeleteHangedFileInterval=120000
# 检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
# 存储路径
# storePathRootDir=/home/ztztdata/rocketmq-all-4.1.0-incubating/store
# commitLog 存储路径
# storePathCommitLog=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/commitlog
# 消费队列存储
# storePathConsumeQueue=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/consumequeue
# 消息索引存储路径
# storePathIndex=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/index
# checkpoint 文件存储路径
# storeCheckpoint=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/checkpoint
# abort 文件存储路径
# abortFile=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/abort
# 限制的消息大小
maxMessageSize=65536

# flushCommitLogLeastPages=4
# flushConsumeQueueLeastPages=2
# flushCommitLogThoroughInterval=10000
# flushConsumeQueueThoroughInterval=60000

# Broker 的角色
# - ASYNC_MASTER 异步复制Master
# - SYNC_MASTER 同步双写Master
# - SLAVE
brokerRole=ASYNC_MASTER

# 刷盘方式
# - ASYNC_FLUSH 异步刷盘
# - SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH

# 发消息线程池数量
# sendMessageThreadPoolNums=128
# 拉消息线程池数量
# pullMessageThreadPoolNums=128
EOF
echo -e "\e[31m #Rocket前置配置已完成 \e[0m"
############Rocket相关###################

Docker-compose批量编排

编写环境变量文件

  1. 在docker-compose.yml同级目录下面创建 .env 文件value不要加引号,引用会自动添加

  2. 在docker-compose.yml中使用key引用

  3. 如果环境变量文件不和docker-compose.yml在同一级目录下,则需要在docker-compose.yml文件中指定环境变量文件所在位置,比如

    1
    2
    3
    4
    5
    version: '3'
    services:
    mysql:
    env_file:
    - file.env # 相对于docker-compose.yml文件的位置

这里我就直接放在 docker-compose.yml 的同级目录下面了

.env

1
2
3
4
5
6
# 挂载目录
MOUNT_DIR=/app/docker-compose
# 设置网络模式
NETWORKS_DRIVER=bridge
# 服务器IP
SERVER_IP=10.10.11.248

编写容器编排文件

docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
version: '3'
# 网络配置
networks:
backend:
driver: ${NETWORKS_DRIVER}
services:
mysql:
# 需要使用的镜像
image: mysql:5.7
# 容器名称
container_name: mysql5.7
# 指定容器退出后的重启策略为始终重启,但是不考虑在Docker守护进程启动时就已经停止了的容器
restart: unless-stopped
# 数据卷挂载路径设置,将本机目录映射到容器目录
volumes:
- $MOUNT_DIR/mysql/mysql5.7/conf:/etc/mysql
- $MOUNT_DIR/mysql/mysql5.7/logs:/var/log/mysql
- $MOUNT_DIR/mysql/mysql5.7/data:/var/lib/mysql
- /etc/localtime:/etc/localtime:ro
# 可执行初始化sql脚本的目录
# -- tips:`/var/lib/mysql`目录下无数据的时候才会执行(即第一次启动的时候才会执行)
- $MOUNT_DIR/mysql/mysql5.7/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
command:
- --default-authentication-plugin=mysql_native_password
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_general_ci
- --lower_case_table_names=1
entrypoint: bash -c "chown -R mysql:mysql /var/log/mysql && exec /entrypoint.sh mysqld"
# 设置环境变量,相当于 docker run 命令中的 -e
environment:
- MYSQL_ROOT_PASSWORD=Hallo@123
- MYSQL_ROOT_HOST=%
# 初始化的数据库名称
- MYSQL_DATABASE=nacos_config
- TZ=Asia/Shanghai
# 宿主机和容器的端口映射关系,左边宿主机端口:右边容器端口
ports:
- "3306:3306"
networks:
- backend

redis:
image: redis:6.0.8
container_name: redis6.0.8
restart: unless-stopped
# 启动redis服务并添加密码为:123456,并开启redis持久化配置
command: redis-server --requirepass Hallo@123 --appendonly yes
environment:
TZ: Asia/Shanghai
LANG: en_US.UTF-8
volumes:
- $MOUNT_DIR/redis/redis/data:/data
- $MOUNT_DIR/redis/redis/conf/redis.conf:/etc/redis/redis.conf
ports:
- "6379:6379"
networks:
- backend

nginx:
image: nginx:1.21.1 # 镜像`nginx:1.21.1`
container_name: nginx1.21.1 # 容器名为'nginx'
restart: unless-stopped
volumes: # 数据卷挂载路径设置,将本机目录映射到容器目录
- $MOUNT_DIR/nginx/nginx/conf:/etc/nginx
- $MOUNT_DIR/nginx/nginx/html:/usr/share/nginx/html
- $MOUNT_DIR/nginx/nginx/log:/var/log/nginx
environment: # 设置环境变量,相当于docker run命令中的-e
TZ: Asia/Shanghai
LANG: en_US.UTF-8
ports: # 映射端口
- "80:80"

minio:
image: minio/minio:latest
container_name: minio
restart: unless-stopped
volumes:
- $MOUNT_DIR/minio/minio/data:/data
- $MOUNT_DIR/minio/minio:/minio
- $MOUNT_DIR/minio/minio/conf:/root/.minio
environment: # 设置环境变量,相当于docker run命令中的-e
TZ: Asia/Shanghai
LANG: en_US.UTF-8
MINIO_PROMETHEUS_AUTH_TYPE: "public"
MINIO_ACCESS_KEY: "minio" # 登录账号
MINIO_SECRET_KEY: "Hallo@123" # 登录密码
command: server /data --console-address ":9000" --address ":9001"
logging:
driver: "json-file"
options:
max-size: "100m"
ports: # 映射端口
- "9000:9000"
- "9001:9001"
- "42330:42330"
networks:
- backend

nacos:
image: nacos/nacos-server:v2.1.2
container_name: nacos-server
restart: unless-stopped
volumes:
- $MOUNT_DIR/nacos/nacos/conf:/home/nacos/conf
- $MOUNT_DIR/nacos/nacos/logs:/home/nacos/logs
environment: # 设置环境变量,相当于docker run命令中的-e
- PREFER_HOST_MODE=hostname
- MODE=standalone # 单机模式启动
- SPRING_DATASOURCE_PLATFORM=mysql # 数据源平台,仅支持mysql或不保存empty
# TODO 修改mysql连接信息
- MYSQL_SERVICE_HOST=$SERVER_IP # 注:这里不能为`127.0.0.1`或`localhost`方式!!!
- MYSQL_SERVICE_DB_NAME=nacos_config # 所需sql脚本位于 `nacos/nacos-mysql.sql`
- MYSQL_SERVICE_PORT=3306
- MYSQL_SERVICE_USER=root
- MYSQL_SERVICE_PASSWORD=Hallo@123
# TODO 修改JVM调优参数
- JVM_XMS=128m #-Xms default :2g
- JVM_XMX=128m #-Xmx default :2g
- JVM_XMN=64m #-Xmn default :1g
- JVM_MS=32m #-XX:MetaspaceSize default :128m
- JVM_MMS=32m #-XX:MaxMetaspaceSize default :320m
ports:
- "8848:8848"
networks:
- backend
depends_on:
- mysql

构建

如果记不住命令,这个命令也可以单独写作脚本运行

1
docker-compose -f docker-compose.yml up -d

Harbor

因为工作需要,有时候是需要完全断网环境,此时需要在内网环境中离线安装[Harbor]私有仓库。

系统环境描述

主机:X86_64架构,8G内存 (期待啥时候等有机会找一台国产化机器安装一个其他架构的版本)

操作系统:CentOS 7.9

作为私有仓库,建议硬盘尽量大一些,我使用的200GB,可以推荐使用1TB以上。

准备工作

找一台能上网的机器(需要能运行docker),下载下面三类文件

可以根据之前的教程进行 docker 和 docker-compose 的安装

Docker-ce的离线安装包

Docker离线安装包 地址查找符合自己主机系统和架构的docker-ce安装包版本,下载对应版本的docker安装文件。

Docker-compose的离线安装包

Docker-compose离线安装包 地址查找最新的docker-compose版本

下载最新版的 docker-compose 文件,下载后将 docker-compose-linux-x86_64 重命名为 docker-compose(后续上传到 linux 机器后还得赋予执行权限),具体参照上文

harbor的离线安装包

Harbor离线安装包 地址查找最新的harbor离线包版本

本文写作时版本为 2.6.3

将下载后的安装包上传到服务器的对应目录,比如 /opt/docker/install-packages

harbor需要的prepare镜像包

1
2
3
4
5
6
# 公网环境拉取对应的镜像
docker pull goharbor/prepare:v2.6.3

# 将此镜像打包
cd /opt/docker/docker-images
docker save -o goharbor_prepare_v2.6.3.tar goharbor/prepare:v2.6.3

harbor安装

以下操作在准备安装harbor的linux服务器上进行

使用Xshell连接到harbor主机上(本人比较懒,直接使用的root账户,这样很多操作比较方便,不必每次都输密码,如果是使用非root账户,或者ubuntu服务这种,需要在命令前加sudo)

1
2
3
4
5
cd /opt/docker/install-packages
tar -zxvf harbor-offline-installer-v2.6.3.tgz
cd harbor
cp harbor.yml.tmpl harbor.yml
vi harbor.yml # 编辑harbor配置文件进行安装

修改 harbor.yml,harbor作为私有仓库作用在公司内网,一般都是信任关系,没多大必要做https,使用http即可! 所以 把https相关的已经注释掉(实话是,配置https实在有点麻烦)

在公司内部使用,如果用了公司的dns,哪就可以采用域名作为hostname,如果是其他ip,请自行更换,注意以下红框标注部分,并注意配置文件的用户名密码配置,默认用户名是:admin,密码是:Harbor12345,如果修改需要安装前修改,这里我密码修改了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 此处更换成自己的ip
hostname: 10.10.11.248

# 这里配置访问的端口
http:
port: 8888

# https related config
# 这里的 https 配置我注释了,内网一般都是信任的,https 配置起来比较麻烦
#https:
# https port for harbor, default is 443
# port: 443
# The path of cert and key files for nginx
# certificate: /your/certificate/path
# private_key: /your/private/key/path

harbor_admin_password: Hallo@123

# 修改数据卷
data_volume: /app/docker-compose/harbor/harbor2.6.3/data


# 日志映射目录
log:
level: info
local:
rotate_count: 50
rotate_size: 200M
location: /app/docker-compose/harbor/harbor2.6.3/logs

将 goharbor_prepare_v2.6.3.tar 执行装载

1
2
cd /opt/docker/docker-images
docker load -i goharbor_prepare_v2.6.3.tar

执行安装命令,先执行预处理命令,会创建一些文件夹,初始化一些文件

1
./prepare

然后开始真正的安装过程,注意容器信息可能会冲突

比如你之前启动的容器和Harbor的容器重名,这是你需要将之前创建的容器改名

1
./install.sh

因为镜像已经在相关目录中,所以不需要下载。等待一会后,看到如下信息表示安装成功。

1
2
3
4
5
6
7
8
9
10
11
12
[Step 5]: starting Harbor ...
Creating network "harbor_harbor" with the default driver
Creating harbor-log ... done
Creating registryctl ... done
Creating harbor-portal ... done
Creating harbor-db ... done
Creating redis ... done
Creating registry ... done
Creating harbor-core ... done
Creating nginx ... done
Creating harbor-jobservice ... done
✔ ----Harbor has been installed and started successfully.----

编译一个harbor启动服务文件,可将harbor作为服务启动,便于今后使用

1
vi /lib/systemd/system/harbor.service

文件内容如下:

这里docker-compose命令的地址和harbor编排文件的地址,自己根据实际情况指定

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[Unit]
Description=Harbor
After=docker.service systemd-networkd.service systemd-resolved.service
Requires=docker.service
Documentation=http://github.com/vmware/harbor

[Service]
Type=simple
Restart=on-failure
RestartSec=5
ExecStart=/usr/local/bin/docker-compose -f /opt/docker/install-packages/harbor/docker-compose.yml up
ExecStop=/usr/local/bin/docker-compose -f /opt/docker/install-packages/harbor/docker-compose.yml down

[Install]
WantedBy=multi-user.target

启动harbor.service文件使之生效

1
2
3
systemctl enable harbor
systemctl start harbor
systemctl stop harbor

如果在安装后修改了harbor的配置文件,则需要重启才能生效

1
2
3
4
cd /opt/docker/install-packages/harbor
./prepare
docker-compose down -v
docekr-compose up -d

docker客户端访问

1
vi /etc/docker/daemon.json

输入以下内容,这里的ip和端口根据实际情况来

1
2
3
4
5
6
7
8
9
10
{
"registry-mirrors": [
"http://10.10.11.248:8888"
],
"insecure-registries":[
"127.0.0.1:8888",
"10.10.11.248:8888"
],
"graph":"/var/docker/lib"
}

修改了daemon.json文件后需要重载配置并重启docker服务和harbor服务,并登陆私有仓库

注意:如果重启了docker服务,最好同时再重新启动一下harbor服务,不然可能出现问题。

1
2
3
4
5
6
7
systemctl daemon-reload
systemctl restart docker
docker login 10.10.11.248:8888 # 私有仓库的ip或域名+端口

# 帐号密码是私有仓库的用户名和密码,管理员使用的是安装阶段在harbor.yml中设定的密码

# 登录成功后,则显示 Login Succeeded

xxl-job

编写编排文件:docker-compose-xxl-job.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 参考文档: https://www.xuxueli.com/xxl-job
version: "3"
services:
xxl-job-admin:
image: xuxueli/xxl-job-admin:2.3.0
container_name: xxl-job-admin
environment:
# TODO 根据自己的配置修改,配置项参考源码文件:/xxl-job/xxl-job-admin/src/main/resources/application.properties
PARAMS: "--spring.datasource.url=jdbc:mysql://10.10.11.133:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
--spring.datasource.username=root
--spring.datasource.password=root
--server.servlet.context-path=/xxl-job-admin
--spring.mail.host=smtp.qq.com
--spring.mail.port=25
--spring.mail.username=xxx@qq.com
--spring.mail.from=xxx@qq.com
--spring.mail.password=xxx
--xxl.job.accessToken="
ports:
- "9003:8080"

注意:其中的mail相关的信息,根据实际情况配置即可。

启动:

1
docker-compose -f docker-compose-xxl-job.yml -p xxl-job up -d

访问地址:http://ip地址:9003/xxl-job-admin

默认登录账号密码:admin/123456

启动成功以后在自己的项目中配置使用即可。

查看下载镜像的Dockerfile文件

1
docker history --format{{.CreatedBy}} --no-trunc=true 镜像id |sed "s/\/bin\/sh\ -c\ \#(nop)\ //g"|sed "s/\/bin\/sh\ -c/RUN/g"| tac
点击查看

本文标题:Docker相关操作

文章作者:LiJing

发布时间:2023年02月06日 - 13:55:37

最后更新:2024年03月23日 - 10:27:00

原始链接:https://blog-next.xiaojingge.com/posts/1400901585.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------------本文结束 感谢您的阅读-------------------