いちから始める Docker -コンテナをビルド- (2020年)

2020/03/12

Dockerイメージとコンテナの関係

Dockerイメージ

Dockerコンテナを作成するための元となるテンプレート
Dockerfile を作成して設定する

Dockerコンテナ

Dockerイメージを元に複数作成して、システム、アプリケーションを構成・実行されます。

Docker イメージをダウンロード

Docker イメージはDocker Hub で検索できます。
※ユーザ登録はしておいた方が良いです

利用したいイメージやバージョンを「イメージ名:バージョン」でダウンロードできます。


$ docker image pull alpine:latest

latest は文字通り最新版なので、明示的にバージョンを指定する場合は、Docker Hub に記載されているバージョンを利用します。

Dockerfile と docker コマンドを使う

確認用シェルスクリプト「hello.sh」の作成

Dockerイメージを作成する前に、Dockerコンテナ内で動作させるシェルスクリプトにサンプルを作成してみます。


#!/bin/sh
echo "Hello Shell Script"

Dockerfile でイメージ作成

次にDockerイメージを作成しますが、一般的に Dockerfile ファイルを利用しして設定します。

※今回は「ubuntu:18.04」イメージを利用します。


FROM ubuntu:18.04

COPY hello.sh /usr/local/bin
RUN chmod +x /usr/local/bin/hello.sh

CMD ["hello.sh"]

インストラクション(命令)

Dockerfile は DSL(ドメイン固有言語)を利用して、イメージを作成します。
その際、でてくるのがインストラクションです。

FROM

Dockerイメージ(OS)を指定(ビルド前)

COPY

ホスト側(Mac)から、Dockerコンテナの指定パスにコピーします。
上記はイメージビルド前に、ホスト側の「hello.sh」を「/usr/local/bin/」にコピーします。

類似的にリモート追加や自動解凍できる ADD インストラクションもある。

RUN

Dockerコンテナ内で、指定のコマンドを実行します。
上記は、コンテナにコピーした「/usr/local/bin/hello.sh」に実行権限を与えます。

CMD

完成したDockerイメージに対して、コマンドを実行します。
「,」で区切って引数を与えることもできます。
RUN との違いは、CMDはイメージビルド後に実行します。

Dockerイメージビルド

hello:latest とラベルをつけて Dockerイメージをビルドします。


$ docker image build -t hello:latest .

引数はイメージ名と Dockerfile の配置したパスを指定します。


$ docker image build -t イメージ名:タグ名 Dockerfile配置パス

タグ名は、一般的にバージョンとして利用されます。

Dockerコンテナ起動


$ docker container run hello:latest
Hello Shell Script

「hello:latest」コンテナが起動後に、shell.sh が実行されました。

Docker イメージの確認


$ docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
hello                latest              05e3eb5ff03b        5 minutes ago       64.2MB
...

リポジトリが「hello」、タグ「latest」、イメージID「05e3eb5ff03b」で作成されています。

Docker コンテナの確認


$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
62faba8c4477 hello:latest "hello.sh" 8 minutes ago Exited (0) 8 minutes ago admiring

hello:latest コンテナが、コンテナID「62faba8c4477」で作成されていることがわかります。

Dockerイメージのタグ変更

実際に運用する場合、Github のように namespace や バージョンをつける必要がでてきます。
例えば、イメージ名「hello」は、namespace(空間名)をつけて「sample/hello」、 バージョンは「:」で区切って、「hello:latest」、「hello:0.1.0」のような書き方ができます。

namespace をつける


$ docker image tag hello:latest example/hello:latest

バージョンをつける


$ docker image tag hello:latest example/hello:0.1.0

$ docker images
REPOSITORY                                                 TAG                 IMAGE ID            CREATED             SIZE
example/hello                                              0.1.0               ca00cb953947        2 hours ago         64.2MB
example/hello                                              latest              ca00cb953947        2 hours ago         64.2MB
...

不要になったコンテナ&イメージの削除

Docker を利用しているとイメージやコンテナを作りすぎて、パソコンの容量を圧迫しがちです。

また、イメージやコンテナリストが大量になり確認もしづらくなるので、リスト検索して不要なものは削除しましょう。

  • コンテナIDの一覧「docker ps -a」
  • イメージIDの一覧「docker images」

Docker コンテナ一覧


$ docker container list

Docker コンテナ削除


$ docker rm コンテナID

Docker イメージ一覧


$ docker image list
//または
$ docker images

Docker イメージ削除


$ docker rmi イメージID