2018年 Docker 使い方 まとめ その3
2018.12.17
この記事は最終更新日から1年以上が経過しています。
どもです。
前回の「2018年 Docker 使い方 まとめ その2」の続きになります。
Docker公式サイト
Docker Hub
Docker Hubでアカウントを作成すると、作成したdocker イメージを、Docker Hubのレポジトリにpushすることができます。
レポジトリにpushすることで、公開したり共有が可能となっております。
docker hub
Docker Hubへプッシュ
作成したdocker イメージをDocker Hubのレポジトリにpushしていきます。
Docker Hubでアカウントを作成したら、dockerコマンドでログインを行います。
レジストリサーバーにログイン
$ docker login
docker loginコマンドで、Docker Hubのログインが行えます。
コマンド入力後、Docker Hubで作成したアカウント名、パスワードを入力
「Login Succeeded」のメッセージが表示すればログイン成功です。
そのほかにも、Quay.ioにもログイン可能となっております。
Quay.ioにログイン
$ docker login quay.io
Docker Hubにイメージをプッシュするルールとして以下のようになっております。
DockerHubにおけるタグ付けルール
<DockerID>/<イメージ名>:<タグ名>
タグ名は省略可能で、省略するとデフォルトで「latest」のタグになります。
例
$ docker tag docker-whale takayama/docker-whale:1.0.0
pushコマンド
$ docker push <DockerID>/<イメージ名>:<タグ名>
pullコマンド
$ docker pull takayama/docker-whale:1.0.0
上記はDocker Hubにpushしたイメージをpullとなります。
nginx イメージ webサーバー構築
Docker Hubには色々な公式イメージレポジトリが存在します。
今回は、nginxイメージを用いて、webサーバーを構築していきます。
nginx公式イメージは以下のページとなります。
dockerHub nginx公式
https://hub.docker.com/_/nginx
上記のページの Exposing external portに記述されているコマンドで実行が可能となります。
$ docker run —name some-nginx -d -p 8080:80 some-content-nginx
nginxのコンテナを立ち上げるコマンド
$ docker run —name <コンテナ名> -d -p <ホスト側のポート番号>:<コンテン側のポート番号> <イメージ名>
任意のコンテナ名を指定可能となっていて、コンテナ名で指定することでDockerコマンドを実行することが可能となります。
「-d 」は、デタッチドモードと言われるもので、 指定がなければ、フォワグランドで立ち上がるので、他の操作できなくなります。
「-p」は、ポート番号指定となります。
$ docker run —name test-nginx -d -p 8080:80 nginx
早速上記のdockerコマンドを実行すると、ローカルにdockerイメージがない場合は pullコマンドが行われ、
コンテナIDが表示し起動します。
無事起動できたら、ブラウザからアクセスして確認しましょう。
nginxのデフォルトページが表示したかと思います。
いとも簡単にnginxの環境が用意できました。
停止と削除のコマンドは以下の通りとなります。
停止
$ docker stop test-nginx
削除
$ docker rm test-nginx
「-d」なしで、フォワグランドで実行
$ docker run —name test-nginx -p 8080:80 nginx
上記の「-d」なしのdockerコマンドを用いて、フォワグランドで起動してみます。
起動後、再度 ブラウザで「http://localhost:8080/」をアクセスすると、アクセスログが表示します。
xxx.xx.x.x - - [13/Jan/yyyy:hh:mm:ss +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36" "-"
フォワグランドで起動したコンテナを停止する場合は「ctl + c」で終了できます。
バインドマウント
ボリューム
Docker Hub nginx公式
再び、nginx公式イメージのページを確認します。
「Hosting some simple static content」の項目に以下のコマンドが記述されています。
こちらは、静的なhtmlページを配置するコマンド例となっております。
$ docker run —name some-nginx -v /some/content:/usr/share/nginx/html:ro nginx
先程、nginxを起動したコマンドに 「-v」オプションのコマンドを付与して起動するコマンドは以下の通りとなります。
$ docker run —name some-nginx -v /some/content:/usr/share/nginx/html:ro -d -p 8080:80 some-content-nginx
「-v」をみてみると
「-v /some/content:/usr/share/nginx/html:ro」
-v <ホスト側のディレクトリ>:<コンテナ側のマウントポイント>:<オプション>
となっております。
「ro」 はリードオンリーとなり、読み取り専用のオプションとなります。
バインドマウント
$ docker run —name <コンテナ名> -d -v <ホスト側のディレクトリ>:<コンテナ側のマウントポイント>:<オプション> -p <ホスト側のポート番号>:<コンテナ側のポート番号> <イメージ名>
「ホスト側のディレクトリ」のパスの指定は絶対パスとなります。
「コンテナ側のマウントポイント」では、nginxのデフォルトの公開ドキュメントルートを指定します。
Macの場合
-v /Users/<ユーザー名>/docker-test:/usr/share/nginx/html:ro
/Users/<ユーザー名>/は「~」に置き換えれます。
「ホスト側のディレクトリ」に、index.html ファイルを作成してテストしてみます。
$ mkdir ~/docker-test
$ vim ~/docker-test/index.html
index.html
<!doctype html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> web帳 docker test </body> </html>
web帳 docker testと記述しただけのhtmlファイルを用意。
以下のdockerコマンドを実行。
$ docker run --name test-nginx -v ~/docker-test:/usr/share/nginx/html:ro -d -p 8080:80 nginx
起動後、ブラウザで「http://localhost:8080/」をアクセス。
上記の様に「~/docker-test」内に作成した「index.html」が表示すれば成功です。
Docker file COPY
dockerコマンドの「cp」や、DockerFileの「COPY」コマンドを見ていきます。
まずは、nginxのイメージを使ってコンテナを起動します。
$ docker run —name tmp-nginx —rm -d nginx
「–rm」オプションは、コンテナを停止すると、コンテナも削除されるオプションです。
コンテナを削除せず、同名のコンテナを使用できないので、その際はコンテナを削除する必要がありますが、
「–rm」オプションを付与してコンテナ起動すると、コンテナを停止と同時にコンテナも削除され便利なので削除が必要な場合は付与しましょう。
docker cp コマンド
それでは、先程起動した nginxのコンテナから、設定ファイルを取得するため
dockerの 「cp」コマンドを使用していきます。
それぞれ「ホストマシン→コンテナ内」「コンテナ内→ホストマシン」の指定は以下のようになります。
ホストマシンのファイルをコンテナ内にコピーする場合
$ docker cp <ホスト上のコピーしたいファイルのパス> <コンテナ名 or ID>:<コピー先のパス>
コンテナ内のファイルをホストマシンにコピーする場合
$ docker cp <コンテナ名 or ID>:<コンテナ上のコピーしたいファイルのパス>:<コピー先のパス>
それでは、起動しているnginxのコンテナから、設定ファイルを取得してみます。
上記で作成した、docker-testディレクトリに移動。
$ cd docker-test/
nginxの設定ファイルをとってくる
$ docker cp tmp-nginx:/etc/nginx/conf.d/default.conf ./
起動している「tmp-nginx」からnginxの設定ファイルである「/etc/nginx/conf.d/default.conf」をコピーし、
カレントディレクトリの「docker-test」にコピーしました。
$ cat default.conf
取得したファイルが参照できるかと思います。
listen 80;をlisten 8080;に変更してみます。
$ vim default.conf
listen 8080;
Dockerfileでコンテン内に適応
最後に、先程取得したnginxの設定ファイルであるdefault.confを、
nginxの設定ファイルパスにコピーできるようにDockerfileを作成していきます。
先程取得した「default.conf」と、同ディレクトリに配置します。
Dockerfileの記述は以下の通り。
$ vim dockerfile
Dockerfile
FROM nginx:latest COPY default.conf /etc/nginx/conf.d/default.conf
作成できましたら、ビルドします。
ビルド
$ docker build -t nginx:1.0.0 .
ビルド成功しましたら、docker runコマンドで起動します。
nginxコンテナを起動
$ docker run —name web -p 8080:80 —rm nginx:1.0.0
起動後、ブラウザで「http://localhost:8080/」をアクセス。
上記のままだとコンテナ内のポート80番にアクセスしているので表示しないのが確認できるかと思います。
こちらを「8080」に変更します。
$ docker run —name web -p 8080:8080 —rm nginx:1.0.0
再度、ブラウザで「http://localhost:8080/」をアクセス。
nginxのデフォルトページが表示し、nginxのデフォルトポートが「8080」に変更されているが確認できたかと思います。
と言ったわけで、続きは次回にでも。
ではではぁ。