はじめに
この記事は、2018年8月4日に新宿で行われた、第1回Dockerハンズオン初心者・中級者編で学んだことを自分なりにまとめた記事になります。
Docker Image
簡単にいうと、Docker Imageはディスクイメージに該当する。インストールされたソフトウェアが入っているような感じ。
docker run
(実行)することで、docker container
(実行状態となっているもの)が生成される。
Dockerfileとは?
FROM ruby:alpine
RUN apk add --no-cache bash tzdata libxml2-dev libxslt-dev sqlite sqlite-dev nodejs postgresql-dev
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 \
&& apk del .build-dep
その名の通りDockerのファイル。
ルールとして、各行の先頭は必ず大文字で命令するコマンドを記述する。
コマンド | 意味 |
---|---|
FROM | Docker Imageをどこから引っ張ってくるか |
RUN | 引数に指定したコマンドを実行する |
WORKDIR | ディレクトリの指定 |
COPY | コピーの実行 |
Dockerfileはdocker run
ではなく、docker buid
を実行することで、Docker Image
を作成する。
ビルドする際のコマンドとしては、次の通り。
docker build -t ディレクトリ名 コンテキスト(実行するファイルパスなど)
# example
docker build -t hogehoge .
ビルドがちゃんとできているかどうかは、docker images
コマンドを実行することで確認可能。
$ 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 imageを使って、docker runすることで実行します。
なお、docker run
は実行させるごとに新しいコンテナを作成します。
$ docker run --rm ディレクトリ名 uname -a
Dockerfileに記述したコマンドが実行されるごとに、Dockerというコンテナにディスクが積み木のようにどんどん積み重なっていくイメージをすれば感覚が掴みやすいかも。
--rm
オプションについて
--rm
オプションはdocker runによって実行したコマンドが終了した後に、docker container自体も消去してくれるもの。
ここでちょっと思い出して欲しいのが、docker containerは、実行後に停止する性質を持っているということ。
ただし、停止されるのはプロセス(実行されたプログラム)だけで、docker container自体が停止する訳ではない。
そのため、そのままにしておくと、停止されたdocker containerはdocker rm
などをしない限り、どんどんたまっていってしまう。
--rm
オプションをつけることで、後から不要なdocker containerを削除する手間が省けるのがメリットと言えるかな。
dockerfileにrubyをインストールするコマンドを記述する
RUN apk add --no-cache bash ruby
RUNはdocker build
した時に、実行する処理を記述するもの。
ここでは、apkというパッケージ管理ツール(yumやaptみたいなもの)を使って、bashとrubyをインストールする処理を書いている。
ただ、ここで使っているalpineには、ruby用にフォーマットされたdocker image
であるruby:alpine
がすでにあるので、それを使うのもあり。
FROM ruby:alpine
docker runでコマンドラインからrubyを実行する
次のようにdocker runの引数にrubyコマンドを渡せば、引数に渡した処理を実行する。
docker run --rm -it temple ruby -e '(0..100).each{|i| print ("\r%3d%% "%i+"|"*i); sleep 0.1}'
ハンズオンで使用した参考サイト