かわいい。Moby Dockという名前だそうです。
(くん付けかちゃん付けかで悩んで性別調べたけど出てこなかったので、ご存知の方いたらこっそり教えて下さい)
TL;DR
- Dockerの存在は知っていて、コンテナ起動の方法なんかも知っている
- 自分でイメージ作成したことが無く、ちゃんとしたデバッグの手法とか知らないので改めて一から学ぶ
- k8sとかもそのうちやる
Dockerとは
星の数ほど書かれた見出しではあるものの、単語が多すぎて???ってよくなります。
解説記事眺めていて登場頻度が高めだなと感じた単語だけピックアップ。(適宜更新予定)
- 仮想化
ホスト型/ハイパーバイザ型/コンテナ型などの方式があり、Dockerはコンテナ型。他の方式との違いについては実際に触っていないのでハッキリとは言えず。解説記事を鵜呑みにするなら- 構成のコード化。コードなので共有するためのファイルが軽い
- 処理/起動が早い
- プロセス:コンテナの比率は基本的に1:1
DBサーバとAPIサーバが必要なアプリケーションを構成する場合、他の方式だと一つの仮想環境にまとめることが多いが、コンテナ型の場合は1つのコンテナに対して1つのプロセス。よってコンテナを2つ立ち上げる。サービスの規模次第とも思うので例外はありそうだけど、これがベストプラクティスらしい。
- ホストマシン
Dockerをインストールしたマシン。今この記事を書いているMacbookのこと。 - Dockerエンジン
Dockerのコア。Dockerそのものっていう認識。 - コンテナ
超頻出。センター英語で言うとas long asぐらい頻出。うまく言語化するのが難しいけどプロセスの実行環境みたいな。ホストマシンからは分離された独立した環境。 - Dockerイメージ
これも超頻出。コンテナの設計図、なんて解説されたりもしているけど、調べてくうちに設計図兼ファイル群みたいなイメージなのかなと感じた。レイヤ構造になっていて理解するにはLinuxの知識がもっと必要だと感じたので要勉強。 - Docker Hub
大量のDockerイメージが保存されたクラウド。
プログラミング言語の実行環境や、DBサーバWebサーバのイメージなどが置いてあり、ここからイメージを引っ張ってくればあっというまに環境ができあがる。
インストール
※今回もmacでやってます
https://hub.docker.com/ からdmgファイル落としてきていつも通りのムーブでインストールしましょう。
前は特にアカウントとか要らなかった気がするけど、今は会員登録してダウンロードするらしい。
ちゃんと探せば会員登録しなくても落とせるリンクありそう。
brewをインストールしてあるなら以下でいけるはず
$ brew install docker
$ brew cask install docker
使ってみる
今回はnginxサーバ立ち上げてみました。
$ docker run [Dockerイメージ名]
-d バックグラウンド起動
-p ポートフォワード設定
--name コンテナに名前をつける
$ docker run -d -p 80:80 --name webserver nginx
Unable to find image 'nginx:latest' locally # nginxっていう名前のイメージをまずローカルで探してから、Docker Hubを見に行く
latest: Pulling from library/nginx
bc51dd8edc1b: Pull complete
66ba67045f57: Pull complete
bf317aa10aa5: Pull complete
Digest: sha256:ad5552c786f128e389a0263104ae39f3d3c7895579d45ae716f528185b36bc6f
Status: Downloaded newer image for nginx:latest
0d5655a34ba94e4cecad342f78e943830ea452f196ce5017464547266d6658b8
http://localhost:80 へアクセス
お手軽すぎてYABAI
- 立ち上げたコンテナ情報やイメージ情報確認
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 2073e0bcb60e 5 days ago 127MB
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0d5655a34ba9 nginx "nginx -g 'daemon of…" 8 minutes ago Up 8 minutes 0.0.0.0:80->80/tcp webserver
- コンテナへ接続
$ docker exec -it webserver(コンテナ名) /bin/bash
root@0d5655a34ba9:/# hostname
0d5655a34ba9
# ちゃんとnginxの設定ファイルもある
root@0d5655a34ba9:/# cat /etc/nginx/nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
- コンテナ停止
$ docker stop webserver
webserver
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# コンテナ停止しただけなので、イメージは残ってる
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 2073e0bcb60e 5 days ago 127MB
うんうん。
おわり
nginxはユーザ設定やパフォーマンスを少しいじったことがあるだけでインストールすらしたことありません。よくわからんけどなんか動いてる、っていうのはまさにこのこと。楽しいけど良し悪しあるなぁというのが本音です。(せっかくなのでnginxの勉強もします)
nginxコンテナを起動したわけですが、ここからの道のりはまだまだ長く。。
どうやってこの環境にアプリケーション持ち込むの?とか、
自分の好きな設定をいれたDockerイメージを作成したりとか、
コンテナはそれぞれが隔離された環境なのでコンテナ同士が通信できるようにしたりとか。
知らないといけないことは山積みなので定期的にインプット/アウトプットしていきます。
今回の学び
テザリングでのpullのし過ぎには気をつけましょう。