解决 Docker 挂载了容器卷之后 docker commit 失效的问题

因为我经常重装和更换操作系统的原因,导致 MySQL 数据库中的数据,在每次系统重装的时候,这些数据都得导出成一个 SQL 文件,然后重装好系统之后,又得导入进去。这样 很折腾,很麻烦 为此,我就想把 MySQL 数据都放入到 Docker 容器中。这样的话,我每次装好系统之后,只要导入镜像就可以使用,不必花时间去导入 SQL。同时也方便统一管理(核心数据记得备份)。因此,就有了以下的折腾。具体操作如下:


# 1、拉取 MySQL
sudo docker pull mysql:8.0.32


# 2、运行 MySQL
docker run -it --name mysql8 \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=hello \
  -e character-set-server=utf8mb4 \
  --restart=always \
  --privileged=true \
  -v /opt//docker/mysql/data:/var/lib/mysql \
  -v /etc/localtime:/etc/localtime:ro \
  -d mysql:8.0.32


# 3、接下来就把自己所有数据导入到该容器中

# 4、导入完成后,把所有数据都 commit 到镜像中
docker commit -m "我的MySQL数据库集合" -a "Jack" 1a5304e6cdd7 mysql8:V1.0.0

# 5、当提交完成后,发现镜像大小一点没变,还是 531MB。当时我是一脸懵,然后开始逐步解决该问题

上述启动命令已经挂载了容器卷,数据已经有了备份,我干嘛还要把数据封装到容器中呢?原因如下:1、我有两台电脑,5个系统,打成镜像方便在各系统之间传输和操作 2、封装成镜像,防止误操作,如果删除了容器卷目录,那数据就没了,得哭死 3、自己封装的镜像,能做到开箱即用。例如:你启动容器后,容器里没有vim、ps命令,但是你安装好这些应用,然后封装成镜像后再运行就有了。 所以,当 commit 命令不生效时,我其实挺无语的。然后我就去 docker 官网查找和 stackoverflow 查找,但是都没有结果。


于是我就想,能不能把挂载的容器卷的数据复制到新的 MySQL 容器里面,因此有了如下操作:


# 启动一个新容器,端口号是 3307
docker run -it --name new_mysql \
  -p 3307:3306 \
  -e MYSQL_ROOT_PASSWORD=root \
  -d mysql:8.0.32

# 复制数据到 new_mysql 容器的 /var/lib/mysql 目录下
docker cp data new_mysql:/var/lib/mysql 

# 复制完成之后,进入容器查看是否新增数据
docker exec -it new_mysql bash
mysql -uroot -phello
show databases;    # 发现没有新增数据库


# 于是我发现上面是不是数据复制的不对,/var/lib/mysql 目录下是数据
# 应该把 data 里面的数据复制到 /var/lib/mysql 目录下,而不是复制 data 目录本身
# 所以又进行了如下操作
cp -r /var/lib/mysql/data/** /var/lib/mysql
rm -rf /var/lib/mysql/data

# 复制完成之后,再次查询数据库,还是没有数据
show databases;

上述方案不行之后,我就想能不能用 Dockerfile。 于是就有了如下操作:


FROM mysql:8.0.32
COPY data /var/lib/mysql
WORKDIR /var/lib/mysql


# 1、编写 Dockerfile,就上述三行,最后一行可要可不要


# 2、构建镜像
docker build -t mysql8:V1.0.0 .


# 构建完容器之后,使用客户端去连接,发现数据已经封装到镜像中了,完美
docker run -it --name new_mysql \
  -p 3308:3306 \
  -e MYSQL_ROOT_PASSWORD=root \
  -d mysql8:V1.0.0

为啥要记录这篇文章呢?有以下几点:


1、官方文档没有写,什么情况下 commit 会失效(挂载容器卷后,commit会失效)
2、Google 和 StackOverflow 都没有检索到类似答案
3、方便有需要的人参考

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值