docker

お前らのdocker記事はもう古い!

煽り記事で申し訳ありません

インフラエンジニアとして、Dockerを少し触りましたが、最近のやり方(systemd導入)をあっちこっち調べ回ることになり、慣れの果てをQiitaにポストしようと思いました。

既にdockerの操作に慣れ親しんでいる皆様におかれましては大変申し訳有りませんが、ただのdocker入門記事になりますので、良記事にするためにバシバシご指摘いただければと思っております。

Dockerfile作ればいいんでしょ?

はい、そうです。
Dockerfileを作れば簡単に自分の思い通りのLAMPサーバを構築できます。
しかし、centos7系(systemd)にトラップがいくつか仕組まれており、そう簡単にhttpdを起動させることができませんでしたので、起動できるまでをご紹介いたします。

というわけで手っ取り早くどうすればいいのかを書いていきます。

■ Terminal

~/ $ vim Dockerfile

■ Dockerfileの中身

#
# LAMP Base
#
# 20150223
#   CentOS 7.1 +epel
#   Apache 2.4
#   MySQL 5.6
#   PHP 7.1

FROM centos:7
LABEL maintainer="kashima"

# update yum
RUN yum update -y && \
    yum clean all

# epel repo
RUN yum install -y epel-release && \
    yum clean all

RUN yum install -y httpd php && \
    yum clean all && \
    systemctl enable httpd.service

COPY ./index.html /var/www/html/index.html

CMD /sbin/init

■ index.htmlの中身

ok.

Point 1.

以下が重要なサービス起動に関する記述です。

RUN yum install -y httpd php && \
    yum clean all && \
    systemctl enable httpd.service

yum installとyum cleanが全て正常に完了したら、サービスをenableにしてください、という内容です。

httpdを起動する際に、ENTRYPOINTを使うんだとか、CMDで起動できるとか、CMDでenableにしてないからだとかdocker-composeを使うんだとか色々引っかかってくるわけですが、どれも間違いです。(たぶん)
正しくは、上記の通り、yum install後にenableするのが正解です。
これは、docker hubのコミュニティに記載があります。
https://hub.docker.com/r/centos/systemd/

この方法以外で起動する方法はありません。(たぶん)

もうここだけでいろんな情報漁って答えが見つからないのでかなり疲れました。

Point 2.

ビルド方法は後述しまして、先にdockerの動かし方です。
dockerの起動時ですが、centos7を使っている場合は、SELinuxが有効なシステムになりますので、privilegedを使います。
SELinuxのないシステムでは、--cap-add=SYS_ADMINを使えばOKです。

■ Terminal

~/ $ docker run --rm --privileged -dit --name {container name} -p 10080:80 {image name}

--privilegedは特権設定です。
特権設定がないと、centos7は、Failed to get D-Bus connection: Operation not permittedが発生します。
ちなみに、--privilegedをつけた状態で、ENTRYPOINTを使って、httpdをstartしようと頑張っても、なぜかFailed to get D-Bus connection: Operation not permittedが発生しますので、迷宮入りすることになります。

--nameでcontainer nameをつけると、docker rm {container name}で削除できて楽です。
container idでdocker rm {container id}とすれば削除することは可能ですが、container idが毎回変わり、docker ps -aで調べられるのですが、正直めんどうなので{container name}を指定すると楽になります。

Dockerfileのビルド

これは何の変哲もない感じになります。

■ Terminal

~/ $ docker build -t {image name} ./

もしくは

~/ $ docker build -t {image name} ./Dockerfile

Dockerへのログイン方法

上記のPoint 2.の方法はログインせず、起動だけにとどまります。
ログインする方法はいくつかあるようですが、下記の方法でアクセスします。

~/ $ docker exec -it {container name} /bin/bash

docker attach {container name}という方法もありますが、こちらを実施するには、docker実行時に/sbin/initを末尾に追加しておく必要があるようです。(たぶん)
でも、確実にログインできたのが前者でしたので、こちらを推します。

おまけ

エラーになった!エラー情報が欲しい!

起動するときのoptionに--rmがありますので、--rmを消して起動します。
docker ps -aでexitしたときのエラーコードが見れます。
さらに、以下のコマンドで最後に出力されたログ情報を見ることができます。

■ Terminal

~/ $ docker logs {container name}

エラーメッセージが表示されたら頑張ってググってください。