Docker-组合持久数据MySQL


156

如果运行$ docker-compose down以下命令,我似乎无法使MySQL数据持久化.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容器只是进入db的客户端接口,并且可以看到本地目录,因为volumes_from: - data

尝试此答案,但没有用。Docker组成的持久性数据故障

编辑

改变了我.yml如下图所示,并创造了该目录./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.

Answers:


221

数据容器是一个多余的解决方法。数据量将为您解决问题。将您更改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文件夹中为您创建卷。只要您不输入内容,此音量就会持续存在docker-compose down -v


18
与MySQL 5.7.6开始就会有(再次)是权限问题mysql码头工人形象。您可以改为使用mariadbDocker映像,映像可完美地与Docker卷配合使用。
彼得诺

这个解决方案对我有用。以下是一些附带说明/注意事项:1.当您在docker-compose.yml中使用上述配置,并且使用“ docker stack deploy -c docker-compose.yml mystack”部署服务堆栈时,无需创建手动创建卷,它将自动为您创建为/ var / lib / docker / volumes / mystack_my-datavolume(请注意,它在卷名前加上“ mystack_”)。2.我不必更改目录权限。即使我的容器中有mysql:root拥有的文件,它们在我的Docker主机上创建为27:root也没有问题。
乔伊·科特

10
为什么为什么要将其存储var/lib/docker/volumes在项目目录中而不是像这样data/mysql
教父

@TheGodfather我的猜测是,如果您不想将MySQL数据部署到生产机器上;否则,将所有内容保持在一起是一个非常合理的想法。
邓肯

1
@louhow我认为是因为当我将应用程序和数据的所有部分以某种方式存储在一起时,我感到更加自信,并且我对某处的某些卷没有依赖性
The Godfather

53

有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(然后您不需要提交容器)


我不能只volumes: - /var/lib/mysql因为它映射而已HOST:CONTAINER吗,如果您不指定带冒号的内容,它将映射相同的目录吗?
亚当

不。不幸的是,在这种情况下,码头工人将此容器目录映射到随机主机文件夹,如/var/lib/docker/volumes/ec3c543bc92f114c2c568733541e89381881e5a62996d7084e07793f86280535
Bukharov Sergey

好吧,我认为volumes: - /var/lib/mysql这相当于volumes: - /var/lib/mysql:/var/lib/mysql
Adam

您的第三种方式将不起作用,因为Docker不会将卷中的数据提交到映像。参见github.com/moby/moby/issues/6999
Ohmen,

13

您必须为mysql数据创建一个单独的卷。

因此它将如下所示:

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

不,这/var/lib/mysql是您的mysql容器内的路径,与主机上的路径无关。您的主机甚至可能根本没有mysql。因此,目标是从mysql容器保留内部文件夹。


这是不是可以不超过改变我的不同volumes数据容器下你把在你的volumes,只是过volumes_from: - datamysql?还尝试了此操作,然后出现了新错误。说目录存在但不可写,并且mysql容器将无法运行。
亚当

当然,您必须创建一个路径为
./mysql-data

看到我的编辑。在您发表评论之前没有得到它。但是确实创建了本地目录。看起来现在有权限问题。
亚当

错误:服务“ mysql”从“数据”装载卷,该数据不是服务或容器的名称。
Massimiliano Arione'9

10

实际上,这是路径,您应该提到有效的路径。如果您的数据目录位于当前目录中,那么my-data您应该提到而不是./my-data,否则它将在mysql和中给您该错误mariadb

volumes:
 ./my-data:/var/lib/mysql
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.