【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番ポートにアクセスできるということになります。
-dオプションを除いてアクセスしてみます。
すると、フォアグラウンドで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ステータスとして表示可能です。
Runningステータス
この状態からコンテナがスタートされると、RUNNING状態になります。
以下のコマンドでコンテナをスタートします
docker start <起動中のイメージ>
すると、このように状態が変わります
dockerの状態はdocker inspectコマンドでも確認することができます。
docker inspect <起動中のイメージ>
下記のように、statusがrunningになっていることが確認できます。
PAUSEステータス
以下のコマンドで、コンテナをpauseします。
docker pause <起動中のイメージ>
下記のように、STATUSに(Paused)がついたことがわかります。
docker inspectもみてみましょう。
pause状態を解除するには、docker unposeコマンドをつかいます。
docker unpause <pause中のコンテナ>
下記のように再び状態がrunningになりました。
EXITステータス
では、コンテナを終了させてみます。
docker stop <起動中のコンテナ>
STATUSがExitedとなりました。
ふたたびRunningステータスに
Exitedステータスになったコンテナは、docker start コマンドでふたたびrunningステータスとすることができます。
Removingステータス
removingステータスは削除中に表示されるものなので、通常、確認することはあまりありません
Deadステータス
通常終了できずにのこってしまった場合のステータスです。
まとめると
もっとDockerについて詳しく学びたいひとは、Udemyの「ゼロからはじめる Dockerによるアプリケーション実行環境構築」がおすすめです!よかったら受講してみてください。
次回は、Dockerシェルへssh接続について書く予定です。
ではでは!