dockerfileを作成してみた

今更ながら開発環境用にとdockerをインストールしたので、基本となるdockerfileを作ってみた。

設定内容

  1. centosで作成(latest→7.5.1804)
  2. rootパスワード設定
  3. 開発者ユーザ(グループ)の作成
  4. TimezoneをUTC→JTC
  5. localeを日本語へ
  6. ssh設定(sshfsを考え中)
  7. その他使いそうなものを適当にインストール

dockerfile

FROM centos:latest

MAINTAINER tabucchi

#--------------------------------
#Timezone設定
#--------------------------------
ENV TZ="Asia/Tokyo"

#--------------------------------
#各ユーザの設定
#--------------------------------
ENV root_password=rootpass
ENV developer_user_name=developer
ENV developer_user_password=developerpass

#--------------------------------
#locale設定
#--------------------------------
RUN localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG="ja_JP.UTF-8" \
    LANGUAGE="ja_JP:ja" \
    LC_ALL="ja_JP.UTF-8"

#--------------------------------
#rootパスワード設定
#--------------------------------
RUN echo "${root_password}" | passwd --stdin root

#--------------------------------
#開発者グループ作成
#--------------------------------
RUN groupadd -g 61000 developer
RUN echo "%developer ALL=(ALL) ALL"       >> /etc/sudoers
RUN echo "Defaults visiblepw"             >> /etc/sudoers

#--------------------------------
#開発者ユーザを作成
#--------------------------------
RUN useradd -g developer -m ${developer_user_name}
RUN echo "${developer_user_name}:${developer_user_password}" | chpasswd
RUN gpasswd -a ${developer_user_name} developer

#--------------------------------
#必要なものパッケージのインストール
#--------------------------------
RUN yum -y upgrade
RUN yum clean all
#systemd設定
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == \
systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;

RUN yum -y install less
#manのために再インストール
RUN yum -y reinstall glibc
RUN yum -y install man
RUN yum -y --setopt=tsflags="" install man-pagess

RUN yum -y install openssh-server
RUN yum -y install openssh-clients
RUN yum -y install sudo
RUN yum -y install wget
RUN yum -y rsync
RUN yum -y install which
RUN yum -y install git 
RUN yum -y clean all

#--------------------------------
#ssh設定
#--------------------------------
RUN cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup

RUN sed -ri "s/^UsePAM yes$/UsePAM no/g" /etc/ssh/sshd_config
RUN sed -ri "s/^PasswordAuthentication yes$/PasswordAuthentication no/g" /etc/ssh/sshd_config
RUN sed -ri "s/^#PermitEmptyPasswords no$/PermitEmptyPasswords no/g" /etc/ssh/sshd_config
#下記はデフォルトで有効のためコメントアウト
#RUN sed -ri "s/^ChallengeResponseAuthentication yes$/ChallengeResponseAuthentication/ no/g" /etc/ssh/sshd_config
RUN sed -ri "s/^#PermitRootLogin yes$/PermitRootLogin no/g" /etc/ssh/sshd_config

#--------------------------------
#service設定
#--------------------------------
RUN systemctl enable sshd.service

#--------------------------------
#systemd設定
#--------------------------------
VOLUME [ "/sys/fs/cgroup", "/run" ]

CMD ["/usr/sbin/init"]

rootパスワードや開発者ユーザ(グループ)部分は変数にして簡単に変更できるようにしてます。 もちろんですが、サンプルなのでこのままの使用は厳禁です。

sshdをserviceに登録しようとすると「Failed to get D-Bus connection: Operation not permitted」とエラー。 調べてみると、「docker run」で特権モード(privileged)して解決してるところが多かったが・・・特権なんておいそれと渡していいものなのかと疑問符がついたので、下記の「Dockerfile for systemd base image」辺りから参考にしました。
https://hub.docker.com/_/centos/

「VOLUME」部分は「/run」を追加しないとMacでは動かないため下記を参考に。
https://www.ikemo3.com/inverted/docker/centos7/

また、TimezoneがJSTにできなかったので下記を参考にさせて頂きました。
http://yoru9zine.hatenablog.com/entry/2017/01/12/224637

manを入れたのはおまけです(笑)

あとは下記コマンドな感じで終わりです。 「docker run」と「dokcer exec」が周りくどいのは上記のsshdとserviceのエラーのリンク先をご覧ください。

ビルド時

docker build -t centos_latest:test -f ./Dockerfile --force-rm --no-cache ./

docker run -d --hostname centos_test --name centos_test -v /sys/fs/cgroup:/sys/fs/cgroup:ro centos_latest:test /sbin/init
docker exec -i -t -u developer centos_test /bin/bash

起動時

docker start
docker exec -i -t -u developer centos_test /bin/bash

あとは環境によってnginx、apache、DBとか入れるとりあえずはこんなもんかな?
port設定もそのときに考えよう。

追記(2018/09/05)

centosのversion書き忘れてました。

[developer@centos_test /]$ cat /etc/redhat-release 
CentOS Linux release 7.5.1804 (Core)