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

Docker

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 の場合:インストール

sudo amazon-linux-extras install docker

Amazon Linux2 以外の OS の場合:インストール

Install Docker Engine
Lists the installation methods

Docker サービスの自動起動を有効化

sudo service docker start

Docker コマンドを sudo 無しで実行する設定

赤線部分は docker コマンドを実行するユーザー名に変更してください。

sudo usermod -a -G docker ec2-user

Docker がインストールできていることを確認

docker --version
Docker version 19.03.13-ce, build 4484c46

docker の使い方

docker イメージを確認

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

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

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

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

docker pull centos:centos8
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 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 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

コメント

タイトルとURLをコピーしました