Docker – 编写持久数据MySQL

我似乎无法让MySQL数据持久化,如果我运行$ docker-compose down .yml $ docker-compose down下面的.yml

 version: '2' services: # other services data: container_name: flask_data image: mysql:latest volumes: - /var/lib/mysql command: "true" mysql: container_name: flask_mysql restart: always image: mysql:latest environment: MYSQL_ROOT_PASSWORD: 'test_pass' # TODO: Change this MYSQL_USER: 'test' MYSQL_PASS: 'pass' volumes_from: - data ports: - "3306:3306" 

我的理解是,在我的data容器中使用volumes: - /var/lib/mysql将其映射到我的本地机器目录,在这里mysql将数据存储到容器中,并且由于映射的原因,即使容器被销毁,数据也应该保留。 而mysql容器只是一个客户端接口到数据库,并可以看到本地目录,因为volumes_from: - data

试图这个答案,它没有工作。 Docker-构成持久性数据问题

编辑

改变我的.yml ,如下所示,并创build一个目录./data但现在当我运行docker-compose up --buildmysql容器不会开始抛出错误说

  data: container_name: flask_data image: mysql:latest volumes: - ./data:/var/lib/mysql command: "true" mysql: container_name: flask_mysql restart: always image: mysql:latest environment: MYSQL_ROOT_PASSWORD: 'test_pass' # TODO: Change this MYSQL_USER: 'test' MYSQL_PASS: 'pass' volumes_from: - data ports: - "3306:3306" flask_mysql | mysqld: Can't create/write to file '/var/lib/mysql/is_writable' (Errcode: 13 - Permission denied) flask_mysql | 2016-08-26T22:29:21.182144Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details). flask_mysql | 2016-08-26T22:29:21.185392Z 0 [ERROR] --initialize specified but the data directory exists and is not writable. Aborting. 

数据容器是一个多余的解决方法。 数据量将为你做的伎俩。 改变你docker-compose.yml到:

 version: '2' services: mysql: container_name: flask_mysql restart: always image: mysql:latest environment: MYSQL_ROOT_PASSWORD: 'test_pass' # TODO: Change this MYSQL_USER: 'test' MYSQL_PASS: 'pass' volumes: - my-datavolume:/var/lib/mysql volumes: my-datavolume: 

Docker将在/var/lib/docker/volumes文件夹中为您创build/var/lib/docker/volumes 。 只要不inputdocker-compose down -v此卷就会一直存在

有3种方法:

第一。 你需要指定目录来存储你的主机上的mysql数据。 您可以删除数据容器。 你的mysql数据将被保存在本地文件系统上。

Mysql容器定义必须如下所示

 mysql: container_name: flask_mysql restart: always image: mysql:latest environment: MYSQL_ROOT_PASSWORD: 'test_pass' # TODO: Change this MYSQL_USER: 'test' MYSQL_PASS: 'pass' volumes: - /opt/mysql_data:/var/lib/mysql ports: - "3306:3306" 

第二种方式是在键入docker-compose down之前提交数据容器:

 docker commit my_data_container docker-compose down 

第三种方式。 你也可以使用docker-compose stop代替docker-compose down (那么你不需要提交容器)

你必须为mysql数据创build一个单独的卷。

所以它会看起来像这样:

 volumes_from: - data volumes: - ./mysql-data:/var/lib/mysql 

不, /var/lib/mysql是你的mysql容器中的一个path,并且与主机上的path无关。 你的主机甚至可能根本没有mysql。 所以我们的目标是从一个mysql容器中保存一个内部文件夹。