はじめに
こんにちは!
株式会社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からコンテナを起動、接続しているので、その手順を記載します。必要なアドオンは以下の記事を参考にしてください。
左下の「><」を押して、画面上の「Open Folder in Container...」を選択します。
「.devcontainer」フォルダのあるディレクトリを選択します。
リビルドしますか?と表示されたら「Rebuild」を押します。
接続完了して画面が表示されるのを確認してください。
終わりに
今回はイメージを更新する人も、更新されたイメージをpullする人も手動でDockerfileを変更する手順を記載しました。Dockerfile自体をリポジトリで管理してしまえば、更新されたイメージをpullする側は手動で変更しなくてもすみます。
このdocker commitからdocker push、docker pullの流れを実施するとコンテナの一連の流れがわかってとても楽しいですよね。コンテナを理解し、より快適な開発ライフを送れるようになりたいと思います。
以上、ここまで読んでいただきありがとうございました~ ^ ^