Dockerを使う(基本編2)

参考リンク

Dockerfile リファレンス

Docker Hub

alpine とは

色々docker情報を漁っていると出てくるalpineだが、組み込み系でよく使われているBusyBoxをベースにしたLinuxディストリビューションの一種で、別にDocker専用の何かではない。(ちなみにjessiestretchはDebianのバージョン名になる。)

特徴としては、とても小さいパッケージで、数MBぐらいらしいので、気軽にポンポンとコンテナ立ち上げてもリソース的に困らないので、みんな使っている。ベースとなるホストのディストリビューションと異なっても基本的に問題ないらしい。

ただし、立ち上げたalpineコンテナ内で、マイナーライブラリをビルド&導入は難しいかもしれない。(極限までファイルをそぎ落としているので)あくまで動作させたいミドルウェアを起動すための基盤だと割り切ったほうがいい。

とりあえずコンテナOSを使ってみる

  • alpineイメージの取得~コンテナ実行

まず最新版イメージを取得する。

> docker pull alpine
Using default tag: latest
latest: Pulling from library/alpine
bdf0201b3a05: Pull complete
Digest: sha256:28ef97b8686a0b5399129e9b763d5b7e5ff03576aa5580d6f4182a49c5fe1913
Status: Downloaded newer image for alpine:latest

> docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
alpine              latest              cdf98d1859c1        11 days ago         5.53MB

次にコンテナを生成する。基本オプションは以下の通りで、大抵のコンテナはずっとバックグラウンドで起動していたいはずなので、以下のオプションはほぼデフォルトになる。

オプション 内容
--name 展開するコンテナに名前を付ける
-it コンテナのプロセスにttyを割り当てる
-d バックグラウンド実行

コマンドの最後にbin/shを指定してシェルを起動する。するとコマンドは、バックグラウンド指定しているので、すぐに終了してしまう。docker ps -aで確認すると、ちゃんとバックグラウンドで起動中であることが分かる。

> docker run -it -d --name alpine01 alpine bin/sh
27f83d80803157119f9848489560aa1d716828aba295ebb0c9483d63df467d18

> docker ps -a
 docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
27f83d808031        alpine              "bin/sh"            26 seconds ago      Up 25 seconds                           alpine01

バックグラウンドで起動しているalpineに対してシェルを-itオプション付きで実行すると、コンテナ内にログインしたような感じになる。

exitでホストOSに戻ることができる。この後でプロセスを確認すると、まだalpine01が起動中であることが分かる。alpineのOS上で動作するシェルを実行しているだけで、exitして終了したのはシェルだけということになる。

> docker exec -it alpine01 bin/sh
/ # ls /etc
ls /etc
TZ              group           logrotate.d     network         profile.d       shells
alpine-release  hostname        modprobe.d      opt             protocols       ssl
apk             hosts           modules         os-release      resolv.conf     sysctl.conf
conf.d          init.d          modules-load.d  passwd          securetty       sysctl.d
crontabs        inittab         motd            periodic        services        udhcpd.conf
fstab           issue           mtab            profile         shadow
/ # exit

> docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
27f83d808031        alpine              "bin/sh"            13 minutes ago      Up 4 minutes                            alpine01

似たような操作でdocker attachコマンドがある。こちらでもコンテナの中に入る?ことができる。ただし、exitしたあとにdocker ps -aで確認すると、コンテナが停止状態(Exited)になっている。アタッチはOSコンテナそのものへ接続して、それをexitするのだから停止状態?と理解している。

> docker attach alpine01
/ # cd /home
/home # ls
/home # echo "hello" > hoge
/home # cat hoge
hello
/home # pwd
/home
/home # ls
hoge
/home # exit

> docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
27f83d808031        alpine              "bin/sh"            20 minutes ago      Exited (0) 4 seconds ago                       alpine01

停止したalpineを起動する場合は、docker startを使う。

> docker start alpine01
alpine01
> docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
27f83d808031        alpine              "bin/sh"            26 minutes ago      Up About a minute                       alpine01
-->