youchanさんの超わかりやすい解説
youchanさんの解説がわかりやすい!
Dockerfileとは
イメージを作るもの
Dockerfile
⇩build
イメージ
⇩ run
コンテナ
tera ディレクトリを作り中に入る
Dockerfileを書く(拡張子はいらないよ)
FROM alpine
$ docker build -t temple .
Sending build context to Docker daemon 2.048kB
Step 1/1 : FROM alpine
---> 11cd0b38bc3c
Successfully built 11cd0b38bc3c
Successfully tagged temple:latest
イメージができる
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
temple latest dcb037e1d29b 38 seconds ago 9.5MB
alpine latest 11cd0b38bc3c 3 weeks ago 4.41MB
$ docker run --rm temple uname -a
--rm
コンテナが終わったときにに消してくれる
$ docker run --rm -it temple /bin/bash
→エラーになる
なぜならalpineにはbashが入ってないから(/bin/ashならある)
alpineにbashを入れよう
Dockerfileに追記
FROM alpine
RUN apk add --no-cache bash
apk
alpineのパッケージマネージャ
add
インストールしますよ
no cache
キャッシュを残すか残さないか
bashというものをインストールしますよ
イメージをビルドする
$ docker build -t temple .
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM alpine
---> 11cd0b38bc3c
Step 2/2 : RUN apk add --no-cache bash
---> Running in 530b0832e9b9
(1/5) Installing ncurses-terminfo-base (6.1-r0)
(2/5) Installing ncurses-terminfo (6.1-r0)
(3/5) Installing ncurses-libs (6.1-r0)
(4/5) Installing readline (7.0.003-r0)
(5/5) Installing bash (4.4.19-r1)
Executing bash-4.4.19-r1.post-install
Executing busybox-1.28.4-r0.trigger
OK: 13 MiB in 18 packages
---> d2dcae436873
Removing intermediate container 530b0832e9b9
Successfully built d2dcae436873
Successfully tagged temple:latest
runしてみる
$ docker run --rm -it temple /bin/bash
今度はちゃんと動く
bashをインストールすることができました!
Dockerfileの書き方
先頭は
FROM このイメージをベースに作りますよ
RUN その後ろに書いてあるコマンドを実行しますよ
youchan解説
dockerイメージ = ディスク
alpineのディスクが作られる
その上でapkというalpineのコマンドが実行され
ディスクの上に新しくbashが乗っかる
さらにrubyを乗っける
データが差分でディスクの上に積み重なっていくイメージ
それがstep
step(1/5) とかstep(2/5) とか
違い
RUN apk add --no-cache bash ruby と
RUN apk add --no-cache bash
RUN apk add --no-cache ruby の違い
前者:一つのものとして扱える
後者:個別で積んでいく方が管理しやすい
ファイルを作って実行してみよう
$ docker run --rm -it temple ruby progress.rb
ところが!エラーになる
Traceback (most recent call last):
ruby: No such file or directory -- progress.rb (LoadError)
なぜか
macのローカルとコンテナの間は今行き来ができない
Dockerコンテナの中で動いているプログラムにローカルのファイルをどうやって渡してあげるか?
WORKDIR /temple ・・・作業ディレクトリ/templeを作る
COPY progress.rb . ・・・ファイルをコピー ピリオドはカレントディレクトリのこと templeの下にコピーするということ
CMD ruby progress.rb ・・・ルビーで実行するよというコマンド 何も指定しなかったときにこのコマンドが実行される
$ docker run --rm -it temple
もちろん $ docker run --rm -it temple ruby progress.rb でもできる
なぜ実行できるようになったか?
COPYによって、dockerイメージ中にあるファイルを実行するようにしたから
イメージの階層としては
/temple
progress.rb
$ docker build -t temple .
最後のピリオドがコンテキストだよllminatoll.icon
このピリオドはローカル(Mac)を指している
階層:ローカルを指していることと、イメージ内とがあるので意識する
ローカルファイルを変更したら、いちいちdocker buildせずに反映したい!
FROM ruby:alpine
RUN apk add --no-cache bash
WORKDIR /temple
Dockerコンテナ内のファイルシステムに、ローカルのディレクトリの一部を組み込んじゃう、ということ
-v
ローカルのディレクトリ : コンテナ内のディレクトリ
${PWD}は今いる場所のフルパスが得られる変数
$ docker run --rm -it -v ${PWD}:/temple temple ruby progress.rb
Rails
FROM ruby:alpine
RUN apk add --no-cache bash tzdata libxml2-dev libxslt-dev sqlite sqlite-dev nodejs
WORKDIR /temple
COPY Gemfile .
RUN set -ex \
&& apk add --no-cache --virtual .build-dep build-base \
&& gem install nokogiri \
-- --use-system-libraries \
--with-xml2-config=/usr/bin/xml2-config \
--with-xslt-config=/usr/bin/xslt-config \
&& bundle install \ gemファイルの中に書かれているgemをインストールしてください
&& apk del .build-dep build-depと名付けたビルドツールはビルドするためには必要ないので消してる
$ docker run --rm -it -v pwd:/temple -p 3000:3000 temple rails server
-p
Railsはもともとが3000番
ローカルホストの3000番に飛ばす、という意味
$ source .aliases
でエイリアス登録
$ rails
と打つだけで上のコマンドを打ったことになる
$ rails g scaffold memos title:string body:text
アプリ作る
$ docker run --name=temple-db -e POSTGRES_PASSWORD=topsecret -d -p 5432:5432 postgres:alpine
-e 環境変数
-d デーモンとして起動するよ(データベースマネージャ)
postgresがデフォルトで5432というポートを使う
$ rails db:create db:migrate
DBを使い始めるための準備