安装部署环境
- Ubuntu 18.04.3 LTS
- Docker 19.03.2
- MySQL latest(8.0.17)
下载镜像
- # docker 从仓库中拉取最新版的 MySQL 镜像, 如果没加标签的话, 默认获取最新的版本
- Docker pull MySQL
挂载数据卷以及配置文件
Docker 容器原则上是短暂的, 如果容器被删除或损坏, 任何数据或配置都将丢失. 因为, 我们需要将 Docker 内的 MySQL 数据文件以及配置文件转移到宿主机的指定路径.
每个人部署的 MySQL 内, 可能文件路径不一致. 我们可以先创建个测试的 MySQL 容器, 然后再根据查找出的文件具体路径位置, 重新创建我们符合我们需求的 MySQL 容器, 命令如下:
docker run --name mysqltest -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root -d MySQL
进入 Docker 容器内
docker exec -it mysqltest bash
确定 Docker 内 MySQL 文件相关路径
根据官网说明: 如果要挂载 MySQL 配置文件的话, 我们必须在物理机上存在着该配置文件.
- # 查找 Docker 内, MySQL 配置文件 my.cnf 的位置
- MySQL --help | grep my.cnf
- # 显示如下, 意思是路径按优先排序, 会是在以下路径里:
- order of preference, my.cnf, $MYSQL_TCP_PORT,
- /etc/my.cnf /etc/MySQL/my.cnf ~/.my.cnf
- # 配置文件的路径不一定都一样, 有些博客介绍的位置是在 / etc/my.cnf. 而本人 Ubuntu 系统上, 实际存在位置是在 / etc/MySQL/my.cnf
查找数据文件位置
用于在容器上运行 docker inspect 命令的 JSON 输出具有一个 Mount 密钥, 其值提供了有关数据目录卷的信息:
- docker inspect mysqltest
- ...
- "Mounts": [
- {
- "Type": "volume",
- "Name": "4f2d463cfc4bdd4baebcb098c97d7da3337195ed2c6572bc0b89f7e845d27652",
- "Source": "/var/lib/docker/volumes/4f2d463cfc4bdd4baebcb098c97d7da3337195ed2c6572bc0b89f7e845d27652/_data",
- "Destination": "/var/lib/mysql",
- "Driver": "local",
- "Mode": "",
- "RW": true,
- "Propagation": ""
- }
- ],
- ...
输出显示源文件夹:/var/lib/docker/volumes, 表示已安装在 /var/lib/MySQL 容器内的服务器数据目录中.
创建本地路径并挂载 Docker 内数据
接下来, 我们需要在物理机上, 创建指定好一个数据和配置文件的挂载路径.
mkdir -p /home/docker/MySQL/conf && mkdir -p /home/docker/MySQL/datadir
创建好本地的挂载数据路径后, 我们再将测试容器里 MySQL 的配置文件复制到该路径. 日后需改配置, 直接在挂载路径的配置文件上修改即可.
docker cp mysqltest:/etc/MySQL/my.cnf /home/docker/MySQL/conf
创建 MySQL 容器并启动
解决了配置文件的问题, 就可以根据需求创建我们的 MySQL 容器并挂载数据了.
docker run --name mysql1 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root --mount type=bind,src=/home/docker/MySQL/conf/my.cnf,dst=/etc/MySQL/my.cnf --mount type=bind,src=/home/docker/MySQL/datadir,dst=/var/lib/MySQL --restart=on-failure:3 -d MySQL
--name: 为容器指定一个名字
-p: 指定端口映射, 格式为: 主机 (宿主) 端口: 容器端口
-e:username="xxx", 设置环境变量
--restart=on-failure:3: 是指容器在未来出现异常退出 (退出码非 0) 的情况下循环重启 3 次
-mount: 绑定挂载
-d: 后台运行容器, 并返回容器 id
网上许多人的博客写的挂载 MySQL 数据卷方法, 采用的是 --volume, 但是在最新的 MySQL 官方 Docker 搭建 MySQL 文档中, 建议我们大家使用 --mount, 因为研究表明它更易于使用. 故我们根据官网推荐 https://docs.docker.com/storage/bind-mounts/ 的方法, 这里也采用 --mount 挂载.
查看在运行的容器
docker ps
们可以看到 mysql1 容器正在运行, 包括之前我们创建的测试容器.
来源: http://www.bubuko.com/infodetail-3342259.html