[初心者向けシリーズ] Dockerに入門しコンテナを起動から停止するまでの方法を確認してみた
事業本部 Delivery 部のアベシです。
Docker初心者の私が、Dockerを使ってイメージをビルド〜コンテナを起動や停止するまでの基本的な流れを確認してみました。
今まで何気なく使っていた、CircleCIなどのCI/CDの実行環境やテスト用のツールなど様々なところでDockerが使われている事に気づいて学び始めました。
そこで今回はそもそもDockerとは?の部分と実際に使う方法をブログに残したいと思います。
Dockerとは?
Dockerは、「コンテナ」という仮想化技術を使用しています。
VM Wareなどの仮想化技術では仮想化ソフトウェアの上でゲストOSを起動し、プロセスはこのOSを使いますが、コンテナではホストOS自体のカーネルを使用します。
そのため、ゲストOSのインストールが必要なく環境の立ち上げを数秒で完了でき、素早い開発が可能になります。
ゲストOSを使う仮想化ではホストOS以外に別のOSも動かすのでプロセッサの能力やメモリの消費量もコンテナに比べて大きいです。
また、Dockerファイルからコンテナの「イメージ」を作成して、共有する事で別のローカルマシン上に簡単に素早く同一の仮想環境を構築できます。
Dockerを使うと何が良いのか?
例えばチーム開発しているプロジェクトのテストを想定して考えると、 全員が同じ環境でテストすれば環境差によってテストが動かないとか結果に差異が出てしまう、といったことををなくすことができるでしょう。 そこにDockerを使えば数行のDockerファイルから作ったイメージと、いくつかのコマンドで簡単に素早く共通の仮想環境(Dockerコンテナ)を作れます。 コンテナを削除すれば作成したテスト用の仮想環境は直ちに破棄できます。
Dockerの登場以前はOS仮想化使った環境の上でOSをセットアップして必要なソフトウェアのインストールなどの作業を逐一やって行くという方法がありましたが、これらの手間を考えるとDockerが如何に便利なツールなのかが想像できます。
やることの内容
ちょうどCircleCIで使用するDockerイメージの動作検証したかったため、このイメージを使ってコンテナを起動〜停止までの一連の作業をやりつつ、立ち上げたコンテナに対してコマンドの実行を試していきたいと思います。
前提
まずは前提としてDockerのインストール必要です。 Dockerのインストール方法は以下の公式サイトを参考にしてください。
実行環境
私のローカル環境は以下の通りです。
項目名 | バージョン |
---|---|
macOS | venture 13.2 |
Docker | 20.10.21-rd |
Dockerでコンテナ起動〜の停止までの流れの概要
まとめると以下のような流れになります。
- Dockerファイルを作成
- この中ファイル内に使用するDockerイメージを指定
- Dockerファイルを元にイメージを作成
- イメージを元にコンテナを起動
- コンテナのOSへコマンドを実行
- コンテナを停止
図にすると以下のようになります。
Dockerファイルを作成
Dockerファイルには、Dockerイメージに必要なイメージの指定やビルドの手順を記述します。 今回はシンプルに以下の内容を記載して起動したコンテナでコマンド実行できるかを確認します。
FROM cimg/node:18.15.0 WORKDIR /tmp CMD ["/bin/bash"]
各記述について
- FROM
- Docket Hubからpullしてくるベースなるイメージの指定を行います。
今回は動作検証したかった
cimg/node:18.15.0
を指定しています。 因みに今回使用したCircleCI用のイメージのOSはUbuntuとなります。
- Docket Hubからpullしてくるベースなるイメージの指定を行います。
今回は動作検証したかった
- WORKDIR
- コンテナ起動後の作業ディレクトリを指定します。
- CMD
- CMDに記述した内容はコンテナを起動させた時に実行されます。
今回はbashを使ってコンテナのOSに対してコマンドで命令したいので
/bin/bash
を指定しています。
- CMDに記述した内容はコンテナを起動させた時に実行されます。
今回はbashを使ってコンテナのOSに対してコマンドで命令したいので
Dockerファイルの記法については以下のページにわかりやすくまとまっていますので参考にしてください。
Dockerファイルを元にイメージを作成
以下のコマンドでDockerファイルを元にイメージを作成します。
$ docker build . -t sample-circleci-image:latest
オプションについて
- -t
- イメージに名前とタグをつけるオプションです。
-t <イメージ名>:<タグ>
今回はsample-circleci-image
という名前とlatest
という名前のタグをつけています。
以下のメッセージが出力されればイメージのビルドが成功です。
Successfully built 7bc177e2e863 Successfully tagged sample-circleci-image:latest
イメージの確認
以下のコマンドでイメージが作成されていることを確認できます。
$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE sample-circleci-image latest 7bc177e2e863 35 minutes ago 1.29GB
buildしたイメージのID7bc177e2e863
が出力されました。
イメージを元にコンテナを起動
作成したイメージを元にコンテナを起動します。 以下のコマンドの-itオプションの後にイメージのIDを指定します。
$ docker run -it 7bc177e2e863 circleci@c811470b0fd6:/tmp$
Dockerファイルに指定したtmpディレクトリに移動していることが確認できます。 また、プロンプトが表示されコマンドが入力できる状態になっています。
コマンドを実行
コンテナのOSへコマンドを実行を試してみます。 AWS CLIをpipコマンドでインストールできるか試してみました。
準備
素の状態ではまだubuntuのパッケージが空の状態なので更新します。
$ sudo apt-get -y update
モジュールのインストール
続いてpython3のインストールを行います。
$ sudo apt-get install -y python3-pip
続いてインストール可否を検証したかったAWS CLIのインストールを試します。
$ sudo pip install awscli==1.16.158 Successfully installed PyYAML-3.13 awscli-1.16.158 botocore-1.12.148 colorama-0.3.9 docutils-0.19 jmespath-0.10.0 pyasn1-0.4.8 python-dateutil-2.8.2 rsa-3.4.2 s3transfer-0.2.1 urllib3-1.24.3
正常にインストールできました。
コンテナの停止
コンテナの停止はexitで可能です。
circleci@c811470b0fd6:/tmp$ exit exit
念の為コンテナが停止しているか確認します。
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
先程起動したコンテナが表示されませんので停止していることが確認できました。
イメージの削除
作成したイメージが不要な場合は以下のコマンドでイメージを削除できます。
$ docker image rm 7bc177e2e863 Untagged: sample-circleci-image:latest Deleted: sha256:7bc177e2e863e7a41be085f46c537b5bfee679a884211126626cd14cfc94e5ea
削除したイメージの名前とIDが出力されました。 以下コマンドでイメージを確認してみます。削除したイメージの名前とIDが出力されなければ間違いなくイメージが削除されています。
$ docker image ls