たのしい工学

プログラミングを学んで、モノをつくりたいひと、効率的に仕事をしたい人のための硬派なブログになりました

【Docker入門】Dockerでサーバを立てる

   


(引用:https://www.docker.com/legal/brand-guidelines

本記事は【Docker入門 初心者向け 】Docker基本コマンド集の記事からのつづきです。

dockerのnginxイメージを使用してwebサーバを構築してみましょう。

docker hub のexploreからnginxのリポジトリをさがします。

コマンドはExposing external ports に記載されているものを利用します。

docker run --name some-nginx -d -p 8080:80 some-content-nginx

つまり

docker run --name  <コンテナ名>-d \
  -p <ホスト側のポート番号>:<コンテナ側 のポート番号>\ 
  <イメージ名>

※”\”は改行してつづけてコードを書くためのコマンドです。
windowsの場合には,¥が表示されます。

以下、上記のコマンドに関して説明します。
--name
起動するコンテナに名前をつけるものです。コンテナを識別したり、コンテナを操作する際に利用できるものになります。
-d
デタッチモード。コンテナの実行をバックグラウンドで行うものです。デーモンのような常駐型のコンテナを利用する場合につくことがおおいです。-dをつけずにnginxを起動することもできますが、フォアグラウンドで実行されるので、他の操作ができなくなります。
-p
コンテナのポートをコンテナ外に公開する設定
<ホスト側のポート番号>がホストマシンが外部に公開するポート番号で、<コンテナ側 のポート番号>が、コンテナにマッピングするポート番号です。

Exposing external portsにあったように、8080:80の場合なら、コンテナを起動しているマシンの8080ポートにアクセスすれば、コンテナ内部の80番ポートで待ち受けているnginxに通信が転送されます。ローカルでコンテナを起動している場合は、ローカルホストの8080ポートにアクセスすれば、コンテナのi80番ポートにアクセスできるということになります。

Image from Gyazo

-dオプションを除いてアクセスしてみます。

Image from Gyazo

すると、フォアグラウンドでnginxが実行され、nginxのログが画面に出力されることが確認できます。この場合、ctrl + cなどでプロセスを終了させると、コンテナも終了します。dockerにおいてコンテナはホストマシンのプロセスのひとつとして動作しており、フォアグラウンドで実行しているプロセスが終了した時点で、コンテナは停止します。

バインドマウントについて

ホストマシン上のディレクトリをコンテナにマウントする手順についてです。これによって、ホスト上のhtmlファイルをnginxコンテナで公開できるようにします。

こちらのページにある
Hosting some simple static content

を参考にコンテナを起動してみます


$ docker run --name some-nginx -v /some/content:/usr/share/nginx/html:ro -d nginx

-v はvolume であり、このコマンドは静的なhtmlファイルをnginxで公開することを想定したものです。

このコマンドは前回示したものに対して、-vを追加しただけで大きく意味は変わりません。

:ro は read only を意味します。

docker run --name  <コンテナ名>-d \
  -p <ホスト側のポート番号>:<コンテナ側 のポート番号>\ <イメージ名>

Copy命令とAdd命令

通常、Dockerコンテナは終了したあとも停止状態のコンテナとして残り続けます。

コンテナを停止した時点で、自動的に削除までを行うコマンドが--rmオプションです。すでに存在するコンテナと同名のコンテナは起動することができないので、実行中のコンテナや停止中のコンテナで同じ名前のものがある場合には、削除する必要があります。

docker imageの内容 → ローカルにコピー
→ ローカルで編集 → Dockerfileに命令を記述して、ローカルで編集したdocker imageの内容をコンテナに反映

--rm

ホストマシン上の命令をdocker image内へ

ADD命令はCOPY命令の機能にくわえて、
tarでアーカイブされたファイルをコピー時に自動で展開したり、コピー元にURLを指定した場合は、URLからダウンロードして、コピー先に転送したりすることが可能です。
このような機能はADDという名称から想起しにくいために、ベストプラクティスとはされておらず、このような機能を利用する必要のある場合に限りADD命令をつかうことが推奨されています。

コンテナのライフサイクル

コンテナとは?docker imageのファイルシステムをもとにしてつくられる一種の仮想環境です。コンテナが起動している間、コンテナはホストマシンの1プロセスとして動作します。

CREATEDステータス

コンテナが作成されて、起動する前のステータスです。

-iはコンテナの標準入力を取得して、双方向に接続できるようにするものです。
-tはコンテナ内にttyを割り当てる役割があります
これらを組み合わせて-itとして使われることが多いです。
コンテナでシェルを実行して、フォアグラウンドで実行状態にしておきたい場合にはよく使われます。

-itをつけないと、シェルが起動してもすぐに停止してしまいます。


docker create --name status-test -it alpine /bin/shとすると、

以下のようにCREATEDステータスとして表示可能です。

Image from Gyazo

Runningステータス

この状態からコンテナがスタートされると、RUNNING状態になります。

以下のコマンドでコンテナをスタートします


docker start <起動中のイメージ>

すると、このように状態が変わります

Image from Gyazo

dockerの状態はdocker inspectコマンドでも確認することができます。


docker inspect <起動中のイメージ>

下記のように、statusがrunningになっていることが確認できます。

Image from Gyazo

PAUSEステータス

以下のコマンドで、コンテナをpauseします。


docker pause <起動中のイメージ>

下記のように、STATUSに(Paused)がついたことがわかります。

Image from Gyazo

docker inspectもみてみましょう。

Image from Gyazo

pause状態を解除するには、docker unposeコマンドをつかいます。


docker unpause <pause中のコンテナ>

Image from Gyazo

下記のように再び状態がrunningになりました。

Image from Gyazo

EXITステータス

では、コンテナを終了させてみます。


docker stop <起動中のコンテナ>

Image from Gyazo

STATUSがExitedとなりました。

ふたたびRunningステータスに

Exitedステータスになったコンテナは、docker start コマンドでふたたびrunningステータスとすることができます。

Removingステータス

removingステータスは削除中に表示されるものなので、通常、確認することはあまりありません

Deadステータス

通常終了できずにのこってしまった場合のステータスです。

まとめると

下記のようなライフサイクルとなります。
Image from Gyazo

もっとDockerについて詳しく学びたいひとは、Udemyの「ゼロからはじめる Dockerによるアプリケーション実行環境構築」がおすすめです!よかったら受講してみてください。

次回は、Dockerシェルへssh接続について書く予定です。
ではでは!

 - Docker, プログラミング系