【入門】docker とは?コマンドや dockerfile の使い方

Docker
スポンサーリンク

docker とは

docker とは、指定した OS やソフトウェアを持つ環境(=コンテナ)で、指定したコマンドの実行結果を再現するソフトウェアです。

例1:「CentOS の環境」で「ls コマンドを実行」

例えば、「CentOS の環境」で「ls コマンドを実行」した結果を再現可能です。

  • 指定した環境:CentOS ディストリビューション
  • 指定したコマンド:ls

例2: nginx(Web サーバー)を実行

例えば、「nginx をインストールした環境」で「/usr/sbin/nginx -g 'daemon off;' コマンドを実行」した結果を再現可能です。

  • 指定した環境:nginx をインストールし、systemctl enable nginx.service を設定
  • 指定したコマンド:/usr/sbin/nginx -g 'daemon off;'

つまり Docker は Web サーバーとして振る舞います。

利点

パッケージの競合を回避

以下のような依存関係がある場合、どちらかのパッケージがインストールできません。

  • パッケージ A ではソフトウェアのバージョン 1.0 以下が必要
  • パッケージ B ではソフトウェアのバージョン 2.0 以上が必要

しかし docker では、OS やインストールしているパッケージなどを指定した環境(=コンテナ)を分けることでパッケージの競合を回避可能です。

環境に依存しない

OS やインストールしているパッケージを指定できるため、現在利用している OS やインストール済みのパッケージに依存しません。

そのため、A さんのコンピュータだと動くが、 B さんのコンピュータだと動かない。といったことが回避できます。

環境の移行が容易

Docker では OS やインストールしているパッケージなどを指定した環境(=コンテナ)と実行するコマンドを、Dockerfile と呼ばれるファイル形式で保存することができます。

そのため、Dockerfile を渡すだけで他のコンピュータに環境を移行することができます。

スポンサーリンク

docker をインストール

docker を利用するために、まずはインストールをします。

  1. docker をインストール
    1. sudo amazon-linux-extras install docker
    2. Install Docker Engine
      Lists the installation methods
  2. sudo systemctl start docker
  3. docker --version
    Docker version 19.03.13-ce, build 4484c46
  4. sudo usermod -a -G docker `whoami`
    exit
スポンサーリンク

docker の使い方

docker イメージの取得

docker コンテナは、docker イメージと呼ばれるものから作成します。

リポジトリから docker イメージを取得する方法は以下のとおりです。

docker pull <コンテナリポジトリ>:<コンテナタグ>

例えば、リポジトリから CentOS8 の docker イメージを取得する場合は以下のコマンドとなります。

docker pull centos:centos8

docker イメージの一覧

docker イメージの一覧を表示します。

docker images
REPOSITORY                            TAG                 IMAGE ID            CREATED             SIZE
centos                                centos8             300e315adb2f        4 weeks ago         209MB

docker コンテナを起動しコマンドを実行

docker run <コンテナリポジトリ>:<コンテナタグ> <実行するコマンド>
docker run centos:centos8 ls
bin
dev
etc
home
lib
(中略)
var

ls コマンドが実行できたことがわかります。

docker コンテナの一覧

docker ps -a
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 rm <CONTAINER ID>

docker コンテナが停止すると自動でコンテナを削除する

停止したコンテナを毎回削除するのは手間なので、停止したコンテナは自動で削除するように docker run コマンドのオプションに --rm を付与します。

docker run --rm centos:centos8 ls
bin
dev
etc
home
lib
(中略)
var
docker ps -a

停止したコンテナが削除されていることが確認できます。

docker コンテナの中に入る

bash コマンドの標準入力と標準出力をホスト OS にすることで docker コンテナに入ったかのように操作できます。

docker run --rm -it centos:centos8 bash
ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
exit

docker コンテナを起動(バックグラウンド)

docker run --rm -dit centos:centos8 bash
docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
03e96e9e13a8        centos:centos8      "bash"              55 seconds ago      Up 54 seconds                           nifty_kilby

docker コンテナの実行プロセスを表示

docker container top <CONTAINER ID>
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                5564                5521                0                   12:18               pts/0               00:00:00            bash

実行中の docker コンテナでコマンドを実行(コンテナの中に入る)

docker exec で docker コンテナで任意のコマンドを実行可能です。

bash コマンドを実行すると、docker コンテナの中に入ったかのように操作できます。

docker exec -it <CONTAINER ID> bash

docker コンテナのポートへ外部からアクセス可能な状態にする

80 ポートでリッスンしている Nginx の docker イメージを利用して、docker コンテナ外部から 8080 ポートでアクセスしてみます。

docker run --rm -d -p 8080:80 nginx
curl localhost: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 ADD and COPY are functionally similar, generally speaking, COPY is preferred. That’s because it’s more transparent than ADD. COPY only supports the basic copying of local files into the container, while ADD has some features (like local-only tar extraction and remote URL support) that are not immediately obvious. Consequently, the best use for ADD is local tar file auto-extraction into the image, as in ADD rootfs.tar.xz /.

https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#add-or-copy

CMD と ENTRYPOINT の違い

CMDENTRYPOINT
目的コンテナ実行時のデフォルトのプロセスを指定コンテナ実行時のプロセスを固定
docker run <プロセス>プロセスを指定可能
デフォルトでは、CMD で指定したプロセスが起動
プロセスを指定不可能
固定で、ENTRYPOINT で指定したプロセスが起動

例:Dockerfile で nginx の docker イメージを作成

Dockerfile を理解するために、CentOS8 の docker image から以下のような nginx の docker image を作成してみます。

nginx の docker イメージ

Dockerfile を作成

vim Dockerfile
FROM centos:centos8
RUN yum install nginx -y

EXPOSE 80
CMD /usr/sbin/nginx -g 'daemon off;'

Dockerfile から docker イメージを作成

docker build -t test:1.0 -f Dockerfile .

Nginx の docker イメージから docker コンテナを作成し、アクセス

docker run --rm -d -p 8080:80 test:1.0
curl localhost:8080
<!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 で利用可能な命令一覧は以下のとおりです。

Compose ファイル・リファレンス — Docker-docs-ja 19.03 ドキュメント

docker-compose をインストール

Linux 系で docker-compose をインストール

sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
docker-compose version 1.16.1, build 6d1ac21

Linux 系以外で docker-compose をインストール

以下のドキュメントに従ってインストールしてください。

Docker Compose のインストール — Docker-docs-ja 19.03 ドキュメント

docker-compose で複数のコンテナを起動

先程自作した Nginx と、公式の Nginx の2つの docker イメージを利用して、2つのコンテナを起動する docker-compose を作成します。

docker-compose.yml ファイルの作成

vim docker-compose.yml
version: '3'

services:
  my_nginx:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8080:80"
 
  official_nginx:
    image: nginx
    ports:
      - "8081:80"

docker-compose で複数コンテナを一括起動

docker-compose up -d
docker ps -a
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つのコンテナが起動していることが確認できます。

また、それぞれのコンテナにアクセス可能なことも確認できます。

curl localhost:8080
<!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>
curl localhost:8081
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>

docker-compose でコンテナ群を一括終了

docker-compose down
docker ps -a

参考記事

公式ドキュメント

Docker Documentation
Home page for Docker's documentation

docker 日本語ドキュメント(有志による翻訳)

Docker ドキュメント日本語化プロジェクト — Docker-docs-ja 19.03 ドキュメント

docker で検索すると一番上に出てくる Qiita の記事

いまさらだけどDockerに入門したので分かりやすくまとめてみた - Qiita
はじめに 今更ながらDockerに入門したのでまとめます。 全てのコマンドの細かいオプションとかまではやりません。 Dockerコマンド体系はv1.13以降の新系です。 ここではクラスタ管理(KubernetesやSwarm)に...
0

コメント