Docker Миграция / развертывание БД в DigitalOcean - PullRequest
0 голосов
/ 18 февраля 2020

Предупреждение: я довольно новичок в docker и облачном хостинге, это, вероятно, глупый вопрос.

У меня есть локальное веб-приложение, которое имеет 3 изображения, связанные с ним, само приложение, БД и изображение phpmyadmin. Локально все работает хорошо, и если я перенесу все файлы в мою цифровую океаническую каплю и выведу свои контейнеры, то там тоже будет работать нормально, но я не хочу развертывать так, чтобы каждый файл из каждой библиотеки находился в моей капле.

Я экспериментировал с созданием машины docker на моей капле и удаленным размещением на ней своих контейнеров. Кажется, это работает отлично, за исключением того факта, что мое изображение базы данных не ссылается на мою базу данных и является просто пустой базой данных. Я попытался перенести базу данных таким способом, который я видел в учебнике:

docker-compose run --rm web db:create db:migrate

Но получил следующую ошибку, я предполагаю, что это потому, что моя машина работает Windows 10, а не Linux, но я нигде не могу найти эквивалентную команду для машины Windows.

Error response from daemon: OCI runtime create failed: container_linux.go:346: starting container process caused "exec: \"db:create\": executable file not found in $PATH": unknown

Я знаю, что, возможно, мне не хватает чего-то действительно глупого и легкого, но мне трудно понять, как перенести данные для моего изображения базы данных. Заранее спасибо.

ОБНОВЛЕНИЕ: В соответствии с просьбой, вот мой docker -компонент:

    version: "3.4"

services:
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=db
    restart: always
    ports:
      - 80:80
    volumes:
      - /sessions
    depends_on:
      - db
  db:
    image: mysql:latest
    environment: 
      MYSQL_ROOT_PASSWORD: mypass
      MYSQL_DATABASE: mydb
    ports:
      - "3306:3306"
    volumes:
      - ./data:/docker-entrypoint-initdb.d
    restart: always
  web:
    depends_on:
      - db
    build: .
    ports:
      - "8080:8080"
    restart: always
volumes:
  data:

ОБНОВЛЕНИЕ # 2: перенесенный файл БД в /docker-entrypoint-initdb.d (Я тоже пробовал это вчера, но не смог заставить его работать) и создал новое производство docker -compose-prod.yml Я должен что-то пропустить, хотя БД все еще пуста. Ниже мой новый docker -compose-prod.yml:

version: "3.4"

services:
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=db
    restart: always
    ports:
      - 80:80
    volumes:
      - /sessions
    depends_on:
      - db
  db:
    image: mysql:latest
    environment: 
      MYSQL_ROOT_PASSWORD: mypass
      MYSQL_DATABASE: mydb
    ports:
      - "3306:3306"
    volumes:
      - /docker-entrypoint-initdb.d
    restart: always
  web:
    depends_on:
      - db
    build: .
    ports:
      - "8080:8080"
    restart: always

1 Ответ

1 голос
/ 18 февраля 2020

Нет глупых вопросов .... Действительно !!

Ваша стратегия разумна.

На самом деле, вы можете сделать еще один шаг, автоматизировав подготовку Droplet, например, для использования контейнерно-ориентированная ОС и доступ к вашему файлу Compose. Но это не тот вопрос; -)

Я думаю, что не имеет значения, что вы используете Windows и, вероятно, не имеет большого значения; может потребоваться некоторая настройка ответа, но это все.

Проблема в том, что вам нужно переместить (или воссоздать) состояние базы данных на удаленной машине. Существует несколько способов сохранения состояния БД: в контейнере (не идеально); использование томов монтирования (хорошо), другое.

Каждый из них «подвижный», но было бы полезно, если бы вы могли добавить свой файл Compose к своему вопросу, чтобы мы могли увидеть, какой подход используется.

В полном раскрытии я не знаком с подходом, на который вы ссылались, но это не значит, что он неточен; Я просто не знаком с этим.

Обновление: docker-entrypoint-initdb.d

См .: "Инициализация экземпляра fre sh" на MySQL

Итак, любые файлы в этом каталоге запускаются для инициализации контейнера базы данных при его создании из образа.

В вашем Compose-файле вы монтируете каталог ./data вашего хоста в этот файл. Предположительно, этот каталог содержит> = 1 файл, который выполняет запланированную инициализацию.

NB Раздел volumes: data: в конце файла Compose представляется избыточным. Вы на самом деле используете смонтированный на хосте каталог ./data, а не этот том.

Когда вы запускаете файл Compose в Droplet, этих файлов нет, и вам нужно будет их скопировать .

Самый простой способ сделать это - использовать scp, что дает 2 альтернативы:

Либо сохраняет каталог data:

IP=[DROPLET-IP]
scp -r ./data root@${IP}:/data

NB Удаленное назначение /data, а не ./data. Вам также необходимо изменить файл Compose в Droplet (!): volumes: - /data:/docker-entrypoint-initdb.d

Или переместите файлы прямо в /docker-entrypoint-initdb.d

scp -r ./data root@${IP}/docker-entrypointy-initdb.d

NB Now нет необходимости в отображении объема. Вы можете удалить: volumes: - ./data:/docker-entrypoint-initdb.d

HTH!

Обновление: repro (работает)

Я использовал настройку docker-compose.yaml, но по сути это то же самое:

version: "3.4"

services:
  db:
    image: mysql:latest
    environment:
      MYSQL_ROOT_PASSWORD: mypass
      MYSQL_DATABASE: mydb
    ports:
      - "3306:3306"
    volumes:
      - ${PWD}/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
    restart: always

  adminer:
    image: adminer
    restart: always
    ports:
      - 8080:8080

Затем mkdir ${PWD}/docker-entrypoint-initdb.d и создал в нем файл с именем freddie.sql:

create database if not exists frederik;

use frederik;

create table treats (
 TreatID INT NOT NULL AUTO_INCREMENT,
 TreatName VARCHAR(255) NOT NULL,
 PRIMARY KEY (TreatId));

insert into treats (TreatName)
values
 ("Dried Salmon"),
 ("Meatballs");

Затем docker-compose rm --force && docker-compose up

Мне удалось просмотреть пользовательский интерфейс администратора (:8080 ), войдите (root | mypass) и просмотрите базу данных frederik:

enter image description here

...