対象
「docker, docker」ってよく聞くけど、いまいちよくわからない
仮想環境らしいんだけど、VMWareとかと何が違うの??
って人向けです
そして先に謝っておくと、あんまり詳しいことは質問されてもわかりませんので質問はしないで。。。
用意したPC
mac 2台(MacA, MacB[新品状態])
最初に
自分はDocker完全な素人です
全部調べながらやりました
まずは何から?
どうやらdockerを使うためにはdockerをインストールするらしい
こちらを参考にアカウントを作成し"docker desktop for mac"をインストールします
DockerをMacにインストールする
これが終わるとdockerのアプリが使えるようになって、コマンドラインでdockerコマンドが使えるようになります
$ docker version
これでdockerを使う準備完了!
で、、、dockerってなに?
こちらを参考に読んだけど、、、
【図解】Dockerの全体像を理解する
正直最初は全然理解できなかった・・・
現時点での自分のざっくりとした知識
ホスト型仮想化(今までの仮想環境)
virtual boxやVMWareといったソフトを利用して、そこにOSをインストールして使う(PCもう一台買ったようなイメージ)
コンテナ型仮想化(docker)
自分のMac内にコンテナと呼ばれる独立スペースを一気に用意する(rubyとかのインストールは自分のMacにインストールされるのではなく、コンテナ内だけにインストールされる)
docker使うと何がうれしいの?
OSのインストールとかが不要だし、OSの起動とかしなくてもいきなり使える
コンテナってやつはDockerfileというものを使って、簡単に環境構築できるので、
MacAでDockerfileを使って作成した環境は、MacBで同じDockerfileを使ったら同じコンテナが作成できる!
$ docker build
Dockerfileさえあれば、これだけでみんなと同じ環境が作れる!
開発環境を構築するときに「rubyやpostgresのバージョンは?」とか確認しなくても大丈夫
Dockerfileとは
コンテナを一気に作ってくれる設定ファイルっぽい
docker hubにいろんな設定が用意されているので、それを呼ぶだけで簡単にrubyとかのインストールが終わる!
https://hub.docker.com/_/ruby
下のほうにあるバージョンから選べばいいだけ
FROM ruby:2.6.3
デメリット
元となるPCのOSが同じじゃないとうまく動かない可能性がある
(Macなら"docker desktop for mac"が同じなら大丈夫)
実際に使ってみた
実務でrailsとnuxtを使っているので、両方混ぜたやつで試してみた
Nuxt.js + Rails(API) on DockerのHello Worldするべ!
こちらのページを参考に、MacAでなんとか動くものができた!
https://github.com/aiyu427/docker_sample
こちらをMacB[新品状態]で簡単に動かせたら満足
MacBでgit clone
READMEに書いたことを実行すると、、、
無事に動いた!!
(途中でnuxt.configが上書きされていて動かなくなったことを何度も繰り返したけど、、、)
まとめると・・・
rubyやpostgresとか何もインストールすることなく同じ開発環境が構築できて感激!
豆知識
コンテナはどこに作られる?
macのストレージはコンテナを作るたびに使われていく
コンテナ作ってもdockerアプリの容量は変わらない(当然なんだけど、、、)
dockerのデータフォルダはどこ??
ls -lh ~/Library/Containers/com.docker.docker/Data
これがdockerで設定した仮想ディスクイメージサイズに当たるっぽい
macのストレージで認識されるのは使っている分だけみたい (2.2 GB used)
よくわからないけどストレージ仮想化?とかの仕組みが使われているのかな
dockerはlinux上じゃないと動かない?
でもMacはlinux環境ではない
じゃあなんで動くの??
"docker desktop for mac"をインストールしたときに、実は仮想環境でlinuxが用意されているらしい!
そのlinux環境上でdockerを動かしているんだって
Reset Disk Image してもデータが残ってた!
先ほどのdocker_sampleアプリでデータを作成したけど、
勉強のためにResetして作り直してみた
なのにDBにデータが残ったままになっていた!
なんで??
docker-compose.ymlの設定でvolumesが重要!
services:
db:
container_name: sample_db
image: postgres:11.4-alpine
environment:
- TZ=Asia/Tokyo
volumes:
- ./api/tmp/db:/var/lib/postgresql/data
この最後の行の意味が重要だった
「:」は左と右を分けるコロンだった
(「db:」って何かを意味するフォルダだと思っていた・・・)
ローカル:./api/tmp/db
コンテナ:/var/lib/postgresql/data
こんな感じで設定していたみたい
シンボリックリンク貼ってるみたいな感じなのかな
実際のデータはローカルの"./api/tmp/db"に残ってるみたい
ここを
volumes:
- "db-data:/var/lib/postgresql/data"
volumes:
db-data:
にすると、docker内にVolume(コンテナの仲間みたいなもの)が作られて、そこに保存されるみたいです
Volumeに保存しているとReset Disk Imageしたら消えちゃいます
containerの中で作業したい
コンテナをチェック
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e9b045a393fc app_api_web "/bin/sh -c 'rm -f t…" 2 hours ago Up 14 seconds 0.0.0.0:3000->3000/tcp app_api_web_1
app_api_web_1のコンテナに入る
$ docker exec -it app_api_web_1 bash
これでコマンド動かせます
root@e9b045a393fc:/app_api#