背景

本文是一篇流水账笔记,记录基于命令行和Docker快速部署一个全新环境的中间件,精通多种中间件的安装(与卸载)。

获取Docker中运行的组件的内网IP【这里指的Docker环境内网,不是宿主机的网络】: docker inspect —format ‘{{ .NetworkSettings.IPAddress }}’ {容器实例名称}

本文基于CentOS7.x和当前最新的Docker版本编写,注意其他操作系统不一定合适。

安装Docker

移除已经存在的旧版本Docker

  • 折叠命令:
1
2
3
4
5
6
7
8
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
  • 单行命令:
1
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine

安装基础依赖包:

1
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

替换软件源(安装提速):

1
2
3
4
5
# 阿里云源
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 清华大学源
sudo yum-config-manager --add-repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo

安装(最新版本的Docker Engine-Communitycontainerd.ioDocker

1
sudo yum install -y docker-ce docker-ce-cli containerd.io

或者指定版本安装:

1
2
3
4
5
# 展示版本
yum list docker-ce --showduplicates | sort -r

# 选择版本安装
sudo yum install -y docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io

如果提示:如果提示您接受GPG密钥?则选择y

(安装完成后默认不会启动Docker进程,需要手动启动)启动Docker进程:

1
sudo systemctl start docker

Docker进程管理常用命令:

命令功能
systemctl start docker启动Docker进程
systemctl stop docker停止Docker进程
systemctl restart docker重启Docker进程
systemctl enable docker允许Docker服务在服务器重启后自启动

【可选】修改Docker镜像和容器的默认存储位置。默认存储位置为/var/lib/docker目录,此目录一般是系统目录。假设需要迁移到数据目录/data/docker,迁移的方法有很多,这里推荐使用软链接的方式:

1
2
3
4
5
6
7
8
# 停止Docker进程
systemctl stop docker
# 移动整个/var/lib/docker目录到目标目录/data/docker
mv /var/lib/docker /data/docker
# 创建软链接
ln -s /data/docker /var/lib/docker
# 启动Docker进程
systemctl start docker

中间件安装信息

中间件容器名称版本端口映射备注
MySQLmysql88.03306 -> 3306-
RabbitMQrabbitmq3.85672 -> 567215672 -> 15672选用*-management镜像,默认启用了后台管理的WebUI插件
Redisredis5.06379 -> 6379-
Nacosnacos1.4.28848 -> 8848-
Zookeeperzookeeper3.62181 -> 21812888 -> 28883888 -> 3888-
Kafkakafka2.13-2.6.09092 -> 9092需要配置宿主机的IP
ElasticSearchelasticsearch7.3.19300 -> 9300需要修改系统配置

如果想安装的中间件容器在服务器重启和Docker进程重启后自行重启,可以考虑在启动容器的时候添加参数--restart=always;如果想容器内部的root用户拥有真正的root权限,则需要在启动容器的时候添加参数--privileged=true(此参数有安全性风险,谨慎使用)。

基于Docker安装MySQL

新建MySQL宿主机目录:

  • /data/mysql8/conf:配置目录
  • /data/mysql8/data:数据目录
  • /data/mysql8/logs:日志目录

新增配置文件/data/mysql8/conf/my.cnf,文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure-file-priv= NULL
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
max_connections=16000
# 表名不区分大小写
lower_case_table_names=1

default-time_zone='+8:00'
character-set-client-handshake=FALSE
character_set_server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci'
# Custom config should go here
!includedir /etc/mysql/conf.d/

拉取MySQL8.x镜像:

1
2
3
4
5
# 最新的MySQL镜像就是8.x的,也可以执行版本拉取
docker pull mysql

# 自定版本拉取
docker pull mysql:8.0

基于镜像启动MySQL8.x容器,脚本如下:

1
docker run -d -v /data/mysql8/conf/my.cnf:/etc/mysql/my.cnf -v /data/mysql8/logs:/var/log -v /data/mysql8/data:/var/lib/mysql  -p 3306:3306 --name mysql8 -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0

进入MySQL8.x容器新增可以远程访问的root用户,修改密码编码方式:

1
2
3
4
5
6
7
8
9
10
11
# 进入容器内部
docker exec -it mysql8 /bin/bash

# 使用原始账号密码root 123456登录
mysql -uroot -p

# 添加或者修改root用户密码,并且开启远程访问
use mysql;
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '新的密码';
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新的密码';
FLUSH PRIVILEGES;

基于Docker安装RabbitMQ

新建RabbitMQ宿主机目录:

1
2
3
mkdir -p /data/rabbitmq/{conf,data,logs}
# 授权目录
chmod -R 777 /data/rabbitmq
  • /data/rabbitmq/conf:配置目录
  • /data/rabbitmq/data:数据目录
  • /data/rabbitmq/logs:日志目录

拉取RabbitMQ3.8.x镜像:

1
2
# 需要拉取带后台管理插件的镜像,否则后台管理插件需要自行安装
docker pull rabbitmq:3.8-management

基于镜像启动RabbitMQ3.8.x容器:

1
docker run -d -p 5672:5672 -p 15672:15672 -v /data/rabbitmq/data:/var/lib/rabbitmq -v /data/rabbitmq/conf:/etc/rabbitmq -v /data/rabbitmq/logs:/var/log/rabbitmq --name rabbitmq rabbitmq:3.8-management

进入RabbitMQ3.8.x容器内部新增管理员用户和授权:

1
2
3
4
5
6
7
# 进入容器内部
docker exec -it rabbitmq /bin/bash

# 新增管理员和授权
rabbitmqctl add_user 账号 密码
rabbitmqctl set_user_tags 账号 administrator
rabbitmqctl set_permissions -p / 账号 "." "." ".*"

基于Docker安装Redis

新建Redis5.x宿主机目录:

1
mkdir -p /data/redis/{conf,data}

下载Redis5.x的默认配置(https://raw.githubusercontent.com/antirez/redis/5.0/redis.conf)到/data/redis/conf中,并且对配置文件redis.conf进行修改:

  • 注释掉bind 127.0.0.1
  • protected-mode yes修改为protected-mode no
  • 添加requirepass=密码

拉取Redis5.0镜像:

1
docker pull redis:5.0

基于镜像启动Redis5.0容器:

1
docker run -d --privileged=true -p 6379:6379 -v /data/redis/conf/redis.conf:/etc/redis/redis.conf -v /data/redis/data:/data --name redis redis:5.0 redis-server /etc/redis/redis.conf --appendonly yes

基于Docker安装Nacos

新建Nacos宿主机目录:

1
mkdir -p /data/nacos/{logs,conf}
  • /data/nacos/logs:日志目录
  • /data/nacos/conf:配置目录

拉取Nacos1.4.2镜像:

1
docker pull nacos/nacos-server:1.4.2

nacos-1.4.2的源码中找到建表语句,这个版本的源码链接是https://github.com/alibaba/nacos/archive/refs/tags/1.4.2.tar.gz,然后基于里面的nacos-db.sql进行建表,从脚本中观察到,数据库schema最好命名为nacos_config。然后基于镜像启动Nacos1.4.2容器:

1
2
3
4
5
6
7
8
9
10
11
docker run -d \
-v /data/nacos/logs:/home/nacos/logs \
-v /data/nacos/conf/application.properties:/home/nacos/conf/application.properties \
-e TZ="Asia/Shanghai" \
-e PREFER_HOST_MODE=hostname \
-e MODE=standalone \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e NACOS_APPLICATION_PORT=8848 \
-p 8848:8848 \
--name nacos \
nacos/nacos-server:1.4.2

拷贝和修改宿主机配置/data/nacos/conf/application.properties

1
2
3
4
5
server.tomcat.accesslog.enabled=false
db.num=1
db.url.0=jdbc:mysql://{MySQL容器实例Docker内网IP}:3306/nacos_config?serverTimezone=GMT%2B8&characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false
db.user=你的账号
db.password=你的密码

然后重启Nacos1.4.2容器:

1
docker restart nacos

{MySQL容器实例Docker内网IP}是Docker中MySQL实例的Docker环境内网IP,通过本文初提到的命令:docker inspect —format ‘{{ .NetworkSettings.IPAddress }} mysql获取

基于Docker安装Zookeeper

新建Zookeeper宿主机目录:

1
2
3
mkdir -p /data/zookeeper/{data,logs,conf}
# 授权目录
chmod -R 777 /data/zookeeper
  • /data/zookeeper/logs:日志目录
  • /data/zookeeper/conf:配置目录
  • /data/zookeeper/data:数据目录

拉取Zookeeper3.6镜像:

1
docker pull zookeeper:3.6

随便启动一个Zookeeper容器并且拷贝其中的zoo.cfg文件到宿主机本地目录:

1
2
3
4
5
docker run -d --name zk zookeeper:3.6
docker cp zk:/conf/zoo.cfg /data/zookeeper/conf/zoo.cfg
# 工具人只是为了提取默认的配置文件,用完就stop和rm
docker stop zk
docker rm zk

最后基于镜像启动Zookeeper3.6容器:

1
2
3
4
5
6
docker run -d --name zookeeper \
-p 2181:2181 -p 2888:2888 -p 3888:3888 \
-v /data/zookeeper/conf/zoo.cfg:/conf/zoo.cfg \
-v /data/zookeeper/data:/data \
-v /data/zookeeper/logs:/datalog \
zookeeper:3.6

基于Docker安装Kafka

考虑到一般情况下的Kafka的存储数据量不会十分大并且很少进行迁移,不做宿主机的目录挂载,这里直接把数据等放在容器实例中。拉取Kafka:2.13-2.6.0镜像:

1
docker pull wurstmeister/kafka:2.13-2.6.0

注意前提是必须已经启动了Zookeeper容器,这里使用前一小节的Zookeeper容器,获取其实例的Docker内网IP

1
2
docker inspect --format '{{ .NetworkSettings.IPAddress }}' zookeeper
=> {Zookeeper容器实例Docker内网IP}

最后基于镜像启动Kafka:2.13-2.6.0容器:

1
2
3
4
5
6
docker run -d --name kafka -p 9092:9092 \
-e KAFKA_BROKER_ID=0 \
-e KAFKA_ZOOKEEPER_CONNECT={Zookeeper容器实例Docker内网IP}:2181 \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://{宿主机IP}:9092 \
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 \
wurstmeister/kafka:2.13-2.6.0

基于Docker安装ElasticSearch

新建ElasticSearch宿主机目录:

1
2
3
mkdir -p /data/es/{data,logs,conf}
# 授权目录
chmod -R 777 /data/es
  • /data/es/logs:日志目录
  • /data/es/conf:配置目录
  • /data/es/data:数据目录

拉取Elasticsearch7.3.1镜像:

1
docker pull elasticsearch:7.3.1

修改系统配置以满足Elasticsearch实例运行:

1
sysctl -w vm.max_map_count=262144

随便启动一个Elasticsearch容器并且拷贝其中的elasticsearch.yml文件到宿主机本地目录:

1
2
3
4
5
docker run -d --name es -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.3.1
docker cp es:/usr/share/elasticsearch/config/elasticsearch.yml /data/es/conf
# 工具人只是为了提取默认的配置文件,用完就stop和rm
docker stop es
docker rm es

最后基于镜像启动Elasticsearch7.3.1容器:

1
2
3
4
5
6
7
docker run -d --name elasticsearch \
-p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-v /data/es/conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /data/es/data:/usr/share/elasticsearch/data \
-v /data/es/logs:/usr/share/elasticsearch/logs \
elasticsearch:7.3.1

未完待续

安装所有中间件完成后的示例如下:

这篇流水账记录的是工作或者日常实验用到的中间件,其他中间件用到后会陆续添加。

(to be continue… f-e-a 20211216 c-2-d)