Posted at

docker初心者がいまいち理解できず調べ直したところまとめ

docker初心者の私が中級者になるためにいちから調べなおしました。

そのなかで一回読んだだけだとわからなかったり、いろいろな記事を読むことでわかるようになったことについてまとめます。


dockerのライフサイクル

dockerってなにがどうなって使える(実際にコンテナに入って作業ができる)ようになるのかがわかりませんでした。

まとめです。

docker_ライフサイクル.png

参考

http://enakai00.hatenablog.com/entry/20140628/1403933390

http://blog.kamiazya.tech/post/docker-lifecycle/


dockerとdocker-composeの違い

dockerを調べていると、dockerコマンドとdocker-composeコマンドの2つを目にします。

その違いについてです。

dockerは主に単一のコンテナの操作を行ったり(コンテナの起動や、コンテナのログの出力など)、docker全体の情報を出力したり(dockerのバージョンなど)するときに使います。

docker-composeは、複数のコンテナをまとめて管理することが可能になります。

コンテナのビルドから連携までをymlファイルを使って実行することができます。


そもそも複数コンテナはどんなときに作るのか?

webアプリを作成する場合、たいていはアプリのサーバーだけではなくDBも作ることになると思います。

これをdockerで動かす場合は、アプリで1コンテナ、DBで1コンテナ、とそれぞれ別のコンテナを使うことをお勧めされています。

参考:https://qiita.com/koka/items/3d3d4ee5680f92a0ad89#docker-compose


dockerにexecすると、常にルートディレクトリ

Linux系のOSでコンテナを作りログインすると、(ユーザーを作って指定しない限り)rootユーザーでログインすることになります。

ホームディレクトリは/rootなので、ログインしたときの最初のディレクトリ(ワーキングディレクトリ)も/rootになるはずと思っていたのですが、常にルートディレクトリ(/)になってしまいます。

ワーキングディレクトリはデフォルトで/になっています。

別のディレクトリにしたい場合は、コンテナを作成する時に設定が必要です。

$ docker run -it --workdir /root <IMAGE> bash

これでワーキングディレクトリが/rootになります。


-p と expose と -P

runコマンドのオプションに―p--expose-Pなどのポート関連のコマンドがいくつかあります。

それぞれどう使えばよいかわからなかったのでまとめます。


-p

コンテナのポートをホスト側に公開する。

$ docker run -it -p 8080:80 <IMAGE> bash

ホストで8080にアクセスすると、コンテナの80ポートにつながります。

(この時に--exposeなどをする必要はありません。)


--expose

コンテナのポートを公開する。ただしホストには公開しない。

$ docker run -it --expose 80 <IMAGE> bash

コンテナの80ポートが他のコンテナに対して公開されます。


-P

exposeされているポートをホスト側に公開する。

$ docker run -it --expose 80 -P <IMAGE> bash

ホスト側のポートは自動的に割り振られます。

上記のようにrunコマンドでexposeオプションを使った場合も、DockerfileにEXPOSE命令を書いた場合もホスト側に公開されます。