Docker:はじめに
Docker は、Linux コンテナー用のオープン プラットフォーム管理ツールです。これは、開発者とシステム管理者がアプリケーションをビルドして軽量コンテナーにパッケージ化するための手段を提供します。 Docker は次のコンポーネントで構成されています:
- Docker エンジン – ポータブルで軽量なランタイムおよびパッケージング ツール
- Docker ハブ – アプリケーションを共有し、ワークフローを自動化するためのクラウド サービス
Docker は、イメージ ベースのアプリケーション コンテナーを作成するために使用されます。イメージベースのコンテナーは、個々のランタイム スタックを含むアプリケーションを 1 つのコンテナーにパッケージ化します。これにより、コンテナはホスト オペレーティング システムおよびカーネル バージョンから独立したものになります。その結果、ラップトップ、データセンターの仮想マシン、および任意のクラウドで、同じアプリケーションを変更せずに実行できます。このコンテナーを、Docker を実行する別のマシンに転送して、互換性の問題なしでアプリケーションを実行できます。
以下は、Docker コンテナー内でアプリケーションを実行することのその他の利点の一覧です。
- Docker イメージには、アプリケーションの実行に必要なコンテンツのみが含まれているため、オペレーティング システム全体を必要とする仮想マシンよりもサイズが小さくなります。
- Docker コンテナは、仮想マシン全体のオーバーヘッドを含むアプリケーションよりも高速に実行されます。
- Docker コンテナには独自のネットワーク インターフェース、ファイル システム、メモリが含まれているため、コンテナで実行されているアプリケーションをホスト コンピュータ上の他のプロセスから分離して保護することができます。
Docker イメージ
Docker コンテナーは、Docker イメージから構築されます。これらの Docker イメージからアプリケーションを実行するには、Docker コンテナーを作成します。次の例では、「centos:7」という名前の Docker イメージから「test」という名前の Docker コンテナーを作成し、/bin/bash を実行します。
# docker create --name test centos:7 /bin/bash Unable to find image 'centos:7' locally Trying to pull repository docker.io/library/centos ... 7: Pulling from docker.io/library/centos 469cfcc7a4b3: Pull complete Digest: sha256:989b936d56b1ace20ddf855a301741e52abca38286382cba7f44443210e96d16 Status: Downloaded newer image for docker.io/centos:7 a79ce1655f2ca17c7ac8cc15f307ba0bb438fbebd4595568df3433dd5ff79b73
イメージは、サービスと追加のアプリケーションがインストールされたオペレーティング システム全体を含めることができる読み取り専用のテンプレートです。 Docker は、イメージを構築したり、既存のイメージを更新したりする機能を提供します。コマンド ラインから Docker イメージを作成するか、Dockerfile にイメージをビルドするための指示を保存することができます。 Docker イメージのビルドを開始すると、Docker はこの Dockerfile を読み取り、命令を実行します。
各イメージは基本イメージ (centos など) から開始します。各 Docker イメージは、これらの基本イメージから構築された一連のレイヤーで構成されています。 Dockerfile 内の各命令によって、イメージ内に新しいレイヤーが作成されます。 Docker イメージを変更するたびに、そのレイヤーのみが更新または追加されます。 Docker は unionfs を使用して、これらのレイヤーを 1 つのイメージに結合します。 unionfs ファイル システム サービスを使用すると、別々のファイル システムのファイルとディレクトリを 1 つのファイル システムにオーバーレイできます。
Docker イメージを作成したら、イメージを Docker レジストリーに保管して共有できます。これらのレジストリは、プライベートまたはパブリックにすることができます。 Docker Hub は、Docker コンテナーを共有および管理するための Software-as-a-Service プラットフォームとして機能するパブリック Docker レジストリです。
CentOS / RHEL / Fedora に Docker をインストールする方法Mac に Docker をインストールする方法
Docker Hub レジストリ
Docker Hub レジストリは、アプリケーションを Docker イメージとしてホストし、Docker 環境の作成と管理を可能にするサービスを提供します。 Docker Hub レジストリは、Docker, Inc. によって所有および管理されており、https://registry.hub.docker.com/ にあります。
Docker Hub は多数のリポジトリを提供し、各リポジトリには多数のイメージを含めることができます。 Docker イメージのホストに加えて、Docker Hub は、ユーザー認証、自動化されたイメージ ビルドとワークフロー ツール、GitHub および BitBucket との統合などのサービスを提供します。これらの Docker サービスを使用するには、Docker Hub アカウントを作成する必要があります。 https://hub.docker.com/account/signup/ でアカウントを作成できます。次のコマンドを使用して、コマンドラインからアカウントを作成することもできます:
# docker loginDocker Hub でパブリック/プライベート リポジトリを作成し、コマンド ラインを使用してリモートで接続する方法
アカウントがなくても、Docker イメージを検索し、Docker Hub からイメージをプル (ダウンロード) できます。イメージをプッシュ (アップロード) し、イメージまたはリポジトリにコメントを残し、利用可能なすべての Docker Hub サービスを使用するには、Docker Hub アカウントが必要です。
Docker のインストールと起動
docker サービスのインストールと開始は簡単な作業です。次のコマンドを使用して docker パッケージをインストールできます:
# yum install docker
systemctl コマンドを使用して、docker サービスを有効にして開始します。
# systemctl enable docker # systemctl start docker
デフォルトでは、Docker は devicemapper をストレージ ドライバーとして使用します。 RedHat Linux 7 では、Btrfs を使用するように Docker エンジンを構成できます。これにより、Btrfs のスナップショット機能を利用できます。次のコマンドは、docker パッケージからインストールされたすべてのファイルを表示します:
# rpm -ql docker /etc/docker /etc/docker/certs.d /etc/docker/certs.d/redhat.com /etc/docker/certs.d/redhat.com/redhat-ca.crt /etc/docker/certs.d/redhat.io /etc/docker/certs.d/redhat.io/redhat-ca.crt ...
docker バイナリと構成ファイルに加えて、すべての docker コマンドのドキュメントと man ページがインストールされていることがわかります。 /var/lib/docker ディレクトリは、docker サービスが開始されるまで空です。次の一連のコマンドは、docker の起動前後のディレクトリの内容を表示します。
# ls /var/lib/docker # systemctl enable docker # systemctl start docker # ls /var/lib/docker containers graph linkgraph.db tmp volumes devicemapper init repositories-devicemapper trust
docker ユーティリティ
docker コマンドライン インターフェイスには、30 を超えるコマンドがあります。コマンドのリストについては、docker の man ページを参照してください。 docker info コマンドは、Docker のインストールに関するシステム全体の情報を表示します。詳細については、docker-info の man ページを参照してください。デフォルトのストレージ ドライバは devicemapper であり、データとメタデータはループ デバイス /dev/loop0 と /dev/loop1 に保存されることに注意してください。
# docker info Containers: 1 Running: 0 Paused: 0 Stopped: 1 Images: 1 Server Version: 1.13.1 Storage Driver: overlay2 Backing Filesystem: xfs Supports d_type: false Native Overlay Diff: true Logging Driver: journald ...
root 以外のユーザーは、docker グループに追加して docker サービスを再構成すると、docker コマンドを実行できます。
Docker Hub レジストリでイメージを検索する
docker search コマンドを使用して、Docker Hub でイメージを検索します。以下は、「docker search」コマンドの出力です。
# docker search centos INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED docker.io docker.io/centos The official build of CentOS. 4207 [OK] docker.io docker.io/ansible/centos7-ansible Ansible on Centos7 108 [OK] docker.io docker.io/jdeathe/centos-ssh CentOS-6 6.9 x86_64 / CentOS-7 7.4.1708 x8... 94 [OK] docker.io docker.io/consol/centos-xfce-vnc Centos container with "headless" VNC sessi... 52 [OK] docker.io docker.io/imagine10255/centos6-lnmp-php56 centos6-lnmp-php56 40 [OK] ...
このコマンドは、Docker Hub で「centos」イメージを検索します。出力には、リポジトリ/イメージの名前、説明、付与された星の数、イメージが公式かどうか、自動化されているかどうかが含まれます。 name 列は次の形式であり、一意の識別を提供するために含まれているリポジトリを含めることができます:
[repository_name]/[image_name]
スターは画像の人気度を測定します。 Docker Hub アカウントを持っている人なら誰でも、気に入ったイメージに「スター」を付けることができます。次の例では、星が 3 つ以上ある「centos」画像を検索します。
# docker search -s 3 centos Flag --stars has been deprecated, use --filter=stars=3 instead INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED docker.io docker.io/centos The official build of CentOS. 4207 [OK] docker.io docker.io/ansible/centos7-ansible Ansible on Centos7 108 [OK] docker.io docker.io/jdeathe/centos-ssh CentOS-6 6.9 x86_64 / CentOS-7 7.4.1708 x8... 94 [OK] ...
「公式」リポジトリは、ベンダーまたは Docker への貢献者によって認定されています。 「自動化された」イメージは、Docker Hub の自動ビルド プロセスによってビルドされます。
Docker Hub からのイメージのダウンロード
「docker pull」コマンドを使用して、イメージまたはリポジトリを Docker Hub レジストリからローカル システムにダウンロードします。次の例は、centos:latest イメージをプルダウンします。
# docker pull centos Using default tag: latest Trying to pull repository docker.io/library/centos ... latest: Pulling from docker.io/library/centos Digest: sha256:989b936d56b1ace20ddf855a301741e52abca38286382cba7f44443210e96d16 Status: Downloaded newer image for docker.io/centos:latest
「docker images」コマンドを使用して、ローカルの Docker リポジトリに保存されているイメージを一覧表示します。
# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/centos 7 e934aafc2206 2 weeks ago 199 MB docker.io/centos latest e934aafc2206 2 weeks ago 199 MB
リポジトリ内の各イメージは、TAG と IMAGE ID によって区別されます。
以下は、docker 構成ファイルの場所を示しています。
# cd /var/lib/docker/ # ll total 4 drwx------. 3 root root 77 Apr 21 07:57 containers drwx------. 3 root root 21 Apr 21 07:56 image drwxr-x---. 3 root root 18 Apr 21 07:56 network drwx------. 6 root root 4096 Apr 21 07:57 overlay2 drwx------. 4 root root 30 Apr 21 07:56 plugins drwx------. 2 root root 6 Apr 21 07:56 swarm drwx------. 2 root root 6 Apr 21 07:57 tmp drwx------. 2 root root 6 Apr 21 07:56 trust drwx------. 2 root root 24 Apr 21 07:56 volumesLinux で Docker イメージを一覧表示 / 検索 / プルする方法
コンテナ内でアプリケーションを実行する
docker run コマンドを使用して、コンテナー内でアプリケーションを実行します。このコマンドは、独自のファイル システム、独自のネットワーク、および独自の分離されたプロセス ツリーを使用してプロセスを開始します。次の構文には、コマンドで使用可能なすべてのオプションが含まれているわけではありません:
# docker run [OPTION...] IMAGE [COMMMAND] {ARG...]
プロセスを開始する IMAGE は、コンテナやネットワークなどで実行するプロセスに関連するデフォルトを定義できますが、docker 実行オプションは IMAGE の設定をオーバーライドします。 IMAGE がローカルで使用できない場合、docker run は IMAGE でコンテナーを開始する前に docker pull コマンドと同じ方法でイメージをプルします。
以下に、docker run の使用例を 2 つ示します。最初の例では、ローカル マシンに既に存在する「centos」イメージを使用します。 Docker はイメージを使用して新しい CentOS 環境を作成し、echo コマンドを実行して「Hello」を表示します。
# docker run centos /bin/echo "Hello" Hello
2 番目の例では、ローカル システムに存在しない fedora イメージを使用します。 Docker は Docker Hub からイメージをプルし、そのイメージを使用して新しい Fedora 環境を作成し、echo コマンドを実行します。
# docker run fedora /bin/echo "Hello" Unable to find image 'fedora:latest' locally Trying to pull repository docker.io/library/fedora ... latest: Pulling from docker.io/library/fedora 2176639d844b: Pull complete Digest: sha256:ec588fc80b05e19d3006bf2e8aa325f0a2e2ff1f609b7afb39176ca8e3e13467 Status: Downloaded newer image for docker.io/fedora:latest Hello
どちらの例でも、「Hello」が画面に表示された後、Docker コンテナーは停止します。 docker ps コマンドを使用してコンテナーを一覧表示しますが、コンテナーは表示されません:
# docker ps
これは、「docker ps」が現在実行中のコンテナーのみを表示するためです。停止したコンテナを含むすべてのコンテナを表示するには、「docker ps -a」コマンドを使用します。
# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7b772ea59c92 fedora "/bin/echo Hello" 25 seconds ago Exited (0) 23 seconds ago vigilant_haibt 263e715ae13c centos "/bin/echo Hello" About a minute ago Exited (0) About a minute ago condescending_aryabhata a79ce1655f2c centos:7 "/bin/bash" 4 hours ago Created test
docker images コマンドは、docker run コマンドを使用したときに、「fedora」リポジトリの「最新」イメージが Docker Hub からダウンロードされたことを示しています。
# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/centos 7 e934aafc2206 2 weeks ago 199 MB docker.io/centos latest e934aafc2206 2 weeks ago 199 MB docker.io/fedora latest 9110ae7f579f 6 weeks ago 235 MB
インタラクティブな Docker コンテナの実行
–t を使用します および –i オプションを docker run コマンドで使用して、対話型コンテナーを実行します。これらのオプションについて説明します:
- -t :疑似 tty を割り当て、コンテナの STDIN (標準入力) にアタッチします
- -i :コンテナの STDIN を開いたままにしておきます
–t および –i オプションを指定して docker run コマンドを使用する 2 つの例を以下に示します。どちらの例でも、CentOS Linux 7.4 がローカル システムで実行されています。
# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core)
最初の例では、「centos:7」イメージを使用しています。 Docker はイメージを使用して新しい CentOS 環境を作成し、bash シェル コマンドを実行します。このイメージの OS バージョンは CentOS 7 です。
# docker run -t -i centos:7 /bin/bash [root@b3e1316c4653 /]# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core)
2 番目の例では、ubuntu イメージを使用しています。特定のイメージが指定されていないため、Docker は「最新の」Ubuntu イメージを使用して新しい Ubuntu 環境を作成し、bash シェル コマンドを実行します。このイメージの OS バージョンは Ubuntu 16.04.4 です。また、ubuntu イメージはローカルで利用できないため、docker は最初にリポジトリからダウンロードしてから実行します。
# docker run -t -i ubuntu /bin/bash Unable to find image 'ubuntu:latest' locally Trying to pull repository docker.io/library/ubuntu ... latest: Pulling from docker.io/library/ubuntu d3938036b19c: Pull complete a9b30c108bda: Pull complete 67de21feec18: Pull complete 817da545be2b: Pull complete d967c497ce23: Pull complete Digest: sha256:9ee3b83bcaa383e5e3b657f042f4034c92cdd50c03f73166c145c9ceaea9ba7c Status: Downloaded newer image for docker.io/ubuntu:latest
root@9ee24718262c:/# cat /etc/os-release NAME="Ubuntu" VERSION="16.04.4 LTS (Xenial Xerus)" ID=ubuntu ID_LIKE=debian PRETTY_NAME="Ubuntu 16.04.4 LTS" VERSION_ID="16.04" HOME_URL="http://www.ubuntu.com/" SUPPORT_URL="http://help.ubuntu.com/" BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/" VERSION_CODENAME=xenial UBUNTU_CODENAME=xenial
exit コマンドを使用するか、CTRL + D を押して対話型コンテナーを終了できます。
コンテナの一覧表示とコンテナ ログの表示
docker ps コマンドを使用して、Docker コンテナーに関する情報を一覧表示します。デフォルトでは、実行中のコンテナのみがリストされます。 –a を含める オプションを docker ps コマンドで使用して、すべてのコンテナーを表示します。出力には、コンテナの作成時に自動的に生成される一意のコンテナ ID と一意のコンテナ名が含まれます。 docker ps コマンドの出力には、コンテナーの作成に使用されたイメージ、コンテナーで実行されているコマンド、および状態情報も含まれます。ステータス情報には、コンテナーがいつ作成されたか、およびコンテナーが実行されている期間が含まれます。
# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9ee24718262c ubuntu "/bin/bash" 3 minutes ago Exited (127) 2 seconds ago modest_turing b3e1316c4653 centos:7 "/bin/bash" 6 minutes ago Exited (0) 4 minutes ago gracious_pare 7b772ea59c92 fedora "/bin/echo Hello" 18 minutes ago Exited (0) 18 minutes ago vigilant_haibt 263e715ae13c centos "/bin/echo Hello" 19 minutes ago Exited (0) 19 minutes ago condescending_aryabhata a79ce1655f2c centos:7 "/bin/bash" 4 hours ago Created test
docker logs コマンドはコンテナー内を調べて、その標準出力を返します。コマンドの引数として、コンテナー ID またはコンテナー名のいずれかを使用できます。
# docker logs b3e1316c4653 [root@b3e1316c4653 /]# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) [root@b3e1316c4653 /]# exit exit
上記の例では、docker logs コマンドは、「cat /etc/redhat-release」コマンドがコンテナーで実行されたことを示しています。 docker ps および docker logs コマンドは、コンテナーの外部、つまり別のターミナル ウィンドウから実行する必要があります。
コンテナまたはイメージのすべての情報を表示
docker inspect コマンドを使用して、コンテナーまたはイメージで使用できるすべての情報を表示します。次の例は、表示される情報の一部を示しています。 –f {{.section.subsection}} を使用します 特定の情報を表示するオプション。次の例では、ネットワーク設定のみを表示しています:
# docker inspect -f {{.NetworkSettings}} modest_turing {{ 98e04ea6d68753022ae2212b06b1514323927a1ed117448bc70ea3fa9a2f4a06 false 0 map[] /var/run/docker/netns/98e04ea6d687 [] []} { 0 0 } map[bridge:0xc4200c0300]}
次の例では、IP アドレスを表示しています:
# docker inspect -f {{.NetworkSettings.IPAddress}} modest_turing 172.17.0.10
次の例は、プロセス ID を表示します:
# docker inspect -f {{.State.Pid}} modest_turing 7181
次の例は、コンテナで実行されているコマンドを示しています:
# docker inspect -f {{.Config.Cmd}} modest_turing [/bin/bash]
コンテナーのすべてのオプション/プロパティを表示する場合は、「docker inspect」でオプションを使用しないでください:
# docker inspect modest_turing [ { "Id": "9ee24718262c9f7ed3320019163a8b1b2bb1bccc83eb362a5512a74eaa4ad57f", "Created": "2018-04-21T12:22:21.983441857Z", "Path": "/bin/bash", "Args": [], "State": { ....
これは、コンテナーのすべてのプロパティを示すかなり長い出力になります。
新しいコンテナの作成
docker run コマンドは、新しいコンテナーでプロセスを実行します。 docker create コマンドを使用して、後で開始できるコンテナーを作成することもできます。 docker create の構文と使用可能なオプションは、docker run 構文に似ています。
以下の例では、centos:7 イメージから「geeklab」という名前の新しいコンテナーを作成し、起動時に bash シェル コマンドを実行します。 –name オプションを省略した場合、コンテナー名は自動的に生成されます。
# docker create -t -i --name geeklab centos:7 /bin/bash 667fd40faeb69113d035f08e5a910275a8463aa2a6a0796833f590e878732e17
コマンドの出力は、非常に長い一意のコンテナー ID です。デフォルトで実行中のコンテナのみを表示する docker ps コマンドで示されるように、コンテナはすぐには起動しません:
# docker ps
すべてのコンテナを表示するには、「docker ps -a」を実行する必要があります。この例では、出力を grep にパイプし、コンテナー ID の一部を検索します:
# docker ps -a | grep 667fd 667fd40faeb6 centos:7 "/bin/bash" About a minute ago Created geeklab
コンテナの開始、停止、および削除
「docker start」を使用します 」 コマンドを使用して、既存のコンテナーを開始します。 –a を使用します および –i 現在のシェルの STDIN (標準入力)、STDOUT (標準出力)、および STDERR (標準エラー) をコンテナーにアタッチし、すべてのシグナルをコンテナーに転送するオプション。
# docker start -a -i geeklab [root@667fd40faeb6 /]#
コンテナー内から、exit コマンドまたは CTRL-d を使用してコンテナーを停止します。コンテナーの外部、つまり別のターミナル ウィンドウから、docker stop コマンドを使用してコンテナーを停止します。
# docker stop geeklab
「docker rm」を使用します コンテナを削除するコマンド。 1 つのコマンドで複数のコンテナーを削除できます。 –f を使用します 実行中のコンテナを削除するオプション。
# docker rm geeklab geeklab
これら 3 つの docker コマンドはすべて、コンテナー ID またはコンテナー名を引数として受け入れます。
docker rm コマンドはコンテナーを削除します。 docker rmi コマンドを使用してイメージを削除します:
# docker rmi [IMAGE]docker コンテナを一覧表示 / 開始 / 停止 / 削除する方法
実行中のコンテナでの追加コマンドの実行
docker exec コマンドを使用して、実行中のコンテナーでコマンドを実行します。 docker run コマンドと同様に、–t および –i オプションを含めて対話型コマンドを実行します。コンテナー ID またはコンテナー名を引数として指定します。
次の例では、docker exec コマンドは、「ゲスト」コンテナで新しいインタラクティブな bash シェルを開始します:
# docker exec -t -i geeklab /bin/bash [root@68b5b713c37b /]#
次の例では、docker exec コマンドを使用して、「geeklab」コンテナーで sshd サービスを開始します。 「geeklab」コンテナは CentOS 6.4 を実行しています。この例では、-t および -i オプションは必要ありません。
# docker exec guest service sshd start Generating SSH2 RSA host key: [ OK ] Generating SSH1 RSA host key: [ OK ] Generating SSH2 DSA host key: [ OK ] Starting sshd: [ OK ]
コンテナーで sshd サービスが開始され、開始ホスト システムに制御が戻ります。