Docker基礎 - 必要なことだけメモ①

Docker Engineの構成

・Docker Engineは一般的なクライアント/サーバーシステムとして動作する
・コンテナーの管理をDockerサーバーが、サーバーの操作をDockerクライアントが担う
・Dockerクライアント、サーバーの状態はdocker versionコマンドでバージョンと共に確認できる

$ sudo docker version

Dockerのコンテナー管理のライフサイクル

・Dockerコンテナーは、元となるDockerイメージというテンプレートから作成する
・Dockerコンテナーは実行中と停止の状態があり、コンテナーで実行するプロセスの状態と連動する
・Dockerコンテナーの管理はコンテナーの実行/停止と新たなイメージ作成の繰り返し
・Dockerコンテナーの変更とDockerイメージの作成は、Dockerfileというテキストファイルに変更内容を記述して「docker build」コマンドでバッチ的に行うことが可能

f:id:tomomiik:20200628005023p:plain

Dockerイメージをダウンロードする「docker pull」コマンド

・Dockerイメージは、コンテナーを実行するために必要な全てのディレクトリ/ファイルを含むアーカイブと、コンテナーのメタ情報を持つ
・多くのベースイメージはDocker Hub Registryで公開されていますので、そこからダウンロードするのが一般的

f:id:tomomiik:20200628005439p:plain

・DockerレジストリからのDockerイメージのダウンロードは、docker pullコマンドを実行する
-- どのイメージにするかは、引数で{イメージ名}(Repository)と{タグ名}(Tag)で選択
-- {タグ名}はGitなどと同様、Dockerイメージのバージョンを示す

$ docker pull {イメージ名}:{タグ名}

・初期設定では、Dockerレジストリとして「Docker Hub Registry」にアクセスするようになっており、Docker Hub Registryで公開されている多くのベースイメージには、最新版(latest)のタグが設定されている
・{イメージ名}はDocker Hub Registryで好みのイメージを検索し、{タグ名}は特別な要件がなければ、latestを指定する
・ダウンロードしたDockerイメージは、レジストリのイメージと区別するために「ローカルキャッシュ」と呼ぶこともある。このローカルキャッシュからDockerコンテナーを実行する。

ダウンロードしたDockerイメージの一覧を確認する「docker images」コマンド

・ダウンロードしたDockerイメージ(ローカルキャッシュ)の一覧は、docker imagesコマンドで確認する

$ docker images

Dockerコンテナーを作成・実行する「docker run」コマンド

・DockerイメージからDockerコンテナーを作成、実行してみる。docker runコマンドで、コンテナーの新規作成と実行の両方を行う。

f:id:tomomiik:20200628010120p:plain

$ docker run [オプション] [--name {コンテナー名}] {イメージ名}[:{タグ名}] [コンテナーで実行するコマンド] [引数]

・タグ名は省略可能。--nameオプションおよびコンテナー名を省略すると、英単語を組み合わせたランダムなコンテナー名がDockerコンテナーに設定される。

▼ 主なオプション
-d:バックグラウンドで実行する(後述)。既定では、コンテナーをフォアグラウンドで実行するため、Webサーバーやアプリケーションサーバーなど常時実行するコンテナーで指定
-i:コンテナーの標準入力を開く。/bin/bashなどでコンテナーを操作する際に指定
-t:tty(端末デバイス)を確保する。/bin/bashなどでコンテナーを操作する際に指定
-p {ホストのポート番号}:{コンテナーのポート番号}:Dockerサーバーのホストとポートマッピングを構成

▼お試し作業
ubuntuイメージからubuntu1コンテナーを作成、端末を開きbashを実行し、nginx」をコンテナーにインストール

$ docker run -it --name ubuntu1 ubuntu /bin/bash
root@f66e8ee71dab:/#
root@f66e8ee71dab:/# apt-get install -y nginx
  :(略)
root@f66e8ee71dab:/# dpkg -l nginx
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                              Version               Architecture      Description
+++-=================================-=====================-=====================-=======================================================================
ii  nginx                             1.4.6-1ubuntu3        all                   small, powerful, scalable web/proxy server
root@f66e8ee71dab:/#

・一通り操作したら、[Ctrl]+[d]キーでbashプロセスを終了する。プロセスの終了とコンテナーの停止は連動するので、コンテナも停止状態になる。

Dockerコンテナーの一覧を取得する「docker ps」コマンド

・Dockerコンテナーの一覧は、docker psで確認する

$ docker ps -a
CONTAINER ID        IMAGE                   COMMAND                CREATED             STATUS              PORTS                NAMES
f66e8ee71dab        ubuntu:latest           /bin/bash              37 minutes ago      Exit 0                                   ubuntu1

-- docker psコマンドでは実行中のコンテナーのみ表示されますが、「-a」オプションを付加すると、停止中のコンテナーも表示される。
-- コンテナーの状態はSTATUS列で判断でき、「Up {実行時間}」の場合は実行中、Exit 「{終了コード}」の場合は停止となる。

Dockerイメージを作成する「docker commit」コマンド

・Dockerコンテナーから新しいDockerイメージを作成するために、docker commitを実行

f:id:tomomiik:20200628014132p:plain

$ docker commit {コンテナー名}|{コンテナーID} [{ユーザー名}/]{イメージ名}

-- ubuntu1コンテナーではnginxをインストールしたので、任意の{ユーザー名}(test)と{イメージ名}(nginx)としてイメージを作成してみる

$ docker commit ubuntu1 test/nginx
7fed60d6cc60de39ea80d8fba729e9abbb9899af6bf5c7ebb0a4627aacd36ed4
$

Dockerコンテナーを停止する「docker stop」コマンド

・バックグラウンドで実行中のDockerコンテナーは、docker stopで停止する

$ docker stop {コンテナー名}|{コンテナーID}

Dockerコンテナーを削除する「docker rm」コマンド、イメージを削除する「docker rmi」コマンド

使い終わったDockerコンテナーはdocker rm、Dockerイメージはdocker rmiで削除する

$ docker rm {コンテナー名}|{コンテナーID}
$ docker rmi {イメージ名}|{イメージID}

Dockerコンテナーを再実行する「docker start」コマンド

・停止しているコンテナーは、docker startで再実行する

$ docker start [-i] {コンテナー名}|{コンテナーID}