2

私は Docker に関する多くのプラクティスを研究してきましたが、かなりの成果を上げています。しかし、私を困惑させ続けていることが 1 つあります。それは、データのみのコンテナーを操作することです。

これが私の現在のセットアップの簡単な概要です。

# 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) が残っていることも確認する必要があります。

質問が明確であることを願っています。必要に応じて喜んで明確にします。

4

2 に答える 2

2

現在、このセットアップは機能していますが、新しいリリースを処理する方法がわかりません。ソースは git にあります。本番環境にデプロイする場合は、新しいイメージを作成し (FROM busybox はおそらく既存のイメージ URL に置き換える必要があります)、新しいイメージを本番サーバーに取り込みます。

busybox に関する声明 (私は従いません) を除けば、それはかなり正しいようです。通常、イメージを再構築し、レジストリにプッシュしてから、運用サーバーからプルします。そして、@Mario Marin が示唆するように、必要に応じて簡単にロールバックでき、デプロイされているアプリのバージョンを正確に把握できるように、タグについて賢くする価値があります。

しかし、Web コンテナーなどのデータを更新するにはどうすればよいでしょうか? また、永続データ (/var/lib/mysql) が残っていることも確認する必要があります。

これは、少し変わった方法で行ったデータ コンテナーを参照していると思います。まず、mysql ディレクトリを取り出して、独自のデータ コンテナーに配置します。これには percona イメージを使用して、すべての権限が正しく設定されるようにします。データ コンテナーを作成すると、それを実行したままにしないので、コンテナーが古くなることを心配する必要はありません。これは、ディレクトリの名前空間にすぎません。

次のステップは、アプリ ディレクトリを処理することです。これは、データではなくコードであると思いますか? この場合、Web イメージに含めます (ボリュームはまったく使用しないでください)。Dockerfile では、通常、イメージを最新の状態に保つために git clone を実行します。開発中に、ホストからのコードを使用してアプリ ディレクトリの上部にボリュームをマウントできるため、変更をすぐに行うことができます。

データ コンテナーの詳細については、http://container42.com/2014/11/18/data-only-container-madness/をご覧ください。

于 2015-04-06T09:27:49.197 に答える
1

データ コンテナーからディレクトリを削除し/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

さまざまなリリースにタグを使用できます。これは、デプロイで使用するスクリプトです。

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 ハブにプッシュします。プッシュを省略して、画像にタグを付けるだけです。

リリースにタイムスタンプを使用する代わりに、git ハッシュを使用できます。

IMAGE_TAG=$(git rev-parse --short HEAD)
于 2015-04-05T23:29:08.113 に答える