【问题标题】:Docker data-only container and dealing with new releasesDocker 纯数据容器和处理新版本
【发布时间】:2015-04-05 20:49:18
【问题描述】:

我围绕 Docker 研究了很多实践,并且已经取得了很大进展。 但是有一件事情一直困扰着我,那就是使用纯数据容器。

以下是我当前设置的简要概述:

# nginx
web:
  extends:
    file: _common.yml
    service: web
  ports:
    - "80:80"
  environment:
    APPLICATION_ENV: prod
  volumes_from:
    - data
  links:
    - db
    - redis

# php5-cli
app:
  extends:
    file: _common.yml
    service: app
  environment:
    APPLICATION_ENV: prod
  volumes_from:
    - data
  links:
    - db
    - redis

data:
  image: <censored-url>
  volumes:
    - "/var/lib/mysql"
    - "/app"

# percona
db:
  extends:
    file: _common.yml
    service: db
  volumes_from:
    - data

# redis
redis:
  extends:
    file: _common.yml
    service: redis

您看到的&lt;censored-url&gt; 是使用此 Dockerfile 构建的映像:

FROM busybox
COPY . /app

现在此设置有效,但我只是不知道如何处理新版本。 我的源代码在 git 中,当我想部署到生产环境时,我想我会创建一个新图像(FROM busybox 可能应该替换为我现有的图像 url)并在我的生产服务器上拉入新图像。

但是如何获取数据以更新我的 Web 容器等?我还必须确保我的持久数据(/var/lib/mysql)仍然存在。

我希望问题很清楚,我很乐意在必要时澄清。

【问题讨论】:

    标签: docker production-environment dockerfile docker-compose


    【解决方案1】:

    现在这个设置有效,但我就是不知道如何处理一个新的 释放。我的源代码在 git 中,当我想部署到生产环境时,我 想象一下我创建了一个新图像(可能应该替换 FROMbusybox 使用我现有的图片网址)并在我的作品中拉入新图片 服务器。

    除了关于busybox的声明(我没有遵循)之外,这似乎非常正确。通常,您重新构建映像,推送到注册表,然后从生产服务器中提取。正如@Mario Marin 所建议的那样,聪明地使用标签是值得的,这样您就可以在需要时轻松回滚,并且您可以确切地知道部署了您的应用程序的哪个版本。

    但是如何获取数据以更新我的 Web 容器等?我还必须确保我的持久数据(/var/lib/mysql)仍然存在。

    我假设这是指您的数据容器,您以一种不寻常的方式完成了它。首先,我会拉出 mysql 目录并将其放入自己的数据容器中。我会为此使用 percona 图像,以便正确设置所有权限。当您创建数据容器时,您不会让它运行,因此无需担心容器会过时;它实际上只是目录的命名空间。

    下一步是处理 app 目录,我假设它不是数据,而是代码?在这种情况下,我会将它包含在您的网络图像中(根本不使用卷)。在 Dockerfile 中,我通常会做一个 git clone 来保持图像是最新的。在开发过程中,您可以使用来自主机的代码在应用程序目录的顶部安装一个卷,以便您可以立即进行更改。

    有关数据容器的更多信息,请查看http://container42.com/2014/11/18/data-only-container-madness/

    【讨论】:

    • 感谢阿德里安·穆阿特!你已经回答了我所有的问题:)。
    【解决方案2】:

    我会从数据容器中删除 /app 目录并使用 docker-compose 构建它:

    web:
      build: .
      extends:
        file: _common.yml
        service: web
      ports:
        - "80:80"
      environment:
        APPLICATION_ENV: prod
      links:
        - db
        - redis
    
    app:
      extends:
        file: _common.yml
        service: app
      environment:
        APPLICATION_ENV: prod
      volumes_from:
        - data
      links:
        - db
        - redis
    
    data:
      volumes:
        - "/var/lib/mysql"
    
    db:
      extends:
        file: _common.yml
        service: db
      volumes_from:
        - data
    
    redis:
      extends:
        file: _common.yml
        service: redis
    

    Dockerfile

    FROM busybox
    
    ADD . /app
    
    WORKDIR /app
    

    您可以为不同的版本使用标签,here 是我在部署中使用的脚本

    DOCKER_HUB_USER="therightplace"
    DOCKER_COMPOSE_IMAGE="projectname_web_1"
    APP_IMAGE="nicer_name"
    REMOTE_IMAGE=${DOCKER_HUB_USER}/${APP_IMAGE}
    IMAGE_TAG=$(date -u +"%Y-%m-%dT%H:%M:%SZ" |sed 's/-\|:/_/g')
    TAGGED_IMAGE=${REMOTE_IMAGE}:${IMAGE_TAG}
    LATEST_IMAGE=${REMOTE_IMAGE}:latest
    
    build_image () {
        echo "Building image: ${TAGGED_IMAGE}"
        docker-compose build web
    }
    
    push_tagged_image () {
        echo ${TAGGED_IMAGE}
        # change docker-compose image tag for a nicer one
        docker tag ${DOCKER_COMPOSE_IMAGE} ${TAGGED_IMAGE}
        # push image out to docker hub
        docker push ${TAGGED_IMAGE} && echo "${TAGGED_IMAGE} image pushed to docker hub" \
        || echo "Failed to push ${TAGGED_IMAGE} image to docker hub"
    }
    
    push_latest_image () {
        echo ${LATEST_IMAGE}
        # push image out to docker hub
        docker tag ${TAGGED_IMAGE} ${LATEST_IMAGE}
        docker push ${LATEST_IMAGE} && echo "${LATEST_IMAGE} image pushed to docker hub" \
        || echo "Failed to push ${LATEST_IMAGE} image to docker hub"
    }
    

    该脚本将构建服务 web 并将其推送到 docker hub。您可以省略推送,只标记图像。

    您可以使用 git 哈希来代替使用时间戳:

    IMAGE_TAG=$(git rev-parse --short HEAD)
    

    【讨论】:

    • 感谢您的回答马里奥。我的“网络”服务实际上是我的网络服务器,所以您是否建议将我的项目文件和网络服务器捆绑在一个容器中?
    • @RickKuipers 不,您的网络服务器应该只有资产而不是整个项目,即:/var/www/public/assets。与应用容器中的卷共享此目录。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-23
    • 2022-01-07
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    相关资源
    最近更新 更多