Panda Noir

JavaScript の限界を究めるブログでした。最近は幅広めに書いてます。

とりあえず動かしたい!Dockerいじり

f:id:panda_noir:20180317135616p:plain

対象読者

イメージとかコンテナとかどうでもいいんじゃ!動かして覚えるからサンプルよこせ!という方。僕自身「よくわからんけどなんか動いたぞ!」レベルなので。

できるようになること

詳しい解説は他の方がいくらでも書かれているので、解説はしません。というかできません。

この記事は「コピペするだけで動くモノを作れる」だけです。

Dockerをインストールする

CentOS7を対象に書きます。他のOSの方は各自お調べください。

$ sudo yum -y install docker

インストールしたら起動します。

$  sudo systemctl start docker

Dockerfileを書いてwebサーバーを建てる

もういきなりサンプルに入ります。まず、適当なところにdocker/というフォルダを作成してください。場所はどこでもかまいません。

docker/内にDockerfileを設置します。

Dockerfile

# alpineをベースにする
FROM alpine

# 必要なものをインストール
RUN mkdir -p /etc/apk && echo "http://alpine.gliderlabs.com/alpine/edge/main" > /etc/apk/repositories &&\
    apk update && apk add --update --no-cache openrc nginx curl git

# 初期設定
RUN sed -i 's/#rc_sys=""/rc_sys="lxc"/g' /etc/rc.conf &&\
    echo 'rc_provide="loopback net"' >> /etc/rc.conf &&\
    sed -i 's/^#\(rc_logger="YES"\)$/\1/' /etc/rc.conf &&\
    sed -i '/tty/d' /etc/inittab &&\
    sed -i 's/hostname $opts/# hostname $opts/g' /etc/init.d/hostname &&\
    sed -i 's/mount -t tmpfs/# mount -t tmpfs/g' /lib/rc/sh/init.sh &&\
    sed -i 's/cgroup_add_service /# cgroup_add_service /g' /lib/rc/sh/openrc-run.sh &&\
    sed -i '1s/^/pid \/var\/run\/nginx.pid;\n/' /etc/nginx/nginx.conf && nginx

# ローカルにあるファイルをDocker内にコピーする
COPY nginx/default.conf /etc/nginx/conf.d/default.conf
COPY html /var/www/html

EXPOSE 80
# nginxを起動
CMD ["nginx", "-g", "daemon off;"]

最後にnginx/html/を用意します。

nginx/default.conf

server {
  listen 80;
  location / {
    root /var/www/html;
    index index.html;
  }
}

html/index.html

<!DOCTYPE html>
<html lang="ja">
<meta charset="UTF-8">
<title>Docker</title>
<h1>Hello Docker!</h1>

最後にビルドして実行しましょう!

$ sudo docker build -t test-image --no-cache=true --force-rm=true .
$ sudo docker run -d -p 8080:80 --name test-container test-image

建てたサーバーにアクセスしてみます。

$ curl localhost:8080
<!DOCTYPE html>
<html lang="ja">
<meta charset="UTF-8">
<title>Docker</title>
<h1>Hello Docker!</h1>

解説

まあ解説出来るほど理解できていないので、「どこをどうすると、どう動くのか」解説します。

まず、今回建てたサーバーは、docker/ディレクトリ内のファイルを使ってサーバーを建てています。そのため、docker/内のファイルを変えて再ビルドするとサーバーの内容が変わります。

試しにhtml/index.htmlの内容を書き換えて再ビルドしてみましょう。

html/index.html

<!DOCTYPE html>
<html lang="ja">
<meta charset="UTF-8">
<title>Docker</title>
<h1>Hello Docker!</h1>
<p>
  I'm in Docker.
</p>
$ sudo docker stop test-container
$ sudo docker rm test-container
$ # test-containerを停止させる
$ sudo docker build -t test-image --no-cache=true --force-rm=true .
$ # test-imageを再ビルド
$ sudo docker run -d -p 8080:80 --name test-container test-image

こうするとI'm in Docker.が追加されます。