部署MySQL
本教程将指导您如何在Docker环境中部署MySQL数据库,并展示如何通过外部MySQL客户端与之交互。
步骤 1: 准备环境
首先,我们需要在本地环境中创建必要的文件夹结构来存储MySQL的配置、日志和数据。
# 在终端创建mysql文件夹及其子文件夹
mkdir -p mysql/{conf,logs,data}
# 创建配置文件 my.cnf,内容在下文中
cd mysql/conf
vim my.cnf
步骤 2: 获取MySQL镜像
使用Docker搜索并拉取MySQL镜像:
# 搜索mysql镜像
docker search mysql
# 拉取mysql 5.7版本的镜像
docker pull mysql:5.7
步骤 3: 部署MySQL容器
运行以下命令来创建并启动MySQL容器,同时设置端口映射和目录映射:
# 创建并启动mysql容器
docker run -id \
-p 3306:3306 \
--name=mysql57 \
-v $PWD/conf:/etc/mysql/conf.d \
-v $PWD/logs:/logs \
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD='your_password' \
mysql:5.7
详解端口和目录映射:
$PWD
:当前工作目录,此变量会解析为所在目录的绝对路径。-p 3306:3306
:将容器的3306端口映射到宿主机的3306端口。-v
参数:用于目录映射,确保容器内部数据的持久化。$PWD/conf:/etc/mysql/conf.d
:映射conf
目录。$PWD/logs:/logs
:映射logs
目录。$PWD/data:/var/lib/mysql
:映射data
目录。
-e MYSQL_ROOT_PASSWORD
:设置MySQL的root用户密码。
步骤 4: 访问MySQL容器
使用Docker命令进入容器内部,并通过MySQL命令行工具进行操作:
# 登录MySQL容器
docker exec -it mysql57 bash
# 连接MySQL数据库
mysql -uroot -p'your_password'
外部访问容器内的MySQL
由于容器内的网络服务默认与外部环境隔离,我们通过端口映射来实现外部访问。
- 宿主机和容器间的通信通过映射端口实现。
- 访问宿主机的3306端口即相当于访问容器内部的MySQL服务。
配置文件 my.cnf
在 conf
文件夹中创建 my.cnf
配置文件,内容如下:
[mysqld]
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
# skip-grant-tables
event_scheduler = 1
bind-address=0.0.0.0
port=3306
user=mysql
basedir=/usr/local/mysql
datadir=/var/lib/mysql
socket=/tmp/mysql.sock
character_set_server=utf8mb4
collation-server=utf8mb4_unicode_ci
explicit_defaults_for_timestamp=true
lower_case_table_names=1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
[mysqld_safe]
log-error=/data/mysql/mysql.err
pid-file=/data/mysql/mysql.pid
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
确保配置文件中的路径和设置与您的环境相匹配。
有任何问题欢迎私信我或者加我的联系方式,我会很乐于交流!