Docker的数据卷容器—容器间实现文件传递与共享

前言

什么是数据卷容器

当我们在使用docker容器的时候,会产生一系列的数据文件,这些数据文件在我们关闭docker容器时是会消失的,但是其中产生的部分内容我们是希望能够把它给保存起来另作用途的,Docker将应用与运行环境打包成容器发布,我们希望在运行过程钟产生的部分数据是可以持久化的的,而且容器之间我们希望能够实现数据共享。

通俗地来说,docker容器数据卷可以看成使我们生活中常用的u盘,它存在于一个或多个的容器中,由docker挂载到容器,但不属于联合文件系统,Docker不会在容器删除时删除其挂载的数据卷。

特点:

  1. 数据卷可以在容器之间共享或重用数据
  2. 数据卷中的更改可以直接生效
  3. 数据卷中的更改不会包含在镜像的更新中
  4. 数据卷的生命周期一直持续到没有容器使用它为止

实现

需求:

这里有两个容器,一个java进程容器(game-server),一个是mysql57的容器,在game-server下有sql的可执行文件,用来初始数据库的,那么我该如何使用game-server的sql文件去初始化mysql57容器呢?

Docker下的实现方式

docker官方文档

这里采用--volumes-from命令,使子容器完成去父容器的volume的传递。

  1. 这里先启动java容器,注意这里cmd为/bin/bash,并不是启动java进程
docker run -d --name server-game -v /sql/ -it server-game:1.0.0 /bin/bash
  1. 接下来先启动我们的mysql57容器,假设这里我的mysql绑定的IP地址是
  2. 使用容器mysql仅仅作为mysql的客户端,得到java进程下的sql文件,完成初始化
docker run -it --name mysql-client --volumes-from server-game \ 
 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 \
 /bin/bash /data/p-0/winner/ci/cleandb.sh

Docker-compose的实现

1.首先创建一个公共的数据卷

docker volume create --name=sqldata

2.配置game-server的启动文件,docker-compose-server.yml

version: "3.3"
#3.3 need docker engine 17.06.0+
services:
  win-mgr:
    image: server-game:1.0.0
    container_name: server-game
    volumes:
      - sqldata:/sql/

volumes:
    sqldata:
      external: true

特别注意这里,external为true

3.mysql的启动文件

version: "3.3"

volumes:
  sqldata:
    external: true

services:
  mysql-master:
    image: mysql:5.7
    container_name: mysql57
    environment:
      - MYSQL_ROOT_PASSWORD=123456
    ports:
      - "13306:3306"
    volumes:
      - /home/${USER}/docker/mysql57/conf.d:/etc/mysql/conf.d
      - /home/${USER}/docker/mysql57/data:/var/lib/mysql
      - sqldata:/win-sql

猜你喜欢

转载自blog.csdn.net/monokai/article/details/107005807