Docker数据专用容器,处理新版本

我一直在研究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 

您看到的<censored-url>是使用此Dockerfile构build的图像:

 FROM busybox COPY . /app 

现在这个设置工作,但我只是不知道如何处理新版本。 我的源代码是在git中,当我想要部署到生产环境时,我想我会创build一个新的映像(可能应该从busybox中replace为我现有的映像url),然后在生产服务器上插入新映像。

但是,如何获取数据更新为我的Web容器等? 我还必须确保我的持久数据(/ var / lib / mysql)保持不变。

我希望这个问题很明确,如果有必要,我会很乐意澄清的。

现在这个设置工作,但我只是不知道如何处理新版本。 我的源代码是在git中,当我想要部署到生产环境时,我想我会创build一个新的映像(可能应该从busybox中replace为我现有的映像url),然后在生产服务器上插入新映像。

除了关于busybox(我不遵循)的说法,这似乎是非常正确的。 通常情况下,您重新构build映像,推送到registry,然后从生产服务器拉。 正如@Mario Marin所build议的那样,标签是值得的,因为如果需要的话,您可以轻松地回滚,而且您确切地知道应用的哪个版本部署完毕。

但是,如何获取数据更新为我的Web容器等? 我还必须确保我的持久数据(/ var / lib / mysql)保持不变。

我认为这是指您的数据容器,这是你以不寻常的方式完成的。 首先,我将取出mysql目录并将其放入自己的数据容器中。 我将使用percona图像,以便所有的权限设置正确。 当您创build数据容器时,不要让它运行,所以不必担心容器过期; 它实际上只是目录的命名空间。

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

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

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

 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 

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

 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" } 

该脚本将构build服务网站并将其推送到docker中心。 您可以省略推送,只需标记图像。

您可以使用git散列,而不是为您的发行版使用时间戳:

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