[初心者向けシリーズ] Dockerに入門しコンテナを起動から停止するまでの方法を確認してみた

2023.04.18

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

事業本部 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イメージに必要なイメージの指定やビルドの手順を記述します。 今回はシンプルに以下の内容を記載して起動したコンテナでコマンド実行できるかを確認します。

Dockerfile

FROM cimg/node:18.15.0
WORKDIR /tmp
CMD ["/bin/bash"]

各記述について

  • FROM
    • Docket Hubからpullしてくるベースなるイメージの指定を行います。 今回は動作検証したかったcimg/node:18.15.0を指定しています。 因みに今回使用したCircleCI用のイメージのOSはUbuntuとなります。
  • WORKDIR
    • コンテナ起動後の作業ディレクトリを指定します。
  • CMD
    • CMDに記述した内容はコンテナを起動させた時に実行されます。 今回はbashを使ってコンテナのOSに対してコマンドで命令したいので/bin/bashを指定しています。

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

以上。