도커 작성 영구 데이터 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컨테이너는 데시벨에 불과 클라이언트 인터페이스와의 때문에 로컬 디렉토리를 볼 수 있습니다volumes_from: - data

이 답변을 시도했지만 작동하지 않았습니다. 도커 작성 영구 데이터 문제

편집하다

내을 변경 .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.

답변:


223

데이터 컨테이너는 불필요한 해결 방법입니다. 데이터 볼륨 은 당신을 위해 트릭을 할 것입니다. 다음을 변경하십시오 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부터는 Docker 이미지에 권한 문제 가 있습니다 mysql. 대신 mariadbDocker 이미지 를 사용하여 Docker 볼륨과 완벽하게 작동합니다 .
Peterino

이 솔루션은 저에게 효과적이었습니다. 몇 가지 참고 사항 / 정밀도 : 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로 생성되었습니다.
Joey Cote

10
var/lib/docker/volumes프로젝트 폴더에 디렉토리 를 저장하는 대신 저장하고 싶 data/mysql습니까?
대부

@TheGodfather 내 추측은 MySQL 데이터를 프로덕션 시스템에 배포하지 않으려는 것입니다. 그렇지 않으면 모든 것을 함께 유지하는 건전한 아이디어입니다.
Duncan

1
@louhow 내 앱과 데이터의 모든 부분이 어떻게 든 함께 저장 될 때 자신이 더 자신감 이 있고 어딘가에서 어떤 볼륨에 의존하지 않기 때문에 생각합니다.
The Godfather

53

세 가지 방법이 있습니다.

첫 번째 방법

호스트 머신 에 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?
Adam

아니. 불행히도이 경우 docker는이 컨테이너 디렉토리를 다음과 같은 임의의 호스트 폴더에 매핑합니다./var/lib/docker/volumes/ec3c543bc92f114c2c568733541e89381881e5a62996d7084e07793f86280535
Bukharov Sergey

좋아, 내가 생각 volumes: - /var/lib/mysql하는 것은volumes: - /var/lib/mysql:/var/lib/mysql
Adam

도 커가 볼륨에서 이미지로 데이터를 커밋하지 않기 때문에 세 번째 방법은 작동하지 않습니다. github.com/moby/moby/issues/6999
Ohmen

13

mysql 데이터에 대해 별도의 볼륨을 만들어야합니다.

따라서 다음과 같이 보일 것입니다 :

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

그리고 아니오, /var/lib/mysqlmysql 컨테이너 내부의 경로이며 호스트 컴퓨터의 경로와 관련이 없습니다. 호스트 머신에는 mysql이 전혀 없을 수도 있습니다. 따라서 목표는 mysql 컨테이너에서 내부 폴더를 유지하는 것입니다.


이 내 변경 다르지 수 없습니다하지 않을까요 volumes당신이 아래에 넣어 무엇을 데이터 컨테이너 아래에 volumes간단했다 volumes_from: - data위해 mysql? 또한 이것을 시도하고 새로운 오류가 발생했습니다. 디렉토리가 존재하지만 쓰기 가능하지 않으며 mysql컨테이너가 실행 되지 않는다고 말합니다 .
Adam

물론 경로 ./mysql-data (또는 세미콜론 앞에 넣는 것)로 로컬 폴더를 만들어야합니다.
Dmitry Malyshenko

내 편집을 참조하십시오. 댓글을 달기 전에 들어오지 않았습니다. 그러나 로컬 디렉토리를 만들었습니다. 권한 문제가있는 것 같습니다.
Adam

오류 : "mysql"서비스는 서비스 또는 컨테이너의 이름이 아닌 "data"에서 볼륨을 마운트합니다.
Massimiliano Arione

10

실제로 이것은 경로이며 이것이 작동하려면 유효한 경로를 언급해야합니다. 데이터 디렉토리가 다음 대신 현재 디렉토리에있는 경우 my-data당신이 언급해야한다 ./my-data, 그렇지 않으면 당신에게 그 오류를 줄 것이다 mysqlmariadb도.

volumes:
 ./my-data:/var/lib/mysql
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.