需要使用到数据卷(Volume)的概念
参考《Docker 中通过 Volume 实现持久化存储和数据共享》一文说法,最好是先创建一个volume container,单纯用来存储共享数据的。下面实践下:
# 先创建alpine容器,名称为vc_mysql,前缀vc代表是volume container,代表是为mysql创建的为了共享数据的数据卷,并且-v表示创建一个由docker容器自行管理的卷,指定容器内目录为/var/lib/mysql,容器外目录为
docker run -d -v /var/lib/mysql --name vc_mysql alpine
# 启动第一个mysql容器mysql_1,--volumes-from指定使用与容器vc_mysql一样的卷
docker run -d --name mysql_1 --volumes-from=vc_mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=camunda -d mysql:5.6
# 第一个mysql中创建数据表(随意弄一个),为了留点操作痕迹
# docker stop 此容器
# 启动第二个mysql容器mysql_2,--volumes-from指定使用与容器vc_mysql一样的卷
docker run -d --name mysql_2 --volumes-from=vc_mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=camunda -d mysql:5.6
# 会看到第二个mysql中也能看到第一个mysql中新建的表,代表数据是共享的
# 注意因为两个mysql共享数据,同时开启,会导致有一个数据库访问不了,记得使用一个时先停用另外一个
通过 docker inspect xxx(容器名:tag或容器id)命令,可以看到 vc_mysql, mysql_1, mysql_2 都是使用同一个卷的,如下图所示:
docker compose verion 3 的编写方式
参考资料:
https://docs.docker.com/compose/compose-file/#volume-configuration-reference
Docker-compose-v3弃用volumes_from
下面列出部署mysql和对应使用mysql的应用camunda工作流的docker-compose.yml实例
version: "3.7"
services:
mysql4camunda_service:
image: mysql:5.6
container_name: mysql4camunda_container
restart: always
ports:
- 3306:3306
networks:
- camunda_mysql_network
env_file:
- ./env/mysql.env
volumes: #重点是设置这里
- data-volume:/var/lib/mysql #重点是设置这里
camunda4mysql_service:
image: camunda/camunda-bpm-platform:7.11.0
container_name: camunda4mysql_container
restart: always
ports:
- 8080:8080
networks:
- camunda_mysql_network
depends_on:
- mysql4camunda_service
env_file:
- ./env/camunda.env
networks:
camunda_mysql_network:
volumes: #重点是设置这里
data-volume: #重点是设置这里
在docker-compose-v2中volumes_from是 可以正常使用的,但在v3中这一个参数被弃用,被另外一个参数顶级卷替代(全局)
其中上面的例子 volumes 可以自定义名称,表示挂载的点,同时可以共享给其他服务使用的。即使对这个服务使用docker-compose down命令删除容器和卷,但都不会删除掉这个卷,从下面可以看出来:
docker-compose down后(或者docker rm -vf $(docker ps -a -q)后),还是能看到它存在,证明这样操作是可以打到共享卷的效果的。