docker とは
docker とは、OS やインストールしているパッケージなどを指定した環境(=コンテナ)で特定のコマンドを実行した結果を再現するものです。
例えば、以下の場合は「CentOS の環境」で「ls コマンドを実行」した結果を再現します。
- 指定した環境:CentOS ディストリビューション
- 実行するコマンド:ls
以下の場合は「nginx(Web サーバー)をインストールした環境」で「/usr/sbin/nginx -g 'daemon off;' コマンドを実行」した結果を再現します。
つまり Docker は Web サーバーとして振る舞います。
- 指定した環境:nginx をインストールし、systemctl enable nginx.service を設定
- 実行するコマンド:/usr/sbin/nginx -g 'daemon off;'
利点
パッケージの競合を回避
以下のような依存関係がある場合、どちらかのパッケージがインストールできません。
- パッケージ A ではソフトウェアのバージョン 1.0 以下が必要
- パッケージ B ではソフトウェアのバージョン 2.0 以上が必要
しかし docker では、OS やインストールしているパッケージなどを指定した環境(=コンテナ)を分けることでパッケージの競合を回避可能です。
環境に依存しない
OS やインストールしているパッケージを指定できるため、現在利用している OS やインストール済みのパッケージに依存しません。
そのため、A さんのコンピュータだと動くが、 B さんのコンピュータだと動かない。といったことが回避できます。
環境の移行が簡単
Docker では OS やインストールしているパッケージなどを指定した環境(=コンテナ)と実行するコマンドを、Dockerfile と呼ばれるファイル形式で保存することができます。
そのため、Dockerfile を渡すだけで他のコンピュータに環境を移行することができます。
docker インストール
docker を利用するために、まずはインストールをします。
Amazon Linux2 の場合:インストール
Amazon Linux2 以外の OS の場合:インストール
Docker サービスの自動起動を有効化
Docker コマンドを sudo 無しで実行する設定
赤線部分は docker コマンドを実行するユーザー名に変更してください。
Docker がインストールできていることを確認
Docker version 19.03.13-ce, build 4484c46
docker の使い方
docker イメージを確認
docker コンテナは、docker イメージと呼ばれるものから作成します。
リポジトリから docker イメージを取得する方法は以下のとおりです。
docker pull <コンテナリポジトリ>:<コンテナタグ>
リポジトリから CentOS8 の docker イメージを取得する方法は以下のとおりです。
REPOSITORY TAG IMAGE ID CREATED SIZE centos centos8 300e315adb2f 4 weeks ago 209MB
docker コンテナでコマンドを実行
docker run <コンテナリポジトリ>:<コンテナタグ> <実行するコマンド>
bin dev etc home lib (中略) var
ls コマンドが実行できたことがわかります。
docker コンテナを確認
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ff53e74d2aec centos:centos8 "ls" 3 minutes ago Exited (0) 3 minutes ago upbeat_bardeen
ls コマンドを実行して停止(Exited)したコンテナを確認できます。
停止している docker コンテナを削除
docker コンテナが停止すると自動でコンテナを削除する
停止したコンテナを毎回削除するのは手間なので、停止したコンテナは自動で削除するように docker run コマンドのオプションに --rm を付与します。
bin dev etc home lib (中略) var
停止したコンテナが削除されていることが確認できます。
docker コンテナの中に入る
bash コマンドの標準入力と標準出力をホスト OS にすることで docker コンテナに入ったかのように操作できます。
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
docker コンテナをバックグラウンドで起動
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 03e96e9e13a8 centos:centos8 "bash" 55 seconds ago Up 54 seconds nifty_kilby
実行中の docker コンテナでコマンドを実行(コンテナの中に入る)
docker コンテナのポートへ外部からアクセス可能な状態にする
80 ポートでリッスンしている Nginx の docker イメージを利用して、docker コンテナ外部から 8080 ポートでアクセスしてみます。
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title>
無事、nginx にアクセスできたことが確認できました。
Dockerfile: docker イメージを作成
Dockerfile は ベースとなる Docker イメージから、新しい Docker イメージを作成するために利用します。
docker run *** で環境を構築しても良いですが、毎回同じコマンドを実行する場合は Dockerfile に命令を書いてしまいましょう。
Dockerfile で利用可能な命令一覧
Dockerfile で利用可能な命令の一覧は以下のとおりです。
- FROM: ベースイメージを設定
- RUN: ベースイメージで実行するコマンドを指定(新しいDocker イメージの作成)
- CMD: コンテナの実行時のデフォルトで実行するコマンドを設定
- LABEL: イメージにメタデータを追加
- EXPOSE: コンテナ実行時にリッスンするポートを指定
- ENV: 環境変数を設定
- ADD: ローカルホストからイメージへファイルを追加
- COPY: ローカルホストからイメージへファイルをコピー
- ENTRYPOINT: コンテナを実行モジュールとして実行するように設定
- VOLUME: マウントポイントを生成
- USER: RUN, CMD, ENTRYPOINT を実行するユーザーを指定
- WORKDIR: ワークディレクトリを指定
- ARG: ビルド時の引数を指定
- ONBUILD: イメージに対してトリガーを追加
- STOPSIGNAL: コンテナが終了する時に送信するシステムコールシグナルを追加
- HEALTHCHECK: コンテナのヘルスチェック方法を指定
- SHELL: デフォルトのシェルを指定
ADD と COPY の違い
基本的に COPY を使っておきましょう。COPY でやりたいことが出来ない場合は ADD の利用を検討します。
Although
https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#add-or-copyADD
andCOPY
are functionally similar, generally speaking,COPY
is preferred. That’s because it’s more transparent thanADD
.COPY
only supports the basic copying of local files into the container, whileADD
has some features (like local-only tar extraction and remote URL support) that are not immediately obvious. Consequently, the best use forADD
is local tar file auto-extraction into the image, as inADD rootfs.tar.xz /
.
CMD と ENTRYPOINT の違い
CMD | ENTRYPOINT | |
---|---|---|
目的 | コンテナ実行時のデフォルトのプロセスを指定 | コンテナ実行時のプロセスを固定 |
docker run <プロセス> | プロセスを指定可能 デフォルトでは、CMD で指定したプロセスが起動 | プロセスを指定不可能 固定で、ENTRYPOINT で指定したプロセスが起動 |
例:Dockerfile で nginx の docker イメージを作成
Dockerfile を理解するために、CentOS8 の docker image から以下のような nginx の docker image を作成してみます。

Dockerfile を作成
FROM centos:centos8 RUN yum install nginx -y EXPOSE 80 CMD /usr/sbin/nginx -g 'daemon off;'
Dockerfile から docker イメージを作成
Nginx の docker イメージから docker コンテナを作成し、アクセス
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <title>Test Page for the Nginx HTTP Server on Red Hat Enterprise Linux</title>
無事に Dockerfile から Nginx をインストールした docker イメージを作成可能なことを確認できました。
docker-compose:複数のコンテナを一気に起動
一般的には複数のコンテナを一気に起動するために利用します。
docker-compose で利用可能な命令一覧は以下のとおりです。
docker-compose をインストール
Linux 系で docker-compose をインストール
docker-compose version 1.16.1, build 6d1ac21
Linux 系以外で docker-compose をインストール
以下のドキュメントに従ってインストールしてください。
docker-compose で複数のコンテナを起動
先程自作した Nginx と、公式の Nginx の2つの docker イメージを利用して、2つのコンテナを起動する docker-compose を作成します。
docker-compose.yml ファイルの作成
version: '3' services: my_nginx: build: context: . dockerfile: Dockerfile ports: - "8080:80" official_nginx: image: nginx ports: - "8081:80"
docker-compose で複数コンテナを一括起動
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a2acd90e276f nginx "nginx -g 'daemon of…" 6 minutes ago Up 6 minutes 0.0.0.0:8081->80/tcp http_official_nginx_1 f7cc5a4d0c56 http_my_nginx "/bin/sh -c '/usr/sb…" 6 minutes ago Up 6 minutes 0.0.0.0:8080->80/tcp http_my_nginx_1
自作した Nginx と、公式の Nginx の2つのコンテナが起動していることが確認できます。
また、それぞれのコンテナにアクセス可能なことも確認できます。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <title>Test Page for the Nginx HTTP Server on Red Hat Enterprise Linux</title>
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title>
docker-compose でコンテナ群を一括終了
参考記事
公式ドキュメント
docker 日本語ドキュメント(有志による翻訳)
docker で検索すると一番上に出てくる Qiita の記事

コメント