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_PASSWORD | root密码 |
MySQL5 的my.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-resolveMySQL8 的my.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.confElasticsearch
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 elasticsearchKibana
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:5601Nginx
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.txtRabbitMQ
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 / guestNacos
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:8848Kafka
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:9999Zookeeper
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-foregroundPostgreSQL
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:latestTomcat
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:将主机中当前目录挂载到容器的webappsJenkins
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/blueoceanGitlab
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:latestRancher
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