# 部署中间件
# Tips
- -p xxx:xxx 冒号左边为宿主机端口,右边为容器内部端口
# 清单
# MySQL
启动的同时初始化数据库, 并且允许远程连接
当Mysql容器首次启动时,会在容器内部的/docker-entrypoint-initdb.d(启动逻辑在entrypoint.sh中)目录下扫描 .sh,.sql等文件。如果这些类型的文件存在,将执行它们来初始化数据库。
- 准备初始化脚本
# 创建存放初始化脚本的文件夹
mkdir -p /opt/app/mysql5.7/init-data/
# 清理历史脚本
rm -rf /opt/app/mysql5.7/init-data/*
# 给预创建的用户除业务库之外的其他库查询权限
cat > /opt/app/mysql5.7/init-data/init.sql << EOF
use mysql;
GRANT SELECT ON *.* TO '<需要预创建的用户名称>'@'%' REQUIRE NONE WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;
flush privileges;
EOF
# 生成修改sql_mode的脚本,往/etc/my.cnf文件追加sql_mode配置
cat > /opt/app/mysql5.7/init-data/init.sh << EOF
echo "sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'" >> /etc/my.cnf
EOF
- 部署
# 删除历史数据库,加上-f后,不会因为没有容器而报错停止,而是继续往下执行
docker rm -f mysql-server
# 部署
docker run --name mysql-server \
-e MYSQL_DATABASE="<需要预创建的数据库名称>" \
-e MYSQL_USER="<需要预创建的用户名称,推荐和数据库同名>" \
-e MYSQL_PASSWORD="<数据库密码>" \
-e MYSQL_ROOT_PASSWORD="<ROOT用户数据库连接密码>" \
-p 3306:3306 \
-v /opt/app/mysql5.7/init-data:/docker-entrypoint-initdb.d \
-d mysql/mysql-server:5.7 \
--character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci \
--lower_case_table_names=1
- 数据库管理工具
用Web图形模式直接管理MySQL数据库的工具
docker run --name some-myadmin -d -e PMA_ARBITRARY=1 -p 8082:80 phpmyadmin/phpmyadmin
# RabbitMQ
- 命令
docker run -d --name some-rabbit \
-p 5671:5671 \
-p 15671:15671 \
-p 5672:5672 \
-p 15672:15672 \
-p 25672:25672 \
-p 4369:4369 \
rabbitmq:3-management
- 提示 初始化用户名:guest 初始化密码:guest
# Redis
- 无密码版本
docker run -d --name some-redis -p 6379:6379 redis
- 有密码版本
docker run -d --name some-redis -p 6379:6379 redis --requirepass <密码>
# MongoDB
- 命令
docker run -d -p 27017:27017 -e MONGODB_DATABASE=<数据库名称> \
-e MONGODB_USERNAME=<用户名> \
-e MONGODB_PASSWORD=<密码> \
-e MONGODB_ROOT_PASSWORD=<root用户密码> \
--name some-mongo mongo
← 常用命令