見出し画像

Dockerを雰囲気で使ってるみんなへ(Docker勉強記録)

正直に自白すると、この一年間雰囲気でDockerを使っていました。

コンテナ技術について体系的に勉強したことはなく、簡単なdocker-compose.ymlとDockerfileをなんとなく書き、docker-composeコマンドだけを使って生き延びてきました。

しかしながらエンジニア2年目を迎えた今、このまま現状を放置するのは色々とまずいです。

Dockerが見えないところでどう動いているのか理解し、docker-compose.ymlに書かれている意味を理解するためにも、一から勉強することにしました。


使った教材

今回使用した教材はいつもお馴染みのUdemyです。

割と丁寧に図解されていたり、コマンドの解説がちょくちょく入っていて理解しやすかったです。

ただしDockerのバージョンが古くて設定などで結構差異があったのはご愛敬。

[Udemy]ゼロからはじめる Dockerによるアプリケーション実行環境構築


忘れてたこと

・docker runコマンド

ほぼdocker-composeしか使ってなかったので、そういえばそんなのあったね…ぐらいの感覚でした。

docker runを分解すると以下のようになります。

1. docker pull:イメージをDocker Hubから取得する。
2. docker create:イメージからコンテナを作成。
3. docker start:コンテナを起動する。

またローカルにイメージが保存されるため、2回目以降はpullが必要なくなります。

・docker runの-itオプション

-i:標準入力を取得して双方向に接続できるようにするためのもの
-t:コンテナ内にttyを割り当てる

これらをつけないとシェルが即座に終了してコンテナが閉じてしまう

・docker runの-vと-pオプション

-v <ホスト側のディレクトリ>:<コンテナ側のマウントポイント>:<オプション>
例:-v /some/content:/usr/share/nginx/html:ro

存在しないボリュームの場合、新規作成される。

roはread onlyの意味。

-p <ホスト側のポート番号>:<コンテナ側のポート番号>

・dockerイメージ

レイヤー層を積み重ねる形なのは覚えていたのですが、同じイメージを継承することで二重管理の必要がなくなり、イメージサイズの容量削減になるのは知りませんでした。

Udemyの内容ではないですがイメージに関してはこのスライドがとてもわかりやすかったです。


そもそも知らなかったこと

・存在を知らなかったコマンド集

docker images:ローカルにダウンロードしているイメージ一覧を表示する。
docker tag docker-image:元となるイメージ名に対して新しいイメージ名を設定する。
docker inspect docker-image:イメージの詳細情報を表示する。
docker rmi docker-image:ローカルのイメージを削除する。-fオプションでコンテナ毎強制削除。
docker cp <コンテナ上のコピーしたいファイルのパス> <コピー先のパス>
docker pause:一時停止
docker commit <コンテナ名 or コンテナID> <イメージ名>:<タグ名>:どのような変更を加えたのかわからなくなってしまうので、通常はDockerfileで変更する
docker attach --link <コンテナ名 or コンテナID>:<リンク先コンテナの別名>

・whalesayイメージ

docker run docker/whalesay cowsay Hello!

スクリーンショット 2020-05-17 1.41.57

・Dockerfileでのイメージレイヤー

今までDockerfileそのものが一つのイメージレイヤーになると勘違いしていたのですが、実際にはDockerfile内のCOPYやRUNなどのそれぞれが一つのレイヤーになるらしい。

・Docker Machine

Docker Engineを搭載した仮想マシンの作成や起動などをコマンドラインから実行できるツール。

ローカルだけでなくリモートのクラウドプロバイダでDockerホストを立ち上げることも可能。

正直使い所がいまいちわからなかった。(オンプレで環境を分離させたい時とかに使うのかな?)

・docker volume, bind mount, tmpfs

ボリュームの管理。

docker volume create my-vol 作成
docker volume ls 一覧
docker volume inspect my-vol 詳細
docker volume rm my-vol 削除

docker runにボリュームを紐づけるマウントオプション。

--mount source=copy-vol,destination=/etc/nginx
docker run -itd --name bind-test1 -v "$(pwd)"/source:/app nginx
自動的にホストの現在のディレクトリに新規のsourceディレクトリが作成される

docker run -itd --name bind-test2 --mount type=bind,source="$(pwd)"/source2,target=/app nginx
-vの時はマウント対象が存在しない場合エラーとなる

tmpfsの使い方

docker run -itd --name tmptest2 --mount type=tmpfs,destination=/app,tmpfs-size=500000000,tmpfs-mode=700 nginx
メモリサイズを500MBに設定して、ファイルモードを700に設定

・Swarm mode

クラスタ管理機能やオーケストレーション機能を利用することができる。


まとめ

思ってた以上に忘れていたことや知らなかったことが多く、特にイメージやタグの管理などはほとんどしていなかったため勉強になりました。

また苦手だったボリュームとマウントの違いやtmpfsをちゃんと理解し直すことができたのでやってよかったと思います。

やはりdocker-composeと言ってもただ単なるdockerコマンドの集合体でしかないので、使いこなすにはちゃんとdocker自体を理解する必要があるんだと強く感じました。

ただ自分の場合、docker machineやSwarm modeがほとんど使う機会がなさそうなのが残念です。

これで雰囲気Dockerユーザーからは脱却できたので、次はKubernetesにも挑戦していきたいです。

この記事が気に入ったらサポートをしてみませんか?