使用Docker部署MySQL

卸载旧版本Docker(如果没有安装过跳过)

1
2
3
4
5
6
7
8
9
10
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine

安装Docker CE

1
2
3
4
5
6
7
8
9
# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息 这里推荐国内阿里的镜像
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3: 更新并安装 Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start

获取MySQL的Docker镜像

找到MySQL的镜像仓库

MySQL镜像仓库:https://hub.docker.com/_/mysql

创建MySQL容器

1
2
3
4
5
6
7
8
9
10
# -p 把宿主机器的端口桥接到容器内的端口内 
# -- name 指的是你的docker container name
# -v 把宿主机器的文件挂载到容器内达到容器内容的数据能持久化到宿主机器上
# 关于-v参数Docker Volume 可以查看这篇文章 http://dockone.io/article/128
# -e 配置参数
# $PWD 你持久化文件路径地址
# -d --detach=false 指定容器运行于前台还是后台,默认为false
# docker run 命令常见参数参考https://blog.csdn.net/kunloz520/article/details/53839237
# mysql:latest mysql镜像:版本 会指定从镜像仓库拉取5.7版本为基础的镜像后运行容器
docker run -p 3306:3306 --name mysql -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

查看Docker运行状态

1
2
3
[root@middlehomework-no docker-mysql]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b2291bf42076 mysql:5.7 "docker-entrypoint.s…" 5 minutes ago Up 5 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp mysql

检查端口是否正常开放

iptables配置:

1
2
3
4
iptables -L
# 如果没有则开通端口
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 3306 -j ACCEPT

CentOS7用户firewalld配置:

1
2
3
4
# 查看所有打开的端口
firewall-cmd --zone=public --list-ports
# 如果没有3306端口则开通端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent

意外情况

Docker 容器被意外关闭

1
2
# restart 重启 stop 停止 容器
docker start <CONTAINER ID>

修改MySQL密码

1
2
3
4
docker stop <CONTAINER ID>
docker rm <CONTAINER ID>
# 因为mysql的重要数据和配置文件都已经持久化在宿主机器上,如果容器内的其他文件配置也需要持久化加-v
docker run -p 3306:3306 --name mysql -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=你修改后的密码 -d mysql:5.7

因为Docker本身是无状态容器,有状态即有多个功能不同的实例,有依赖和启动先后关系,需要做数据持久化。无状态即实例间互相不依赖,它的请求包含了响应端需求的全部信息,比较好伸缩 ,所以在Docker做数据持久化就会稍微麻烦一些。

文章推荐です