构建我自己的 docker 镜像并将其部署到生产服务器?

时间:2021-02-19 18:38:41

标签: docker docker-compose

我可能错过了一些东西。所以,我已经在生产服务器上安装了 docker,并且我在本地有一个正在运行的应用程序。它在 docker-compose 上启动并运行。

所以我觉得我几乎准备好部署了。

不,我想构建一个 docker 映像并将其部署到生产服务器。

但是当我尝试从 docker compose 文件构建图像时

docker-compose -f docker-compose.base.yml -f docker-compose.production.yml build myapp

我不断收到错误:没有这样的服务:应用

我在 docker 站点上没有找到任何文档,其中描述了来自多个 Dock-compose 文件的映像构建过程。也许它就在那里,但后来我错过了。

我的另一个问题,即问题是:我将图像 tar(.gz) 文件放在目标服务器上的什么位置。

我可以在 /etc/docker/daemon.json 或其他配置文件中指定图像的目标位置吗?

我只是不知道将图像文件转储到生产服务器的何处。

同样,也许 docker 网站上有一些文档。但如果是这样,那我也错过了。

附录源文件

我被要求添加我的 docker-compose 文件以提供一个运行示例。所以,这里是开发和生产环境的完整代码。

为了简单起见,我让这个例子非常基础:

Dockerfile.base

# joint settings for development, production and staging
FROM mariadb:10.3

Dockerfile.production

# syntax = edrevo/dockerfile-plus
INCLUDE+ Dockerfile.base
# add more production specific settings when needed

Dockerfile.development

# syntax = edrevo/dockerfile-plus
INCLUDE+ Dockerfile.base
# add more production specific settings when needed

docker-compose.base.yml

version: "3.8"

services:
  mariadb:
    container_name: my_mariadb
    build:
      context: .
    volumes:
      - ./../../databases/mysql-my:/var/lib/mysql
      - ~/.ssh:/root/.ssh
    logging:
      driver: local
      ports:
        - "3306:3306"
    restart: on-failure
    networks:
      - backend
networks:
  backend:
    driver: $DOCKER_NETWORKS_DRIVER

docker-compose.production.yml

services:
  mariadb:
    build:
      dockerfile: Dockerfile.production
    environment:
      PRODUCTION: "true"
      DEBUG: "true"
      MYSQL_ROOT_PASSWORD: $DBPASSWORD_PRODUCTION
      MYSQL_DATABASE: $DBNAME_PRODUCTION
      MYSQL_USER: $DBUSER_PRODUCTION
      MYSQL_PASSWORD: $DBPASSWORD_PRODUCTION

docker-compose.development.yml

services:
  mariadb:
    build:
      dockerfile: Dockerfile.development
    environment:
      DEVELOPMENT: "true"
      INFO: "true"
      MYSQL_ROOT_PASSWORD: $DBPASSWORD_DEVELOPMENT
      MYSQL_DATABASE: $DBNAME_DEVELOPMENT
      MYSQL_USER: $DBUSER_DEVELOPMENT
      MYSQL_PASSWORD: $DBPASSWORD_DEVELOPMENT

运行时在我的开发机器上正常启动:

docker-compose -f docker-compose.base.yml \
     -f docker-compose.development.yml \
     up

但是我如何从这里到那里,即我怎样才能把它变成我可以上传到我的 docker 生产主机的自包含图像?

我应该把它放在服务器的什么地方,以便 docker 生产服务器可以找到它?

我认为我应该能够上传和运行构建的映像而无需在生产主机上再次运行 compose,或者我不应该吗?

就目前而言,问题仍然存在:

为什么这个构建命令

docker-compose -f docker-compose.base.yml \
    -f docker-compose.production.yml \
    build app

return ERROR: No such service: app?

1 个答案:

答案 0 :(得分:0)

我在您的问题中看到两个不同的问题:

如何将镜像部署到生产服务器

要在生产服务器上“部署”/启动一个新映像,它需要使用 docker pull 从使用 docker push 上传的注册表下载 - 即您需要 可从生产服务器和您的构建环境访问的注册表。

如果您不想使用注册表(公共或私有),您可以使用 docker export 将图像导出为 tar-ball,您可以手动将其上传到生产服务器并使用 { {3}}。

检查 docker import 以查看您的主机上是否有特定图像可用。

但在您的情况下,我认为将您的 docker-compose.yml 和相关文件上传到生产服务器并直接在那里构建图像是最简单的。


为什么这个构建命令返回ERROR: No such service: app

docker-compose -f docker-compose.base.yml \
    -f docker-compose.production.yml \
    build app

因为没有服务app!至少在您在问题中提供的文件中,只定义了 mariadb 服务,没有定义 app 服务。

但是在本地开发主机和生产服务器上启动/构建服务应该是相同的。

相关问题