Docker 仅数据容器并处理新版本

标签 docker production-environment dockerfile docker-compose

我一直在研究围绕 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 构建的镜像:

FROM busybox
COPY . /app

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

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

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

最佳答案

Now this setup works but I just can't figure out how to handle a new release. My source is in git, when I want to deploy to production I imagine I create a new image (FROM busybox should probably be replaced with my existing image url) and pull in the new image on my production server.

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

But how do I get the data to update for my web container and such? I also have to make sure my persistent data (/var/lib/mysql) remains.

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

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

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

关于Docker 仅数据容器并处理新版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29462058/

相关文章:

docker - 为什么我可以从私有(private) repo 中提取图像,但不能使用它创建 kubernetes 部署?

php - pecl 在生产服务器上安装扩展问题

javascript - 根据托管的 URL 加载特定的 JS 文件

docker - 如何使用 Ansible 启动 Docker 容器

bash - 在 $PATH Dockerfile 中找不到可执行文件

python - Dockerfile - 不能使用 'app.py' 以外的其他名称

postgresql - 使用 Flask 将 Docker 容器连接到 App Engine 中的 PostgreSQL 时出现问题

docker - Gitlab CI 服务和 docker hub 身份验证

spring - 带有 spring boot 的 Redis 缓存 docker 容器在我的本地机器上不工作

python - flask 生产发展模式