docker

第1回Dockerハンズオン初心者・中級者編で学んだことをまとめてみた

はじめに

この記事は、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}'

ハンズオンで使用した参考サイト

http://youchan.org/docker-handson/#20

https://scrapbox.io/llminatoll/MT_D_handson