programing

도커-영구 데이터 MySQL 구성

megabox 2023. 9. 11. 21:34
반응형

도커-영구 데이터 MySQL 구성

실행하면 MySQL 데이터가 지속되지 않는 것 같습니다.$ 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/mysqlmapping은 mylocal machine directory에 mapping을 하는데, 거기서 mysql은 컨테이너에 데이터를 저장하기 때문에 컨테이너가 파괴되어도 데이터는 지속되어야 합니다.그리고.mysql컨테이너는 단지 DB에 클라이언트 인터페이스일 뿐이고 로컬 디렉토리를 볼 수 있습니다.volumes_from: - data

이 답변을 시도했지만 효과가 없었습니다.Docker-Compose 영구 데이터 문제

편집

내가 바뀌었습니다..yml아래와 같이 dir를 만들었습니다../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:

도커가 볼륨을 생성할 것입니다./var/lib/docker/volumes폴더.이 볼륨은 입력하지 않는 한 지속됩니다.docker-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

제3길

사용할 수도 있습니다.docker-compose stop대신에docker-compose down(그러면 컨테이너를 커밋할 필요가 없습니다.)

먼저, 당신은 모든 오래된 mysql 데이터를 삭제해야 합니다.

docker-compose down -v

그런 다음 도커에 두 줄을 추가합니다. yml.

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

그리고.

volumes:
  mysql-data:

당신의 마지막 도커-docker-dock.yml은 다음과 같이 보일 것입니다.

version: '3.1'

services:
  php:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - 80:80
    volumes:
      - ./src:/var/www/html/
  db:
    image: mysql
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example
    volumes:
      - mysql-data:/var/lib/mysql

  adminer:
    image: adminer
    restart: always
    ports:
      - 8080:8080
volumes:
  mysql-data:

그 후 이 명령을 사용합니다.

docker-compose up -d

이제 데이터가 영구적으로 유지되고 이 명령을 사용해도 삭제되지 않습니다.

docker-compose down

extra:- 하지만 모든 데이터를 삭제하려면 다음을 사용합니다.

docker-compose down -v

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

따라서 다음과 같이 나타납니다.

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

그리고 아니요./var/lib/mysql는 mysql 컨테이너 내부의 경로이며 호스트 시스템의 경로와는 무관합니다.호스트 시스템에 mysql이 아예 없을 수도 있습니다.따라서 mysql 컨테이너에서 내부 폴더를 유지하는 것이 목표입니다.

@Ohmen의 답변에 추가하여 다음을 추가할 수 있습니다.external플래그를 지정하여 도커 구성 외부에 데이터 볼륨을 만듭니다.도커가 이 방식으로 작성하면 작성이 시도되지 않습니다.또한 데이터 볼륨 내부의 데이터가 손실될 우려도 없습니다.$ docker-compose down -v. 아래 예시는 공식 페이지에서 나온 것입니다.

version: "3.8"

services:
  db:
    image: postgres
    volumes:
      - data:/var/lib/postgresql/data

volumes:
  data:
    external: true

실제로 이것이 경로이며 이것이 작동하려면 유효한 경로를 언급해야 합니다.재에는우가신f 대신my-data당신은 언급해야 합니다../my-data 은 에게 를 입니다 입니다 를 은 에게 mysql그리고.mariadb208.

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

실현 가능한 바인딩 마운트 솔루션:

  mariadb:
    image: mariadb:latest
    restart: unless-stopped
    environment:
      - MARIADB_ROOT_PASSWORD=${MARIADB_ROOT_PASSWORD}
    volumes:
      - type: bind
        source: /host/dir
        target: /var/lib/mysql

저의 경우 'mysql'이라는 볼륨을 탑재했는데 이 단어는 예약되어 있습니다! 생각해보세요!

언급URL : https://stackoverflow.com/questions/39175194/docker-compose-persistent-data-mysql

반응형