本文记录Docker相关操作,备忘。
前言
保证Linux内核为3.0+,否则建议升级内核版本
# 查看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 目录下
[root@docker ~]# mkdir -p /opt/docker/install-packages
[root@docker ~]# /opt/docker/install-packages
[root@docker install-packages]# ls
docker-20.10.7.tgz
解压安装包
cd /opt/docker/install-packages
tar -zxvf docker-20.10.7.tgz
将docker文件移到系统可执行文件目录下
如果不移到可执行文件目录下则docker指令用不了
[root@docker docker]# ls
docker docker-20.10.7.tgz
[root@docker docker]# mv docker/* /usr/bin
配置docker.service
vi /usr/lib/systemd/system/docker.service
内容如下:
[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服务
systemctl daemon-reload
systemctl start docker.service
开机自启动docker
systemctl enable docker
注意:内网安装docker没有办法从公网拉取任何东西,除非自己打包镜像到服务器运行
公网安装Docker
安装
# 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.创建一个目录
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
常用命令
帮助命令
# 查看docker的版本信息
docker version
# 显示docker的系统信息
docker info
# 帮助命令,万能命令
docker 命令 --help
镜像命令
# 查看所有本地主机上的镜像 可以使用 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
容器命令
# 新建容器并启动
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
退出容器
# 容器直接退出
exit
# 容器不停止退出
ctrl + P + Q
删除容器
# 删除指定的容器,不能删除正在运行的容器,如果要强制删除 rm -rf
docker rm 容器id
# 删除所有的容器
docker rm -f $(docker ps -aq)
# 删除所有的容器
docker ps -a -q|xargs docker rm
查看容器中进程信息
docker top 容器id
查看镜像的元数据
docker inspect 容器id
保存对应镜像
保存对应的镜像,以便于在无网环境中使用
# 进入到保存镜像的目录,执行如下命令
docker save -o mysql_5.7.tar mysql:5.7
将安装包保存起来,上传到对应服务器
# 将安装包加载到镜像中
docker load -i mysql_5.7.tar
Docker安装各个组件
MySQL
公网
# 拉取镜像
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
内网
在公网环境
保存对应镜像,上传到对应服务器,启动容器即可。
# 进入到保存镜像的目录,执行如下命令
docker save -o mysql_5.7.tar mysql:5.7
将安装包保存起来,上传到对应服务器
# 将安装包加载到镜像中
docker load -i mysql_5.7.tar
Redis
公网
# 拉取镜像
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"
内网
在公网环境
保存对应镜像,上传到对应服务器,启动容器即可。
# 进入到保存镜像的目录,执行如下命令
docker save -o redis_6.0.8.tar redis:6.0.8
将安装包保存起来,上传到对应服务器
# 将安装包加载到镜像中
docker load -i redis_6.0.8.tar
Nginx
搭建临时容器
为的是将初始配置拿出来,防止挂载是找不到文件报错。
# 拉取镜像
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
公网
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
内网
在公网环境
保存对应镜像,上传到对应服务器,启动容器即可。
# 进入到保存镜像的目录,执行如下命令
docker save -o nginx_1.21.1.tar nginx:1.21.1
将安装包保存起来,上传到对应服务器
# 将安装包加载到镜像中
docker load -i nginx_1.21.1.tar
MinIO
公网
# 拉取镜像
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"
内网
在公网环境
保存对应镜像,上传到对应服务器,启动容器即可。
# 进入到保存镜像的目录,执行如下命令
docker save -o minio.tar minio/minio
将安装包保存起来,上传到对应服务器
# 将安装包加载到镜像中
docker load -i minio.tar
登录控制台
访问 9000 端口,然后使用上面指定的用户和密码登录系统
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 /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版本来,不同版本的数据表可能有差别,自己去官网获取即可。
/******************************************/
/* 数据库全名 = 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');
公网
# 启动容器
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
内网
在公网环境
保存对应镜像,上传到对应服务器,启动容器即可。
# 进入到保存镜像的目录,执行如下命令
docker save -o nacos_v2.1.2.tar nacos/nacos-server:v2.1.2
将安装包保存起来,上传到对应服务器
# 将安装包加载到镜像中
docker load -i nacos_v2.1.2.tar
ES和Kibana
公网
elasticsearch
# 拉取镜像
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
# 可视化工具kibana
# 拉取镜像
docker pull kibana:7.14.1
# 查看全部镜像
docker images
编写kibana配置
mkdir -p /my-container/elasticsearch/kibana/config
vi /my-container/elasticsearch/kibana/config/kibana.yml
chmod 777 /my-container/elasticsearch/kibana
输入以下内容
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 # 中文
# 启动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
- ES访问地址:[
ip地址:9200
]
账号密码:elastic/Hallo@123
- kibana访问地址:[
ip地址:5601/app/dev_tools#/console
]
账号密码:elastic/Hallo@123
内网
在公网环境
保存对应镜像,上传到对应服务器,启动容器即可。
# 进入到保存镜像的目录,执行如下命令
docker save -o es_7.14.1.tar elasticsearch:7.14.1
docker save -o kibana_7.14.1.tar kibana:7.14.1
将安装包保存起来,上传到对应服务器
# 将安装包加载到镜像中
docker load -i es_7.14.1.tar
docker load -i kibana_7.14.1.tar
RocketMQ
用 docker-compose 方式创建,比较方便
公网
# 拉取镜像
docker pull foxiswho/rocketmq:server
docker pull foxiswho/rocketmq:broker
docker pull styletang/rocketmq-console-ng
# 查看全部镜像
docker images
内网
在公网环境
保存对应镜像,上传到对应服务器,启动容器即可。
# 进入到保存镜像的目录,执行如下命令
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
将安装包保存起来,上传到对应服务器
# 将安装包加载到镜像中
docker load -i rocketmq-server.tar
docker load -i rocketmq-broker.tar
docker load -i rocketmq-console-ng.tar
Ftp
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,否则文件无权限查看。
镜像导入导出脚本
导出脚本
#!/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
导入脚本
#!/bin/bash
DIR="/opt/docker/docker-images"
for i in `ls $DIR/*`;do docker load <$i;done
Docker-compose安装各个组件
注意以下内网环境的镜像均为从公网环境导出的
安装Docker-compose
公网
# 下载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
# 从公网下载,输出的路径即为公网下载路径
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
mkdir -p /my-docker-compose/mysql
cd /my-docker-compose/mysql
vi docker-compose-mysql5.7.yml
编写yml文件
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"
构建
docker-compose -f docker-compose-mysql5.7.yml -p mysql5.7 up -d
Redis
mkdir -p /my-docker-compose/redis
cd /my-docker-compose/redis
vi docker-compose-redis.yml
编写yml文件
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"
构建
docker-compose -f docker-compose-redis.yml -p redis up -d
Nginx
mkdir -p /my-docker-compose/nginx
cd /my-docker-compose/nginx
vi docker-compose-nginx.yml
编写yml文件
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"
构建
构建前记得复制对应的挂载文件,否则会报找不到文件错误
[root@docker nginx]# pwd
/my-docker-compose/nginx
# 拉取镜像
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
docker-compose -f docker-compose-nginx.yml -p nginx up -d
Nacos
mkdir -p /my-docker-compose/nacos
cd /my-docker-compose/nacos
vi docker-compose-nacos.yml
编写yml文件
# 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"
构建
构建前记得复制对应的挂载文件,否则会报找不到文件错误
[root@docker nacos]# pwd
/my-docker-compose/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 ./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
# tips: 构建前请先保证对应数据源可用,并创建了nacos相关数据库表
docker-compose -f docker-compose-nacos.yml -p nacos up -d
MinIO
mkdir -p /my-docker-compose/minio
cd /my-docker-compose/minio
vi docker-compose-minio.yml
编写yml文件
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"
构建
docker-compose -f docker-compose-minio.yml -p minio up -d
ES和Kibana
前置挂载
编写配置文件便于挂载
# 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文件
mkdir -p /my-docker-compose/elasticsearch
cd /my-docker-compose/elasticsearch
vi docker-compose-elasticsearch.yml
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
构建
# 当前目录下所有文件赋予权限(读、写、执行)
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
- ES访问地址:[
ip地址:9200
]
账号密码:elastic/Hallo@123
- kibana访问地址:[
ip地址:5601/app/dev_tools#/console
]
账号密码:elastic/Hallo@123
RocketMQ
前置挂载
mkdir -p /my-docker-compose/rocketmq/rocketmq/rocketmq_broker/conf
vi /my-docker-compose/rocketmq/rocketmq/rocketmq_broker/conf/broker.conf
输入以下内容
# 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文件
mkdir -p /my-docker-compose/rocketmq
cd /my-docker-compose/rocketmq
vi docker-compose-rocketmq.yml
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
docker-compose -f docker-compose-rocketmq.yml -p rocketmq up -d
访问地址 http://ip地址:9002
前置挂载脚本
由于有不少组件需要提前将部分配置文件准备好,以便于和容器相关目录以及文件挂载,这里写个脚本统一创建以上组件需要的目录和配置文件及其内容
这里比如说我将上面各个组件都挂载在 /app/docker-compose
下
#!/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批量编排
编写环境变量文件
-
在docker-compose.yml同级目录下面创建
.env
文件value不要加引号,引用会自动添加
-
在docker-compose.yml中使用key引用
-
如果环境变量文件不和docker-compose.yml在同一级目录下,则需要在docker-compose.yml文件中指定环境变量文件所在位置,比如
version: '3' services: mysql: env_file: - file.env # 相对于docker-compose.yml文件的位置
这里我就直接放在 docker-compose.yml 的同级目录下面了
.env
# 挂载目录
MOUNT_DIR=/app/docker-compose
# 设置网络模式
NETWORKS_DRIVER=bridge
# 服务器IP
SERVER_IP=10.10.11.248
编写容器编排文件
docker-compose.yml
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
构建
如果记不住命令,这个命令也可以单独写作脚本运行
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镜像包
# 公网环境拉取对应的镜像
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)
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,如果修改需要安装前修改,这里我密码修改了。
# 此处更换成自己的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 执行装载
cd /opt/docker/docker-images
docker load -i goharbor_prepare_v2.6.3.tar
执行安装命令,先执行预处理命令,会创建一些文件夹,初始化一些文件
./prepare
然后开始真正的安装过程,注意容器信息可能会冲突
比如你之前启动的容器和Harbor的容器重名,这是你需要将之前创建的容器改名
./install.sh
因为镜像已经在相关目录中,所以不需要下载。等待一会后,看到如下信息表示安装成功。
[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作为服务启动,便于今后使用
vi /lib/systemd/system/harbor.service
文件内容如下:
这里docker-compose命令的地址和harbor编排文件的地址,自己根据实际情况指定
[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文件使之生效
systemctl enable harbor
systemctl start harbor
systemctl stop harbor
如果在安装后修改了harbor的配置文件,则需要重启才能生效
cd /opt/docker/install-packages/harbor
./prepare
docker-compose down -v
docekr-compose up -d
docker客户端访问
vi /etc/docker/daemon.json
输入以下内容,这里的ip和端口根据实际情况来
{
"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服务,不然可能出现问题。
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
# 参考文档: 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相关的信息,根据实际情况配置即可。
启动:
docker-compose -f docker-compose-xxl-job.yml -p xxl-job up -d
访问地址:http://ip地址:9003/xxl-job-admin
默认登录账号密码:admin/123456
启动成功以后在自己的项目中配置使用即可。
查看下载镜像的Dockerfile文件
docker history --format{{.CreatedBy}} --no-trunc=true 镜像id |sed "s/\/bin\/sh\ -c\ \#(nop)\ //g"|sed "s/\/bin\/sh\ -c/RUN/g"| tac
评论区