【问题标题】:Docker DB Migration/Deployment to DigitalOceanDocker 数据库迁移/部署到 DigitalOcean
【发布时间】:2020-02-18 01:05:21
【问题描述】:

警告:我对 docker 和云托管相当陌生,这可能是一个愚蠢的问题。

我有一个本地 Web 应用程序,它有 3 个关联的图像,应用程序本身,数据库和 phpmyadmin 图像。一切都在本地运行良好,如果我将所有文件传输到我的数字海洋水滴并打开我的容器,它在那里也能正常运行,但这不是我想要部署的方式,让每个库中的每个文件都驻留在我的水滴中。

我一直在尝试在我的 droplet 上创建一个 docker-machine 并将我的容器远程部署到它。除了我的数据库映像没有引用我的数据库并且只是一个空数据库这一事实之外,这似乎工作正常。我尝试以在教程中看到的这种方式迁移数据库:

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-compose:

    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: 将 db 文件传输到 /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

【问题讨论】:

    标签: docker-compose digital-ocean docker-machine


    【解决方案1】:

    你的策略是正确的。

    实际上,您可以通过将 Droplet 配置自动化来更进一步,例如使用面向容器的操作系统并访问您的 Compose 文件。但这不是这个问题;-)

    我认为您使用的是 Windows 无关紧要,可能没什么区别;它可能需要对答案进行一些调整,但仅此而已。

    挑战在于您需要在远程机器上移动(或重新创建)数据库状态。有几种方法可以持久化 DB 状态:容器内(不理想);使用卷挂载(好),其他。

    每个都是“可移动的”,但如果您可以将 Compose 文件添加到您的问题中,这将有所帮助,以便我们可以看到正在使用哪种方法。

    全面披露,我不熟悉您引用的方法,但这并不意味着它不准确;我只是不熟悉它。

    更新:docker-entrypoint-initdb.d

    请参阅:MySQL 上的“初始化新实例”

    因此,当从映像创建数据库容器时,该目录中的任何文件都会运行以初始化数据库容器。

    在您的 Compose 文件中,您将主机的 ./data 目录挂载到此文件中。大概该目录包含 >=1 执行您预期的初始化的文件。

    NB Compose 文件末尾的volumes: data: 部分显得多余。您实际上使用的是主机安装目录 ./data 而不是此卷。

    当您在 Droplet 上运行 Compose 文件时,这些文件不存在,您需要复制它们。

    执行此操作的最简单方法是使用 scp,这提供了 2 种替代方法:

    要么保留data目录:

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

    NB 远程目标是/data 而不是./data。您还需要修改 Droplet (!) 上的 Compose 文件:

    volumes: - /data:/docker-entrypoint-initdb.d

    或者将文件直接移动到Droplet的/docker-entrypoint-initdb.d

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

    NB 现在不需要卷映射了。您可以删除:

    volumes: - ./data:/docker-entrypoint-initdb.d

    更新:再现(作品)

    我使用了经过调整的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

    我能够浏览管理员 UI (:8080)、登录 (root|mypass) 并浏览数据库 frederik

    【讨论】:

    • 好的,我将更新我的答案,以便更容易回复。
    • 又更新了我的帖子
    • db 服务的 volumes 是无关的。请删除它。我很惊讶它是有效的,它可能会覆盖您复制到 Droplet 的文件。
    • 你主机的数据目录里有什么? docker-entrypoint-initdb.d 目录应包含 SQL 脚本(仅)。这些将用于在容器运行时创建数据库架构和内容。
    • 起初我实际上已经删除了它并尝试了但没有成功,然后我添加了它,因为它出现在我的问题中也没有成功。无论哪种方式,仍然是一个空数据库:(。数据和 docker-entrypoint-initdb.d 目录中唯一的东西是一个 .sql 数据库脚本。
    猜你喜欢
    • 1970-01-01
    • 2019-01-25
    • 2018-07-30
    • 2011-07-19
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多