目的
新しいプロジェクトを作ることになった。
今までvagrant, virtual boxで仮想環境を作りその上のcentOSで開発をしていた。
詳しいことはわからないが、dockerはこのご時世必須らしい。
あと、バイトでやってたところがdockerで環境構築していて、vagrant使っていた自分からすれば、爆速かつ簡単で素晴らしかった。
大きな目的はdockerのコンテナ上で開発環境を作ること。
この記事ではdocker のコンテナ上でrails s
して、
chroamでhello ruby on rails を表示することを目的にする。
ちなみにMac High Sierraがhost OS。
docker運用のイメージ的なもの
既存のdocker imageを持ってくる
↓
ちょっと書き換えて自分の使いやすいようなimageにカスタマイズする(Dockerfile作る)
↓
自分のためのイメージ作る(docker build)
↓
イメージからコンテナを起動
↓
コンテナ上のcentOS6の上でrails server 立てる
やったこと, 手順
docker インストール
ユーザー登録しないとダメだったが無料で落とせる。
Dockerfileの作成とdocker build
FROM centos:centos6 # centOS6のイメージを持ってくる(dockerが用意してくれている)
MAINTAINER user
RUN mkdir -p /work # hostと共有するフォルダ
というファイルをhostOSのどこかに作る。
どこでもいい。
とりあえず~/myproject/docker-test /Dockerfile
に作った。
とりあえず、共有フォルダだけ作ったが、他にも何かインストールしておきたいとかいうのを
ここに書いてしまってもいい。
例えば、RUN yum -y install gcc
みたいに。
docker build -t test .
これはtestというタグ名でDockerfileをビルドしてくれという命令。
これをやるとimageを作ってくれる。
docker images
でimageが作成されたことを確認できる。
いらないimageは
docker rmi <imageの名前 or ID>
でけせる。
コンテナを起動
docker ps -a
で今のコンテナの状態がわかる。
-aオプションで起動してないコンテナも含めた全てを表示してくれる。
起動まえは多分何も表示されない。
docker run -i -d -p 8080:3000 -v "${PWD}:/work" --name 'rails' test
でtestという名前のimageからコンテナを起動。
-i : 標準入力を続ける
-d : バックグラウンドで起動
-p: ポート番号指定
-v : コンテナ側のどこのpathにファイル群を送るか(この場合 /work)
--name: 名前を指定(rails という名前でコンテナ起動)
docker ps -a
で起動したことを確認。
lsof -i:8080
でも確認。
ここで8080がホスト側のport番号であることに注意。
つまりあとでrails sした時はlocalhost:8080にサーバがたつ。
コンテナに入る
docker exec -it rails /bin/bash
rails という名前のコンテナに入る
-i:標準出力を続ける
-t: 疑似ttyを割り当てる
らしい
参考↓
https://www.nyamucoro.com/entry/2018/01/11/224932
https://qiita.com/toshihirock/items/22de12f99b5c40365369
ファイル共有を確認できる。
hostでDockerfileと同じ階層のファイルを変更するとちゃんとguestの/work下も変わる
簡単!!
vagrantで時間と手間と精神力その他etc...etc...を失っていたのはなんだったのか。
コンテナから出るのはexit,
コンテナを終了させるのは
docker stop コンテナ名 or ID
コンテナを削除するのは
docker rm コンテナ名 or ID
rails プロジェクトを作る
省略する、長くなるので
別記事に書いた
https://qiita.com/Umibows/items/db4509969cd3725ff310
必要なライブラリとかインストールしてrails newしてbundle installすればいい。
あとは個別に必要な物とかを入れる。↑
で、いよいよrails s
する。
前にも書いたが、hostのportは8080番なのでlocalhost:8080にchroamからアクセスすると
hello画面でた。