BFT名古屋 TECH BLOG

日々の業務で得た知識を所属するエンジニアたちがアウトプットしていきます。

【GCP・Container Registry】コンテナイメージを更新する(docker commitからdocker push, docker pullまで)

はじめに


こんにちは!
株式会社BFT名古屋支店・インフラ女子(?)のやまぐちです。

コンテナ上で開発していると、パッケージを更新したり、ディレクトリを作成したり、コンテナ上の環境を変更することは日常茶飯事です。仕様がきちっと決まっていない設計・構築段階だとその機会もたくさんあるので、Dockerfileを変更するのではなく、イメージ自体を更新したくなってきますね!

今回はコンテナイメージの更新から、リポジトリへのpush、メンバーがpullして新しいコンテナイメージで起動するまでの一連の流れをブログに残していきたいと思います。

ただし、基本いろいろ追加してイメージを作ると容量がどんどん大きくなっていき、軽量であるというコンテナの利点が損なわれます。基本はDockerfileへの変更でよいと思います。

コンテナイメージを更新する(docker commitからdocker push, docker pullまで)


今の状態のコンテナをイメージとして保存する

コンテナで行った変更を保存するには、新しいイメージを作成します。

まずはコンテナが起動している状態で別のコマンドプロンプトを起動し、「docker ps」コマンドで起動しているコンテナを確認します。

C:\Users\a-yam>docker ps
CONTAINER ID   IMAGE                                                COMMAND                  CREATED        STATUS       PORTS     NAMES
aa5b4646662b   centos:centos7                                       "/bin/bash"              4 hours ago    Up 4 hours             gallant_wing

4時間前に起動したコンテナが表示されています。
イメージを作成する際にコンテナIDを指定するため、一番最初の列「CONTAINER ID」をコピーしておきます。実行するコマンドは以下の通りです。

docker commit <コンテナID> <REPOSITORY>:<TAG>

リポジトリやタグは任意ですが、今保存されているイメージを確認してから決めるとよいでしょう。「docker images」コマンドを実行します。

C:\Users\a-yam>docker images
REPOSITORY                                           TAG       IMAGE ID       CREATED         SIZE
centos                                               centos7   eeb6ee3f44bd   17 months ago   204MB

今あるイメージはcentosリポジトリのcentos7タグが付いています。 今回はAnsible用のイメージを作成したのでリポジトリをansible、タグを0.1として、以下の「docker commit」コマンドを実行します。

docker commit aa5b4646662b  ansiblesv:0.1

プロンプトが返ってきたらdocker imagesコマンドを再度実行して指定のイメージが作成されているか確認しましょう。元が204MBなのに7GB超えてて引きますね…。

C:\Users\a-yam>docker images
REPOSITORY                                           TAG       IMAGE ID       CREATED         SIZE
ansiblesv                                            0.1       d6e7d1b35ef5   3 minutes ago   7.22GB
centos                                               centos7   eeb6ee3f44bd   17 months ago   204MB

またちゃんと想定の状態になっているのかを作成したイメージからコンテナを起動して確認してみてもよいかと思います。root@~になっており、rootでログインしていることがわかります。

C:\Users\a-yam>docker container run -it ansiblesv:0.1
[root@458bf77342fe /]#

dockerのコンテナ上で「exit」コマンドを実行するとコンテナが停止します。または「docker stop」コマンドでコンテナIDを指定して停止できます。

C:\Users\a-yam>docker container stop 458bf77342fe
458bf77342fe

C:\Users\a-yam>
C:\Users\a-yam>docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

C:\Users\a-yam>

リポジトリへpushする

コンテナは、GCP上のContainer Registryで管理しているため、その想定で記載します。AWSやその他のリポジトリの場合は適宜読み替えてください。

まずは「gcloud auth login」コマンドを実行し、表示されるブラウザからボタンポチで認証します。この認証は2時間が期限です。必要に応じて実行し直してください。

gcloud auth login

Container RegistryへのpushコマンドはGCP上から確認できます。初回の場合は「docker tag」コマンドでタグ付けを行います。タグ付け後、docker imagesコマンドを実行すると、新しくイメージが登録されていることがわかります。

C:\Users\a-yam>docker tag ansiblesv:0.1 asia.gcr.io/<プロジェクトID>/ansiblesv:0.1

C:\Users\a-yam>
C:\Users\a-yam>docker images
REPOSITORY                                           TAG       IMAGE ID       CREATED          SIZE
asia.gcr.io/<プロジェクトID>/ansiblesv                   0.1       d6e7d1b35ef5   23 minutes ago   7.22GB
ansiblesv                                            0.1       d6e7d1b35ef5   23 minutes ago   7.22GB
centos                                               centos7   eeb6ee3f44bd   17 months ago    204MB

それではGCPのContainer Registryへpushします。

C:\Users\a-yam> docker push asia.gcr.io/<プロジェクトID>/ansiblesv:0.1
The push refers to repository [asia.gcr.io/<プロジェクトID>/ansiblesv]
8b02b6fc68a8: Pushed
174f56854903: Layer already exists
0.1: digest: sha256:XXXXX size: 743

GCPのContainer Registryでもpushされたイメージを確認できました。

他の人がコンテナイメージを更新する

この手順では、既にプロジェクトのメンバーが使っている配布済みのイメージを更新する、というケースを想定しています。そのため、イメージをContianer Registryからpullすること、Dockerfileを修正することの2つの手順が必要です。

新しいイメージをpullする

こちらも最初にGCPの認証が必要です。

gcloud auth login

認証できたらpullコマンドを実行します。今回はアジアのデータセンターにpushしたので「asia.gcr.io」ですが、ここはpushで指定した場所により「gcr.io(米国)」とか「eu.gcr.io(欧州連合)」などと変わります。pullコマンドを実行する際は、pushした人にパスを教えてもらうようにしましょう。

docker images
docker pull asia.gcr.io/<プロジェクトID>/ansiblesv:0.1
docker images
Dockerfileを修正する

コンテナの起動に使用しているDockerfileを修正します。
FROMの後にdocker imagesコマンドで表示される、リポジトリ:タグで起動するイメージを指定します。

FROM asia.gcr.io/<プロジェクトID>/ansiblesv:0.1

USER ansibleuser
WORKDIR /home/ansibleuser/
VSCodeから起動する

普段VSCodeからコンテナを起動、接続しているので、その手順を記載します。必要なアドオンは以下の記事を参考にしてください。

bftnagoya.hateblo.jp

  1. 左下の「><」を押して、画面上の「Open Folder in Container...」を選択します。

  2. 「.devcontainer」フォルダのあるディレクトリを選択します。

  3. リビルドしますか?と表示されたら「Rebuild」を押します。

  4. 接続完了して画面が表示されるのを確認してください。

終わりに


今回はイメージを更新する人も、更新されたイメージをpullする人も手動でDockerfileを変更する手順を記載しました。Dockerfile自体をリポジトリで管理してしまえば、更新されたイメージをpullする側は手動で変更しなくてもすみます。

このdocker commitからdocker push、docker pullの流れを実施するとコンテナの一連の流れがわかってとても楽しいですよね。コンテナを理解し、より快適な開発ライフを送れるようになりたいと思います。

以上、ここまで読んでいただきありがとうございました~ ^ ^