# latest 为当前最新版本,也可以根据需要选择版本
docker pull mysql:latest
拉取镜像前可以先去 Docker Hub 上去查看相关版本
https://hub.docker.com/_/mysql/tags
将 mysql 容器内的相关目录映射到本机,方便进行配置和查看
# 创建需要映射的相关目录
mkdir -p /opt/mysql/{conf,logs,data}
# 创建配置文件
vim /opt/mysql/my.cnf
[mysqld]
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
secure_file_priv=/var/lib/mysql
expire_logs_days=7
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
max_connections=1000
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
注意配置文件中的映射端口、容器名和密码
docker run --restart=always --privileged=true \
-v /opt/mysql/data/:/var/lib/mysql \
-v /opt/mysql/logs/:/var/log/mysql \
-v /opt/mysql/conf/:/etc/mysql \
-v /opt/mysql/my.cnf:/etc/mysql/my.cnf \
-p 3306:3306 --name my-mysql \
-e MYSQL_ROOT_PASSWORD=123456 -d mysql
docker ps # 查看已经运行的容器,因为我的3306端口已经被占用,所以我映射到了9999端口
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
16dd3199f81d mysql "docker-entrypoint.s…" 5 hours ago Up 5 hours 33060/tcp, 0.0.0.0:9999->3306/tcp my-mysql
# 这里使用是容器的名字,也可以使用id
docker exec -it my-mysql /bin/bash
docker exec -it 16dd3199f81d /bin/bash
root@16dd3199f81d:/#
# 登录 MySQL,使用的是启动容器时设置的密码
root@16dd3199f81d:/# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 30
Server version: 8.0.27 MySQL Community Server - GPL
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
为了方便写了一个简单地脚本来部署 MySQL 容器,写的不怎么好,请见谅!
将以下代码写进 docker_mysql.sh(文件名随意命名)
#!/bin/bash
# 检查 Docker 是否已安装
if ! command -v docker &>/dev/null; then
echo -e "\e[93m Docker 未安装!\e[0m"
exit 1
fi
# 安装 MySQL
install_mysql() {
read -p "确定镜像版本(默认为最新版本):" version
version=${version:-latest}
echo -e "\e[94m 正在拉取镜像... \e[0m"
if docker pull mysql:$version >/dev/null 2>&1; then
echo -e "\e[93m 镜像拉取成功!\e[0m"
else
echo -e "\e[93m 镜像拉取失败,请确认镜像版本是否存在!\e[0m"
exit 1
fi
}
# 启动 MySQL 容器
start_mysql() {
read -p "需要映射到的端口(默认为 3306):" port
read -p "容器的名称(默认为 my-mysql):" name
read -p "MySQL 数据库密码(默认为 123456):" passwd
port=${port:-3306}
name=${name:-my-mysql}
passwd=${passwd:-123456}
# 检查名称是否已被占用
if docker ps -a --filter "name=$name" --format '{{.Names}}' | grep -q .; then
echo -e "\e[93m 名称 $name 已被占用!\e[0m"
exit 1
fi
# 检查端口是否已被占用
if [[ "$(ps -aux | grep -v grep | grep $port | wc -l)" -gt 0 ]]; then
echo -e "\e[93m 端口 $port 已被占用!\e[0m"
exit 1
fi
echo -e "\e[94m 正在启动容器... \e[0m"
if docker run --restart=always --privileged=true \
-p $port:3306 --name $name \
-e MYSQL_ROOT_PASSWORD=$passwd \
-e MYSQL_ROOT_HOST=% \
-d mysql --default-authentication-plugin=mysql_native_password >/dev/null 2>&1; then
if [ "$(docker ps -f "name=$name" --format '{{.Names}}')" == "$name" ]; then
echo -e "\e[93m 容器启动成功!\e[0m"
echo -e "\e[31m若正常启动则使用以下信息:\e[0m"
echo -e "\e[32m*****************************************************\e[0m"
echo -e "\e[34m\tPORT: $port\e[0m"
echo -e "\e[34m\tNAMES: $name\e[0m"
echo -e "\e[34m\tPASSWD: $passwd\e[0m"
echo -e "\e[35m 进入容器使用命令:docker exec -it $name /bin/bash\e[0m"
echo -e "\e[35m 登录 MySQL 使用命令:mysql -u root -p\e[0m"
echo -e "\e[32m*****************************************************\e[0m"
fi
else
echo -e "\e[93m 容器启动失败!\e[0m"
exit 1
fi
}
# 删除旧的 MySQL 容器
remove_mysql() {
read -p "已有 MySQL 容器,是否删除(Y/y|N/n):" input
case $input in
[yY][eE][sS]|[yY])
id=$(docker ps -a --filter "ancestor=mysql" --format "{{.ID}}")
docker stop $id >/dev/null 2>&1 && docker rm $id >/dev/null 2>&1
if [ $? -eq 0 ]; then
echo -e "\e[93m 容器 $id 删除成功!\e[0m"
install_mysql
start_mysql
else
echo -e "\e[93m 删除失败!\e[0m"
exit 1
fi
;;
[nN][oO]|[nN])
install_mysql
start_mysql
;;
*)
echo -e "\e[92m 请输入 Y/y 或 N/n \e[0m"
remove_mysql
;;
esac
}
# 检查是否已经安装 MySQL
if docker ps -f "ancestor=mysql" --format "{{.Names}}" | grep -q .; then
remove_mysql
else
install_mysql
start_mysql
fi
添加执行权限
chmod a+x docker_mysql.sh
运行结果: