Skip to content

Docker 单机部署:常用中间件实操指南

本文档用于快速部署常用中间件与服务(MySQL、Redis、ES、Nginx、Kafka 等)

MySQL

bash
# MySQL 8
docker run -d \
-p 3306:3306 \
--name mysql \
--restart unless-stopped \
--privileged=true \
-v /xupengboo/mysql/log:/var/log/mysql \
-v /xupengboo/mysql/data:/var/lib/mysql \
-v /xupengboo/mysql/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=1234 \
mysql:8.0.34

# MySQL 5.7
docker run -d \
-p 3306:3306 \
--name mysql \
--restart unless-stopped \
--privileged=true \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=1234 \
mysql:5.7

参数说明:

参数说明
-p 3306:3306端口映射
-v conf配置文件
-v log日志
-v data数据
-e MYSQL_ROOT_PASSWORDroot密码

MySQL5my.ini 配置信息如下:

ini
# vi /mydata/mysql/conf/my.cnf
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci' init_connect='SET NAMES utf8' character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve

MySQL8my.ini 配置信息如下:

ini
# vi /mydata/mysql/conf/my.cnf
[mysqld]
#设置时区为东八区,此项设置后,在连接MySQL的时候可以不用每次都手动设置时区
default-time-zone = '+8:00'
# 设置3306端口
port=3306
# 设置mysql的安装目录,记得切换成自己的路径
basedir=D:\mysql\mysql2\mysql-8.0.27-winx64
# 设置mysql数据库的数据的存放目录
datadir=D:\mysql\mysql2\mysql-8.0.27-winx64\data
# 允许最大连接数
max_connections=200
# 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统
max_connect_errors=10
# 服务端使用的字符集默认为UTF8
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 默认使用“mysql_native_password”插件认证
default_authentication_plugin=mysql_native_password
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
[client]
# 设置mysql客户端连接服务端时默认使用的端口
port=3306
default-character-set=utf8

问题 1:

Docker 容器内部下载相关包过慢:

bash
# 1. 复制目前的源
mv /etc/apt/sources.list /etc/apt/sources.list.bak

# 2. 修改 Debian 镜像源,由于 Docker 默认没有vim的包,所以无法使用vim指令,这里我们直接通过下面命令塞入创建。
cat <<EOF >/etc/apt/sources.list
deb http://mirrors.ustc.edu.cn/debian stable main contrib non-free
deb http://mirrors.ustc.edu.cn/debian stable-updates main contrib non-free
EOF

# 3. 更新源
apt update

# 4. 若有需要,可以将备份的源恢复
mv /etc/apt/sources.list.bak /etc/apt/sources.list

问题 2:

Docker部署后,无法进入MySQL服务内部问题(无法远程登录连接)

bash
# 1. 进入MySQL容器内部, 安装 vim 工具
docker exec -it mysql bash
apt-get update
apt-get -y install vim

# 2,修改/etc/mysql/conf.d/docker.cnf文件,添加:skip-grant-tables
[mysqld]
skip-host-cache
skip-name-resolve
skip-grant-tables

# 3. 退出,重启MySQL容器
docker restart mysql

# 4. 再次进入容器 `mysql -uroot -p` 进入MySQL后
mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

mysql> update mysql.user set authentication_string = password("root1234") where user="root";
Query OK, 2 rows affected, 1 warning (0.00 sec)
Rows matched: 2  Changed: 2  Warnings: 1

mysql> exit

# 5. 删除 `/etc/mysql/conf.d/docker.cnf` 文件中添加的 `skip-grant-tables`, 再重启容器。
# 6,再次尝试访问MySQL就正常了。

Redis

bash
docker run -d \
--name redis \
-p 6379:6379 \
--restart unless-stopped \
-v /xupengboo/redis/data:/data \
-v /xupengboo/redis/conf/redis.conf:/etc/redis/redis.conf \
redis redis-server /etc/redis/redis.conf

推荐(限制内存)

bash
docker run -d \
--name redis \
-p 6379:6379 \
--memory 256m \
--memory-swap 512m \
--restart unless-stopped \
-v /opt/redis/data:/data \
-v /opt/redis/conf/redis.conf:/etc/redis/redis.conf \
redis redis-server /etc/redis/redis.conf

Elasticsearch

bash
docker pull elasticsearch:7.4.2

创建目录

bash
mkdir -p /mydata/elasticsearch/config
mkdir -p /mydata/elasticsearch/data

配置

bash
# 配置elasticsearch的配置文件,
# 作用:http.host参数用于指定Elasticsearch HTTP服务的绑定地址。当设置为0.0.0.0时,表示Elasticsearch将监听所有可用的网络接口,包括本地回环地址(localhost)和外部网络接口。
echo "http.host: 0.0.0.0" >> /mydata/elasticsearch/config/elasticsearch.yml

启动

bash
# 9200端口:接受Rest API请求端口。
# 9300端口:分布式集群状态下的通信接口
# -e "discovery.type=single-node":指定单节点模式
# -e ES_JAVA_OPTS="-Xms64m -Xmx128m":指定初始占用内存 和 最大占用内存。
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx128m" \
-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \
-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.4.2

权限问题修复

bash
# docker启动失败,查看日志
docker logs 应用名

# 安装过程可能遇到 elasticsearch accessdenied问题,那是文件目录权限问题
chmod -R 777 /mydata/elasticsearch

# 重新启动elasticsearch
docker start elasticsearch

Kibana

bash
# 拉取镜像
docker pull kibana:7.4.2

# 执行
docker run -d \
--name kibana \
-p 5601:5601 \
-e ELASTICSEARCH_HOSTS=http://Elasticsearch的IP:9200 \
kibana:7.4.2

访问:

http://IP:5601

Nginx

bash
# 1. 先下载一个nginx,方便获取/etc/nginx目录下的配置文件。
docker run -p 80:80 --name nginx -d nginx:1.10
# 将容器中的/etc/nginx 复制当前目录。
docker container cp nginx:/etc/nginx .
# 将其改为conf文件,用来映射conf文件。
mv nginx/ conf/

# 2. 创建nginx容器
docker run -p 80:80 --name nginx \
-v /xupengboo/nginx/html:/usr/share/nginx/html \
-v /xupengboo/nginx/logs:/var/log/nginx \
-v /xupengboo/nginx/conf:/etc/nginx \
--network xupengboo_network \
-d nginx:1.10

# 3. 访问对应ip:80 ,测试是否安装成功。

# 4. 进入nginx/html目录下,创建es目录,放置es词典器。
mkdir es
cd es
# 在es目录下面,创建一个fenci.txt文件:可以输入一些测试词语、张三等等。
vi fenci.txt

RabbitMQ

bash
# 1. 启动 rabbitmq:management 容器
docker run -d --name rabbitmq -p 5671:5671 -p 5672:5672 \
-p 4369:4369 -p 25672:25672 -p 15671:15671 -p 15672:15672 rabbitmq:management

# 2. 自动重启
docker update rabbitmq --restart=always

访问:

http://IP:15672

账号密码:

guest / guest

Nacos

bash
# 1. 创建配置目录
mkdir -p /xupengboo/nacos/logs/                      #新建logs目录
mkdir -p /xupengboo/nacos/conf/						#新建conf目录

# 2. 先启动一个案例,把配置等全部拿过来
docker run -p 8848:8848 --name nacos -d nacos/nacos-server:v2.0.4

# 3. 将配置复制出来
docker cp nacos:/home/nacos/logs/ /xupengboo/nacos/
docker cp nacos:/home/nacos/conf/ /xupengboo/nacos/

# 4. 移除旧的nacos
docker rm -f nacos

# 5. 启动新的nacos
docker run -d \
  --name nacos \
  -p 8848:8848  -p 9848:9848 -p 9849:9849 \
  --privileged=true \
  -e JVM_XMS=512m \
  -e JVM_XMX=512m \
  -e MODE=standalone \
  -v /xupengboo/nacos/logs/:/home/nacos/logs \
  -v /xupengboo/nacos/conf/:/home/nacos/conf \
  --restart=always \
nacos/nacos-server:v2.0.4

# 推荐v2.0.4,新版本2.2之后,鉴权-e NACOS_AUTH_ENABLE=true  操作。
# 鉴权 见:https://nacos.io/docs/latest/manual/admin/auth/?spm=5238cd80.c984973.0.0.6be14023EgtSpC

访问:

http://IP:8848

Kafka

bash
docker pull bitnami/kafka:3.0

# kafka
docker run -d \
  --name kafka-server \
  --privileged \
  -p 9092:9092 \
  -v /opt/mount/kafka/data:/bitnami \
  -v /opt/mount/kafka/config/server.properties:/bitnami/kafka/config/server.properties \
  -v /opt/mount/zookeeper/datalog:/datalog \
  -v /etc/localtime:/etc/localtime \
  -e KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=true \
  -e TZ=Asia/Shanghai \
  -e ALLOW_PLAINTEXT_LISTENER=yes \
  --restart always \
  --security-opt label=disable \
  bitnami/kafka:3.0 \
  /opt/bitnami/scripts/kafka/entrypoint.sh \
  /opt/bitnami/scripts/kafka/run.sh
  
# 这种启动方式,必须还要有个zookeeper。
# 也可以采用官方的:https://kafka.apache.org/quickstart  , kraft模式(kafka自带的。)

Kafdrop

Kafka 可视化

bash
# kafdrop kafka可视化工具
docker run -d \
--name kafdrop \
-p 9999:9000 \
-e KAFKA_BROKERCONNECT=Kafka_IP:9092 \
obsidiandynamics/kafdrop:3.30.0

# 详细部署
docker run -d \
  --name kafdrop \
  --privileged \
  -p 9999:9000 \
  -e SERVER_SERVLET_CONTEXTPATH=/ \
  -e KAFKA_BROKERCONNECT=center-server:9092 \
  -e JVM_OPTS="-Xms256M -Xmx512M" \
  -e PATH="/opt/java/openjdk/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" \
  -e LANG=en_US.UTF-8 \
  -e LANGUAGE=en_US:en \
  -e LC_ALL=en_US.UTF-8 \
  -e JAVA_VERSION=jdk-11.0.14.1+1 \
  -e JAVA_HOME=/opt/java/openjdk \
  --restart always \
  --security-opt label=disable \
  obsidiandynamics/kafdrop:3.30.0 \
  /kafdrop.sh
  
# 只需要关系 KAFKA_BROKERCONNECT 就行。
# 此外,还要配置对应 kafka 支持外部客户端连接。

访问:

http://IP:9999

Zookeeper

bash
docker run -d \
 --name zookeeper \
 --privileged \
 -p 2181:2181 \
 -v /opt/docker/zookeeper/conf/zoo.cfg:/conf/zoo.cfg \
 -v /opt/docker/zookeeper/logs:/logs \
 -v /opt/docker/zookeeper/data:/data \
 -v /opt/docker/zookeeper/datalog:/datalog \
 -v /etc/localtime:/etc/localtime \
 -e TZ=Asia/Shanghai \
 --restart always \
 zookeeper:3.8.0 \
 zkServer.sh start-foreground

PostgreSQL

bash
# 拉取官方镜像(推荐指定版本,如 postgres:16)
docker pull postgres:latest

# 启动容器(数据持久化 + 基础配置)
docker run -d \
 --name postgres \
 -e POSTGRES_PASSWORD=1234 \
 -e POSTGRES_USER=root \
 -e POSTGRES_DB=postgres \
 -v /opt/postgresql/data:/var/lib/postgresql/data \
 -p 5432:5432 \
 postgres:latest

Tomcat

bash
# tomcat安装
docker run -id --name=c_tomcat \
-p 8080:8080 \
-v $PWD:/usr/local/tomcat/webapps \
tomcat 

# -p 8080:8080:将容器的8080端口映射到主机的8080端口
# -v $PWD:/usr/local/tomcat/webapps:将主机中当前目录挂载到容器的webapps

Jenkins

bash
docker run -u root --name jenkins \ 
	--memory 512m --memory-swap=512m \ 
  # --rm \ 推出容器自动删除,一般考虑释放存储
  -d -p 8080:8080 -p 50000:50000 \
  -v $JENKINS_HOME/jenkins-data:/var/jenkins_home \
  -v $JENKINS_HOME/docker.sock:/var/run/docker.sock \
  jenkinsci/blueocean

Gitlab

bash
export GITLAB_HOME=/xupengboo/gitlab

sudo docker run --detach \
  --hostname gitlab.demo.com \
  --publish 8000:443 --publish 8001:80 --publish 8002:22 \
  --name gitlab \
  --restart always \
  --memory 5g \
 	--memory-swap=6g \
  --volume $GITLAB_HOME/config:/etc/gitlab \
  --volume $GITLAB_HOME/logs:/var/log/gitlab \
  --volume $GITLAB_HOME/data:/var/opt/gitlab \
  --shm-size 256m \
  registry.gitlab.cn/omnibus/gitlab-jh:latest

Rancher

bash
sudo docker run -d --privileged \
	--restart=unless-stopped \ 
  --name rancher \
  -p 80:80 -p 443:443 -p 2379:2379 \
  -v /xupengboo/rancher:/var/lib/rancher/ \ 
  rancher/rancher:v2.5.12