2016-08-05 13 views
11

Tôi mới làm quen với docker và phát triển một dự án bằng cách sử dụng docker compose. Từ các tài liệu hướng dẫn tôi đã học được rằng tôi nên sử dụng dữ liệu chỉ container để giữ cho dữ liệu vẫn tồn tại nhưng tôi không thể làm như vậy bằng cách sử dụng docker-compose. Bất cứ khi nào tôi làm docker-compose down, nó sẽ xóa dữ liệu khỏi db nhưng bằng cách thực hiện docker-compose stop dữ liệu sẽ không bị xóa. Có thể là vì tôi không tạo ra khối lượng dữ liệu được đặt tên và docker-compose down hầu như không xóa tất cả các vùng chứa. Vì vậy, tôi đã thử đặt tên cho vùng chứa nhưng nó đã ném cho tôi lỗi. hãy có một cái nhìn tại tập tin yml tôi:Soạn thảo Docker - Cách lưu dữ liệu cơ sở dữ liệu?

version: '2' 
services: 
    data_container: 
    build: ./data 
    #volumes: 
    # - dataVolume:/data 
    db: 
    build: ./db 
    ports: 
     - "5445:5432" 
    environment: 
     - POSTGRES_USER=postgres 
     - POSTGRES_DB=postgres 
    # - PGDATA=/var/lib/postgresql/data/pgdata 
    volumes_from: 
    # - container:db_bus 
     - data_container 
    geoserver: 
    build: ./geoserver 
    depends_on: 
     - db 
    ports: 
     - "8004:8080" 
    volumes: 
     - ./geoserver/data:/opt/geoserverdata_dir 

    web: 
    build: ./web 
    volumes: 
     - ./web:/code 
    ports: 
     - "8000:8000" 
    depends_on: 
     - db 
    command: python manage.py runserver 0.0.0.0:8000 

    nginx: 
    build: ./nginx 
    ports: 
     - "83:80" 
    depends_on: 
     - web 

nộp Các Docker cho data_container là:

FROM stackbrew/busybox:latest 
MAINTAINER Tom Offermann <[email protected]> 

# Create data directory 
RUN mkdir /data 

# Create /data volume 
VOLUME /data 

tôi đã cố gắng này, nhưng bằng cách làm Docker-soạn xuống, dữ liệu bị mất. Tôi đã cố gắng đặt tên cho các data_container như bạn sẽ nhìn thấy dòng nhận xét, nó ném tôi lỗi này:

ERROR: Named volume "dataVolume:/data:rw" is used in service "data_container" but no declaration was found in the volumes section. 

Vì vậy, ngay bây giờ những gì tôi đang làm là tôi đã tạo ra một lập trường dữ liệu riêng chỉ tên container và đưa rằng trong giá trị volumes_from của db. Nó hoạt động tốt và không xóa bất kỳ dữ liệu nào ngay cả sau khi thực hiện docker-compose down.

Truy vấn của tôi:

  • phương pháp tốt nhất để làm cho container có thể lưu trữ dữ liệu cơ sở dữ liệu bằng cách sử dụng các docker-compose và sử dụng chúng đúng cách là gì?

  • Ý thức của tôi không đồng ý với tôi về cách tiếp cận mà tôi đã chọn, phương pháp đó bằng cách tạo vùng chứa dữ liệu độc lập. Có suy nghĩ gì không?

+1

Có một lý do bạn không muốn sử dụng một khối lượng đặt tên cho dữ liệu của bạn, như 'lượng: -/data/mydata:/var/lib/postgresql/data/pgdata' là phương thức được ưu tiên hơn khối lượng vùng chứa dữ liệu. – ldg

+0

Tôi đã thử làm điều này và nó ném cho tôi lỗi: 'LRI: Dữ liệu được đặt tên" Dữ liệuVolume:/data: rw "được sử dụng trong dịch vụ" data_container "nhưng không có khai báo nào được tìm thấy trong phần khối lượng.' Tôi cũng tò mò về tính di động của dữ liệu sử dụng phương pháp này. –

Trả lời

11

docker-compose down

nào sau đây

Stops containers and removes containers, networks, volumes, and images created by up

Vì vậy, hành vi mà bạn đang gặp được mong đợi.

Sử dụng docker-compose stop để tắt các vùng chứa được tạo bằng tệp docker-compose nhưng không xóa các tập của chúng.

Thứ hai, bạn không cần mẫu data-container trong phiên bản 2 của trình tạo docker. Vì vậy, loại bỏ và chỉ sử dụng

db: 
    ... 
    volumes: 
     - /var/lib/postgresql/data 
+0

Làm thế nào tôi có thể sao lưu dữ liệu hoặc làm cho nó di động bằng cách sử dụng phương pháp này? –

+1

Đã có trên máy chủ docker trong một ổ đĩa. Bạn cần truy cập ổ đĩa đó bằng công cụ có thể đổ dữ liệu. ví dụ. '' 'docker-compose exec POSTGRES_CONTAINER pg_dump | bzip2> đường dẫn/trên/máy chủ/mydb-dump-'date "+% Y% m% d% H% M% S" '.sql.bz2''' –

+0

Điều này đã giúp ích rất nhiều. Có lỗi trong khi tôi cố gắng sao lưu dữ liệu là: 'pg_dump: [archiver (db)] kết nối với cơ sở dữ liệu" root "không thành công: FATAL: role" root "không tồn tại' Bạn có thể giúp tôi với điều này không ? –

5

Docker-soạn xuống dừng container mà còn loại bỏ chúng (với tất cả mọi thứ: mạng, ...).

Sử dụng stoper-compose stop thay thế.

Tôi nghĩ rằng cách tiếp cận tốt nhất để làm thùng chứa có thể lưu trữ dữ liệu cơ sở dữ liệu với Docker-soạn là sử dụng tên tập:

version: '2' 
services: 

    db: #https://hub.docker.com/_/mysql/ 
    image: mysql 
    volumes: 
     - "wp-db:/var/lib/mysql:rw" 
    env_file: 
     - "./conf/db/mysql.env" 

volumes: 
    wp-db: {} 

Ở đây, nó sẽ tạo ra một khối lượng tên gọi là "wp-db" (nếu nó không tồn tại) và gắn nó vào/var/lib/mysql (ở chế độ đọc-ghi, mặc định). Đây là nơi cơ sở dữ liệu lưu trữ dữ liệu của nó (cho hình ảnh mysql).

Nếu khối lượng đã đặt tên đã tồn tại, nó sẽ được sử dụng mà không cần tạo.

Khi bắt đầu, hình ảnh mysql trông có cơ sở dữ liệu trong/var/lib/mysql (ổ đĩa của bạn) để sử dụng chúng.

Bạn có thể có thêm thông tin với các tập tin tài liệu tham khảo Docker-soạn ở đây: https://docs.docker.com/compose/compose-file/#/volumes-volume-driver

Các vấn đề liên quan