Apache Httpd 2.5系から同梱されるらしい、mod_systemd を導入してみる、そもそも、Docker HubのofficialなコンテナimageのCentOS 7系においてデフォルトではsystemdが利用できないらしい

パソコンを使い始めて、4年目を迎えました。いまも分からないことだらけですが、少しづついろんなことを覚えていきたいですね。

久々に小説を一気読みしてしまった...図書館で借りれたからつい。反省。

⇧  タイトルからも何となく分かる通り、ヘッドハンターの話なんですが、主人公の鹿子小穂が、諸事情により、30歳にしてヘッドハンターデビューという。いや、面白かったです。 

表紙の絵も2冊で1つになるという遊び心があって良い感じです、しかも夜から朝になるってところが何かを暗示してるような。

小穂さんは、むっちゃ成長しとるというのに、まったく成長の見られないボクです...

学習のモチベーションがだだ下がりですが、粛々と。

 

いや~、Dockerのコンテナimageでコンテナを作成したけど、見事にApache Httpdが起動していないという...

ts0818.hatenablog.com

⇧  この回の記事ですね。

 

で、ソースコードからインストールしたApache Httpdで、systemdによるhttpdの起動(systemctl start httpd)を実現する場合、 

blog.cles.jp

⇧  上記サイト様によりますと、「mod_systemd」っちゅうモジュールを自分でインストールしてくる必要があるようです。

Linuxディストリビューションのパッケージ管理ツール(CentOSだとyumUbuntuなんかだとapt)なんかでApache Httpdをインストールしてる場合は、「mod_systemd」を組み込んでくれてるようです。

Apache Httpd 2.5系からは、「mod_systemd」モジュールは同梱されるんじゃないかという専らの噂です。

 

というわけで、今回は、Apache Httpdサーバをsystemdで起動できるようにトライ。

コンテナimageはできたんですが、コンテナimageのサイズが大きすぎるのか、コンテナ化できないという現象が起き、Minikube内臓のDockerのデバイスのサイズを大きくできないところで、詰まっています...

例のごとく解決できていないので、お時間のある方のみご照覧ください。

 

Dockerのコンテナとsystemdの微妙な関係

そもそも、何で、Dockerコンテナにおいて、systemdが弾かれるのか?

blog.takekoshi.net

⇧  上記サイト様によりますと、「systemd」は「D-Bus」による接続を確立しようとし、Dockerコンテナ側はそれを許可しない、と。

そも、「D-Bus」とは何ぞ?

Wikipedia先生!

D-Bus (Desktop Bus) はメッセージバスと呼ばれる、アプリケーション間でやりとりを行うための、プロセス間通信(IPC:Inter-Process Communication)実装のひとつ。加えて、プロセスの生成期間を調節し、それらのサービスが必要なときに簡単に呼び出すことが出来るようにするものである。軽量さ、低依存度を保って開発されている。

D-Bus - Wikipedia

⇧  プロセス間のやり取り... 

D-BusKDE (バージョン2~3) 独自のIPC実装であるDCOP(Desktop COmmunication Protocol)から影響されて生まれ、KDE4 (Qt4) で採用された。

D-Bus - Wikipedia

KDELinuxGUI 環境が身近ですかね。 

GNOMEも独自のIPC実装であるBonoboからD-Busへ移行している。

D-Bus - Wikipedia

⇧  GNOMELinuxGUI 環境が身近ですかね。

Linuxでもudevによるマウントメッセージの通知を行う際にD-Busを使っている。

D-Bus - Wikipedia

⇧  「udev」は、「libudev」「udevd」「udevadm」 の3つで構成されてるらしい。

D-Busは現在、多くの言語とライブラリとのバインディングを持ち、C言語JavaC++C#PythonRubyPerlGTK+QtMaemo(携帯端末用のデスクトップ環境)などから利用出来る。

D-Bus - Wikipedia 

さらに、Unix系OSだけでなくWindows版も開発されている (winDBusという名前の別プロジェクト)。

D-Bus - Wikipedia

う、う~ん...。よく分からんですが、まぁ、プロセス間のやり取りを実現してると。「systemd」は、D-Busを利用してサービス(httpdサーバの起動とか)を実現しているという感じですかね。

 

で、何で「systemd」が、Dockerのコンテナにおいて『Failed to get D-Bus connection: Operation not permitted ...』とかを起こすのか?

www.slideshare.net

⇧  上記のAlsadiさんの話によると、コンテナには、大きく分けて、 

  • process containers
    • Dockerとか
  • system containers
    • LXD(Linux Continer)、OpenVZなど

の 2種類が存在するそうな。

あくまで、推測でしかないのですが、おそらく、Dockerのコンテナは、「process container」とあるように「プロセス」の1種ということで、プロセスの中で、プロセス間通信であるD-Busは利用できないという流れですかね?

 

Apache Httpdのmod_systemdとは?

ApacheHttpd Server Project の「mod_systemd」の説明によると、 

Apache Module mod_systemd

This module provides support for systemd integration. It allows starting httpd as a service with systemd Type=notify (see systemd.service(5) manual page for more information). It also provides statistics in systemctl status output and adds various directives useful for systemd integration.

mod_systemd - Apache HTTP Server Version 2.5

⇧  詳細は、「see systemd.service(5) manual page」ってあるんだけど、どこのことを言ってるか意味不明、っていうか何故にリンクを貼っとかんのかと。

おそらく、このページかと。

A unit configuration file whose name ends in .service encodes
information about a process controlled and supervised by systemd.

systemd.service(5) - Linux manual page

プロセスって言ってますね。

Dockerコンテナを利用しない場合のイメージ図は、

f:id:ts0818:20180902143317p:plain

⇧  こんな感じですかね。

Dockerコンテナを利用した場合のイメージは、

f:id:ts0818:20180902143428p:plain

 こんな感じですかね。

Dockerコンテナ内では、D-Busによる通信が確立できない(理由は分からず)ので、「systemctl start httpd」などのコマンドが実施できてないってことですかね?

で、「systemd.service(5)」の説明によると、systemdのプロセスの起動タイプには、 

  • simple
  • forking
  • oneshot
  • dbus
  • notify
  • idle

の 6つがあるようです。 

で、Apache Httpdの「mod_systemd」モジュールを利用すると、「systemd」のプロセスを『notify』というタイプで起動させることができ、Dockerコンテナ内でも「systemctl start httpd」などのコマンドが実施できるってことですかね?

 

 

デフォルトのCentOS 7系では、systemdは有効になっていない?

と思ったら、Dockerだけの問題ではなく、

forums.docker.com

dev.classmethod.jp

⇧  Docker Hubなんかの公式のCentOS 7系のコンテナimageでは、そもそも、デフォルトで、CentOS 7 系においてsystemdが有効になっていない、つまりシステム系のコマンドをサービス起動できないらしい...。

Systemd integration

Systemd is now included in both the centos:7 and centos:latest base containers, but it is not active by default. 

https://hub.docker.com/_/centos/

Docker HubのofficialCentOS 7系のコンテナimageは、デフォルトではsystemdが有効になっていないとのこと...

要するに、

Docker HubのOfficialなコンテナimageのCentOS 7系で、systemd を有効化

Apache Httpd 2.4系 で、mod_systemd モジュール導入によって、systemdを有効化

systemctl によるhttpdサービスの起動が可能

 

という流れですかね。サービス起動でなければ(systemctl を使わない起動)、普通に動くってことみたいです。 

利用するisoイメージによっては、最初からCentOS 7系で、systemdを有効にすることもできるのかもしれませんが。 

 

Docker HubからインストールしていたCentOS 7系のコンテナimageを、systemdを有効にしたものに作り直す

まずは、Docker HubからプルでインストールしていたCentOS 7.5.1804のコンテナimageを、systemdが利用できるように作り成すためのDockerfileを用意します。

自分は、「C:¥Users¥Toshinobu¥.minikube¥machines¥minikube¥minikube¥CentOSsystemdDockerfile」となるように作成しました。

f:id:ts0818:20180921221048p:plain

では、ファイルを編集。 

FROM centos:7.5.1804
ENV container docker
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/*;
VOLUME [ "/sys/fs/cgroup" ]
CMD ["/usr/sbin/init"]    

先頭の「From centos:7.5.1804」は、ご自分がプルしてきたタグ(バージョン)とかのものに合わせてください。

ファイルが編集できたら、保存し、このDockerfileを元に、ローカルにインストールしていたCentOSのコンテナimageから、systemdが有効になるCentOSのコンテナimageを新たに作成します。

 

ts0818.hatenablog.com

⇧  この回の記事で、Minikubeを導入したこともあって、今回は、MinikubeのDocker環境を利用していきます。

Dockerが使える環境であれば、Minikubeじゃなくても大丈夫です。ただ、Dockerfileを試したいので、Dockerの利用できる環境ということでMinikubeを使っています。

 

Minikubeで作成していた仮想マシンを起動し、

f:id:ts0818:20180921225045p:plain

Minikube内蔵のDocker daemon環境変数を通して、サーバ側でDockerが使える状態にしておきます。

f:id:ts0818:20180921225228p:plain

では、systemd を有効にした CentOS 7.5.1804のコンテナimageを作成。「コンテナimage」「タグ」は、適当な名前で大丈夫です。

docker build -f [Dockerfileまでのパス] -t [コンテナimageの名前]:[タグ] [Dockerfileが格納されてるディレクトリ]

f:id:ts0818:20180922141151p:plain

コンテナimageが出来上がりました。

f:id:ts0818:20180922141322p:plain

後半で、このコンテナimageを使っていきたいと思います。 

 

Apache Httpdに「mod_systemd」を導入してみる

systemdを有効にしなければいけないことが判明したわけですが、Apache Httpdの2.4系をソースコードからインストールした場合、mod_systemdというモジュールが同梱されていないため、別途、mod_systemdをインストールする必要があるようです。

 

mod_systemdの導入方法については、 

qiita.com

⇧  モジュールをコンパイルして導入する場合

qiita.com

⇧  モジュールをコンパイルせずに導入する場合

を参考にさせていただきました。

今回は、コンパイルする方法で。まずは、「mod_systemd.c」ってファイルをインストールせねば、なんですが、CentOS 7.5.1804を使っている場合、「systemd-devel-219-57.el7.x86_64.rpm」をインストールしておく必要があるらしい。

 

RPM resource systemd-devel(x86-64) で検索できるみたいです。

f:id:ts0818:20180902152801p:plain

⇧  「systemd-devel(x86-64)」と入力し、「Search...」をクリックで。

rpmパッケージが表示されました。

f:id:ts0818:20180902152846p:plain

今回は、「systemd-devel-219-57.el7.x86_64.rpm」 を利用ということで。リンクのアドレスをコピーして、適当なテキストエディターに貼り付けておきます。(各Linuxディストリビューションのパッケージ管理ツールでもインストールできるようなので、わざわざrpm形式のファイルをインストールしなくても良いのかもしれません。)

依存関係が多すぎたので、パッケージ管理ツールでインストールすることにします。

 

続きまして、「mod_systemd.c」を。

https://httpd.apache.org/dev/devnotes.html にアクセス。

f:id:ts0818:20180902155518j:plain

⇧  「Source Repositories」の「Trunk」をクリック。

「modules/」を選択。

f:id:ts0818:20180902155832j:plain

「arch/」 を選択。

f:id:ts0818:20180902155950j:plain

unix/」を選択。(Windowsの環境の場合は、おそらく「win32/」だと思われますが、今回は、仮想マシンのCentOS7.5.1804にインストールしたApache Httpdに対してのモジュール追加なので、「unix/」で。)

f:id:ts0818:20180902160158p:plain

「mod_systemd.c」を選択。

f:id:ts0818:20180902160525j:plain

「Links to HEAD」 の「download」のリンクアドレスをコピーし、適当なテキストエディターに貼り付けておきます。

f:id:ts0818:20180902161135j:plain

 

前前前回で作成していたDockerfileを編集していきます。

f:id:ts0818:20180902161432p:plain

 

FROM local/cent7.5.1804-systemd

#□□□ JAVAのインストール □□□#
# Java10用の変数(バージョン情報とか)
ARG jdk_version=10.0.2
ARG jdk_build_no=13
ARG jdk_hash_value=19aef61b38124481863b1413dce1855f
ARG jdk_rpm=jdk-${jdk_version}_linux-x64_bin.rpm

# Javaの環境変数のためのパス
ENV JAVA_HOME /usr/java/default

# yumのキャッシュをクリア
RUN yum clean all
# システム全体のアップデート
RUN yum -y update
# GPGキー(「GnuPG」(GNU Privacy Guard)という暗号化ソフトで生成される公開鍵。)のインストール
# ↑ パッケージが正しい配布先のものかどうかのチェックするもの
RUN rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
# wfetコマンドをインストール
RUN yum -y install wget

# JDK10のインストール
RUN wget -q \
         --no-check-certificate \
         --no-cookies \
         --header "Cookie: oraclelicense=accept-securebackup-cookie" \
         http://download.oracle.com/otn-pub/java/jdk/${jdk_version}+${jdk_build_no}/${jdk_hash_value}/${jdk_rpm} && \
    rpm -ivh ${jdk_rpm}


#□□□ Tomcatのインストール □□□#
# Tomcat9用の変数(バージョン情報とか)
ARG tom_magor=9
ARG tom_version=9.0.12

# Tomcatの環境変数のためのパス
ENV CATALINA_HOME /usr/local/tomcat-${tom_version}

# 環境変数に追加するためのパスを用意
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin

# Javaのクラスパスを用意
ENV CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar:$CATALINA_HOME/common/lib

# Javaのパス、Javaのクラスパス、Tomcatのパスを環境変数に追加
RUN export JAVA_HOME PATH CLASSPATH CATALINA_HOME

# Tomcatのダウンロード、展開(解凍)
RUN wget http://www-eu.apache.org/dist/tomcat/tomcat-${tom_magor}/v${tom_version}/bin/apache-tomcat-${tom_version}.tar.gz && \
    tar -xvzf apache-tomcat-${tom_version}.tar.gz && \
    mv apache-tomcat-${tom_version} /usr/local/tomcat-${tom_version}

# ユーザー「tomcat」を作成
RUN useradd -s /sbin/nologin tomcat

# Apache Tomcatの所有者を、ユーザー「tomcat」に設定
RUN chown -R tomcat:tomcat /usr/local/tomcat-${tom_version}

# host(Windows)側に用意したTomcatのserver.xmlを、コンテナ側にコピー
ADD ./tomcat_conf/server.xml /usr/local/tomcat-${tom_version}/conf/server.xml

# 起動スクリプト用
RUN cp /usr/local/tomcat-${tom_version}/bin/catalina.sh /etc/init.d/tomcat-${tom_version}
RUN chmod 775 /etc/init.d/tomcat-${tom_version}


#□□□ Apache Httpdのインストール □□□#
# Apache Httpdのインストールに必要な基本コマンド、開発ツールのインストール
RUN yum groups mark convert
RUN yum -y groupinstall base
RUN yum -y groupinstall development
RUN yum -y update

# Nghttp2に必要なライブラリのインストール
RUN yum -y install openssl-devel jansson-devel libev-devel c-ares-devel

#□□ Nghttp2のインストール □□#
# Nghttp2用の変数(バージョン情報とか)
ARG nghttp2_version=1.32.0

# Nghttp2最新版の情報 -> https://github.com/tatsuhiro-t/nghttp2/releases/latest
# Nghttp2のダウンロードと展開(解凍)
RUN cd /usr/local/src/ && \
    wget https://github.com/nghttp2/nghttp2/releases/download/v${nghttp2_version}/nghttp2-${nghttp2_version}.tar.gz && \
    tar xvzf nghttp2-${nghttp2_version}.tar.gz

# Nghttp2をコンパイルしてインストール
# HTTP/2 のライブラリ「libnghttp2」が /usr/local/lib 以下にインストールされます。
# Nghttp2 関連のコマンドは /usr/local/bin 以下にインストールされます。
RUN cd /usr/local/src/nghttp2-${nghttp2_version}/ && \
    ./configure -enable-app && \
    make && \
    make install

#□□ Brotliのインストール □□#
# Brotli用の変数(バージョン情報とか)
ARG brotli_version=1.0.5

# Brotliのコンパイルに必要なcmakeのインストール
RUN yum -y install cmake

# Brotli最新版の情報 -> https://github.com/google/brotli/releases/latest
# Brotliのダウンロードと展開(解凍)
RUN cd /usr/local/src/ && \
    wget https://github.com/google/brotli/archive/v${brotli_version}.tar.gz && \
    tar xvzf v${brotli_version}.tar.gz

# Brotliをコンパイルしてインストール
# Brotli のライブラリが /usr/local/lib 以下にインストールされます。
RUN cd /usr/local/src/brotli-${brotli_version}/ && \
    mkdir out && cd out && \
    ../configure-cmake && \
    make && \
    make test && \
    make install

# ライブラリへのパス追加
RUN echo /usr/local/lib > /etc/ld.so.conf.d/usr-local-lib.conf
RUN ldconfig

#□□  curlの最新版のインストール □□#
# curl用の変数(バージョン情報とか)
ARG curl_version=7.61.0

# curl最新版の情報 -> https://curl.haxx.se/changes.html
# curlのダウンロードと展開(解凍)
RUN cd /usr/local/src/ && \
    wget https://curl.haxx.se/download/curl-${curl_version}.tar.gz && \
    tar xvzf curl-${curl_version}.tar.gz

# curlをコンパイルしてインストール
RUN cd /usr/local/src/curl-${curl_version}/ && \
    ./configure && \
    make && \
    make install

# Apche httpdのコンパイルに必要なパッケージのインストール
RUN yum -y install pcre-devel expat-devel
# APR、APRUの最新版の情報 -> http://apr.apache.org/
#□□  APR(Apache Portable Runtime)の最新版のインストール □□#
# APR(Apache Portable Runtime)用の変数(バージョン情報とか)
ARG apr_version=1.6.5

# ARPのダウンロードと展開(解凍)
RUN cd /usr/local/src/ && \
    wget http://www-us.apache.org/dist//apr/apr-${apr_version}.tar.gz && \
    tar xvzf apr-${apr_version}.tar.gz

# APRをコンパイルしてインストール
RUN cd /usr/local/src/apr-${apr_version}/ && \
    ./configure && \
    make && \
    make install

#□□  APR-util(Apache Portable Runtime Utility)の最新版のインストール □□#
# APR-util(Apache Portable Runtime Utility)用の変数(バージョン情報とか)
ARG apr_util_version=1.6.1

# ARP-utilのダウンロードと展開(解凍)
RUN cd /usr/local/src/ && \
    wget http://www-us.apache.org/dist//apr/apr-util-${apr_util_version}.tar.gz && \
    tar xvzf apr-util-${apr_util_version}.tar.gz

# APR-utilをコンパイルしてインストール
RUN cd /usr/local/src/apr-util-${apr_util_version}/ && \
    ./configure --with-apr=/usr/local/apr && \
    make && \
    make install

# Apache httpd用の変数(バージョン情報とか)
ARG httpd_version=2.4.34

# Apache httpdのダウンロードと展開(解凍)
RUN cd /usr/local/src/ && \
    wget http://www-us.apache.org/dist//httpd/httpd-${httpd_version}.tar.gz && \
    tar xvzf httpd-${httpd_version}.tar.gz

# Apache httpdをコンパイルしてインストール
RUN cd /usr/local/src/httpd-${httpd_version}/ && \
    ./configure \
        --enable-http2 \
        --enable-brotli \
        --with-brotli=/usr/local/lib \
        --enable-ssl \
        --enable-md \
        --with-apr=/usr/local/apr \
        --with-apr-util=/usr/local/apr \
        --enable-so \
        --enable-mods-shared=all \
        --enable-mpms-shared=all \
        --enable-proxy \
        --enable-proxy-ajp \
        --enable-headers && \
    make && \
    make install

# Apache Httpdの設定ファイルのバックアップ
RUN mv -i /usr/local/apache2/conf/httpd.conf /usr/local/apache2/conf/httpd.conf.org
RUN mv -i /usr/local/apache2/conf/extra/httpd-ssl.conf /usr/local/apache2/conf/extra/httpd-ssl.conf.org

# host(Windows)側に用意したhttpdの設定ファイルを、コンテナ側にコピー
# Dockerfile内で利用の場合、docker cpはADDになる
ADD ./httpd_config/httpd.conf /usr/local/apache2/conf/httpd.conf
ADD ./httpd_config/httpd_ssl.conf /usr/local/apache2/conf/extra/httpd_ssl.conf

# apache 設定(httpd.confで、apacheユーザー、apacheグループを設定してるので、割愛)
# RUN chown -R apache:apache /var/www/html/

# apxs(APache eXtenSion tool)を含むhttpd-develのインストール
RUN yum -y install httpd-devel

# mod_systemd.cのコンパイルに必要なライブラリのインストール
RUN yum -y install systemd-devel

# Apache Httpdのモジュール、mod_systemd.cのダウンロード、コンパイル
RUN cd /usr/local/src/httpd-${httpd_version}/modules/arch/unix && \
    wget "https://svn.apache.org/viewvc/httpd/httpd/trunk/modules/arch/unix/mod_systemd.c?view=co" -O mod_systemd.c && \
    /usr/local/apache2/bin/apxs -c mod_systemd.c -I /usr/include/systemd/sd-daemon.h && \
    libtool \
      --silent \
      --mode=compile gcc -std=gnu99 -prefer-pic -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong \
      --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -D_LARGEFILE64_SOURCE -DLINUX -D_REENTRANT -D_GNU_SOURCE -pthread -I/usr/local/apache2/include -I/usr/local/apache2/include -I/usr/local/apache2/include -I/usr/local/apr/include/apr-1 -c -o mod_systemd.lo mod_systemd.c && \
    touch mod_systemd.slo && \
    libtool \
      --silent \
      --mode=link gcc -std=gnu99 -Wl,-z,relro,-z,now,-L/usr/lib64 -o mod_systemd.la -rpath /usr/local/apache2/modules -module -avoid-version mod_systemd.lo && \
    libtool \
      --silent \
      --mode=link gcc -std=gnu99 -Wl,-z,relro,-z,now,-L/usr/lib64 -o mod_systemd.la -rpath /usr/local/apache2/modules -module -avoid-version mod_systemd.lo -lsystemd-daemon

# mod_systemdのインストール
RUN cd /usr/local/src/httpd-${httpd_version}/modules/arch/unix && \
    /usr/local/apache2/bin/apxs -i -a -n systemd mod_systemd.la

# apache httpdのモジュールを共有ライブラリとして登録
RUN echo /usr/local/apache2/modules >> /etc/ld.so.conf
# スーパーユーザーに切り替え
USER root
# 共有ライブラリの依存関係情報を更新
RUN ldconfig

# host(Windows)側に用意したhttpdをサービスとして起動するための設定ファイルを、コンテナ側にコピー
ADD ./httpd_config/httpd.service /etc/systemd/system/httpd.service

# iptablesのインストール
RUN yum -y install iptables-services

# host(Windows)側に用意したiptablesの設定ファイルを、コンテナ側にコピー
ADD ./firewall/enforce_rules.sh /bin/firewall/enforce_rules.sh

# iptablesの設定。(HTTP(80/tcp) と HTTPS(443/tcp)の開放)
ENV CHAIN_NAME "CONTAINER-FIREWALL"
ENV ACCEPT_PORT "80,443"

# iptables、httpd、Tomcatの起動スクリプトの作成
RUN echo -e $'/usr/sbin/init\n\
systemctl daemon-reload\n\
sh /bin/firewall/enforce_rules.sh\n\
systemctl start httpd\n\
systemctl enable httpd\n\
/etc/init.d/tomcat-9.0.12 start\n\
/bin/bash' > /startService.sh

# スクリプトの権限
RUN chmod o+x /startService.sh

# 公開ポート(apache:80,tomcat:8888で空けてる)
EXPOSE 80 8888
    
CMD ["/startService.sh"]

という感じで、systemdが有効なCentOS7.5.1804のコンテナimageをベースに、Apache Httpd 2.43、Apache Tomcat 9.0.12、iptables-servicesなどなどを導入したコンテナimageを作成するにあたり、残りの必要なファイルは、 

ts0818.hatenablog.com

⇧  この回の記事で、作成してるのですが、

⇩  ディレクトリとファイルの構成がこんな感じで

f:id:ts0818:20180822170148p:plain

残りの、必要なファイルの内容は、 

Apache Httpd

httpd.conf

ServerTokens Prod
ServerSignature Off
HostnameLookups Off
ServerRoot "/usr/local/apache2"

Timeout 60

KeepAlive On
MaxKeepAliveRequests 1000
KeepAliveTimeout 5

<IfModule mpm_event_module>
    StartServers 3
    MinSpareThreads 75
    MaxSpareThreads 250
    ThreadsPerChild 25
    MaxRequestWorkers 400
    MaxConnectionsPerChild 0
</IfModule>

Listen 80
User apache
Group apache
ServerAdmin root@localhost
ServerName localhost:80

# Tomcatに連携
RewriteEngine on
ProxyPass   /  ajp://localhost:8002/

# Example:
# LoadModule foo_module modules/mod_foo.so
#
LoadModule mpm_event_module modules/mod_mpm_event.so
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
#LoadModule mpm_worker_module modules/mod_mpm_worker.so
LoadModule authn_file_module modules/mod_authn_file.so
#LoadModule authn_dbm_module modules/mod_authn_dbm.so
#LoadModule authn_anon_module modules/mod_authn_anon.so
#LoadModule authn_dbd_module modules/mod_authn_dbd.so
#LoadModule authn_socache_module modules/mod_authn_socache.so
LoadModule authn_core_module modules/mod_authn_core.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_user_module modules/mod_authz_user.so
#LoadModule authz_dbm_module modules/mod_authz_dbm.so
#LoadModule authz_owner_module modules/mod_authz_owner.so
#LoadModule authz_dbd_module modules/mod_authz_dbd.so
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule access_compat_module modules/mod_access_compat.so
LoadModule auth_basic_module modules/mod_auth_basic.so
#LoadModule auth_form_module modules/mod_auth_form.so
#LoadModule auth_digest_module modules/mod_auth_digest.so
#LoadModule allowmethods_module modules/mod_allowmethods.so
#LoadModule file_cache_module modules/mod_file_cache.so
#LoadModule cache_module modules/mod_cache.so
#LoadModule cache_disk_module modules/mod_cache_disk.so
#LoadModule cache_socache_module modules/mod_cache_socache.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
#LoadModule socache_dbm_module modules/mod_socache_dbm.so
#LoadModule socache_memcache_module modules/mod_socache_memcache.so
LoadModule watchdog_module modules/mod_watchdog.so
#LoadModule macro_module modules/mod_macro.so
#LoadModule dbd_module modules/mod_dbd.so
#LoadModule dumpio_module modules/mod_dumpio.so
#LoadModule echo_module modules/mod_echo.so
#LoadModule buffer_module modules/mod_buffer.so
#LoadModule data_module modules/mod_data.so
#LoadModule ratelimit_module modules/mod_ratelimit.so
LoadModule reqtimeout_module modules/mod_reqtimeout.so
#LoadModule ext_filter_module modules/mod_ext_filter.so
#LoadModule request_module modules/mod_request.so
#LoadModule include_module modules/mod_include.so
LoadModule filter_module modules/mod_filter.so
#LoadModule reflector_module modules/mod_reflector.so
#LoadModule substitute_module modules/mod_substitute.so
#LoadModule sed_module modules/mod_sed.so
#LoadModule charset_lite_module modules/mod_charset_lite.so
LoadModule deflate_module modules/mod_deflate.so
LoadModule brotli_module modules/mod_brotli.so
LoadModule mime_module modules/mod_mime.so
LoadModule log_config_module modules/mod_log_config.so
#LoadModule log_debug_module modules/mod_log_debug.so
#LoadModule log_forensic_module modules/mod_log_forensic.so
#LoadModule logio_module modules/mod_logio.so
LoadModule env_module modules/mod_env.so
#LoadModule mime_magic_module modules/mod_mime_magic.so
#LoadModule expires_module modules/mod_expires.so
LoadModule headers_module modules/mod_headers.so
#LoadModule usertrack_module modules/mod_usertrack.so
#LoadModule unique_id_module modules/mod_unique_id.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule version_module modules/mod_version.so
#LoadModule remoteip_module modules/mod_remoteip.so
#LoadModule proxy_module modules/mod_proxy.so
#LoadModule proxy_connect_module modules/mod_proxy_connect.so
#LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
#LoadModule proxy_http_module modules/mod_proxy_http.so
#LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
#LoadModule proxy_scgi_module modules/mod_proxy_scgi.so
#LoadModule proxy_uwsgi_module modules/mod_proxy_uwsgi.so
#LoadModule proxy_fdpass_module modules/mod_proxy_fdpass.so
#LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
#LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
#LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
#LoadModule proxy_express_module modules/mod_proxy_express.so
#LoadModule proxy_hcheck_module modules/mod_proxy_hcheck.so
#LoadModule session_module modules/mod_session.so
#LoadModule session_cookie_module modules/mod_session_cookie.so
#LoadModule session_dbd_module modules/mod_session_dbd.so
#LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
#LoadModule slotmem_plain_module modules/mod_slotmem_plain.so
LoadModule ssl_module modules/mod_ssl.so
#LoadModule dialup_module modules/mod_dialup.so
LoadModule http2_module modules/mod_http2.so
LoadModule md_module modules/mod_md.so
#LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
#LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so
#LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so
#LoadModule lbmethod_heartbeat_module modules/mod_lbmethod_heartbeat.so
LoadModule unixd_module modules/mod_unixd.so
#LoadModule heartbeat_module modules/mod_heartbeat.so
#LoadModule heartmonitor_module modules/mod_heartmonitor.so
#LoadModule dav_module modules/mod_dav.so
LoadModule status_module modules/mod_status.so
LoadModule autoindex_module modules/mod_autoindex.so
#LoadModule asis_module modules/mod_asis.so
#LoadModule info_module modules/mod_info.so
#LoadModule cgid_module modules/mod_cgid.so
#LoadModule dav_fs_module modules/mod_dav_fs.so
#LoadModule dav_lock_module modules/mod_dav_lock.so
#LoadModule vhost_alias_module modules/mod_vhost_alias.so
#LoadModule negotiation_module modules/mod_negotiation.so
LoadModule dir_module modules/mod_dir.so
#LoadModule actions_module modules/mod_actions.so
#LoadModule speling_module modules/mod_speling.so
#LoadModule userdir_module modules/mod_userdir.so
LoadModule alias_module modules/mod_alias.so
#LoadModule rewrite_module modules/mod_rewrite.so

<Directory />
    AllowOverride none
    Require all denied
</Directory>

<IfModule dir_module>
    DirectoryIndex index.html
</IfModule>

<Files ".ht*">
    Require all denied
</Files>

ErrorLog "logs/error_log"
LogLevel warn
<IfModule log_config_module>
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common
    <IfModule logio_module>
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>
    CustomLog "logs/access_log" combined
</IfModule>

<IfModule mime_module>
    TypesConfig conf/mime.types
    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz
</IfModule>

<IfModule mime_magic_module>
    MIMEMagicFile conf/magic
</IfModule>

EnableSendfile on
AddDefaultCharset Off

Include conf/extra/httpd-ssl.conf

<VirtualHost *:80>
    ServerName www.example.com
    Redirect permanent / https://www.example.com/
</VirtualHost>    

httpd_ssl.conf

Listen 443
SSLPassPhraseDialog builtin
SSLSessionCache "shmcb:/run/httpd/sslcache(1024000)"
SSLSessionCacheTimeout 3600
SSLRandomSeed startup file:/dev/urandom  256
SSLRandomSeed connect builtin
SSLCryptoDevice builtin
SSLStrictSNIVHostCheck off

SSLProtocol all -SSLv2 -SSLv3

SSLCipherSuite "ECDHE-ECDSA-AES128-GCM-SHA256 \
ECDHE-ECDSA-AES256-GCM-SHA384 \
ECDHE-ECDSA-AES128-SHA \
ECDHE-ECDSA-AES256-SHA \
ECDHE-ECDSA-AES128-SHA256 \
ECDHE-ECDSA-AES256-SHA384 \
ECDHE-RSA-AES128-GCM-SHA256 \
ECDHE-RSA-AES256-GCM-SHA384 \
ECDHE-RSA-AES128-SHA \
ECDHE-RSA-AES256-SHA \
ECDHE-RSA-AES128-SHA256 \
ECDHE-RSA-AES256-SHA384 \
DHE-RSA-AES128-GCM-SHA256 \
DHE-RSA-AES256-GCM-SHA384 \
DHE-RSA-AES128-SHA \
DHE-RSA-AES256-SHA \
DHE-RSA-AES128-SHA256 \
DHE-RSA-AES256-SHA256 \
EDH-RSA-DES-CBC3-SHA"

SSLHonorCipherOrder on
SSLCompression off

SSLUseStapling On
SSLStaplingCache shmcb:/run/httpd/stapling_cache(128000)

# For mod_md
#ManagedDomain www.example.com
#MDCertificateAuthority https://acme-v01.api.letsencrypt.org/directory
#MDCertificateAgreement https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf
#MDRenewWindow 33%

<VirtualHost *:443>

    ServerName www.example.com
    DocumentRoot "/usr/local/apache2/htdocs"

    <Directory "/usr/local/apache2/htdocs">
        Options FollowSymLinks
        AllowOverride None
        Require all granted
    </Directory>
	
    Protocols h2 http/1.1

    SetOutputFilter BROTLI_COMPRESS;DEFLATE
    SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip no-brotli dont-vary

    SSLEngine on
    Header always set Strict-Transport-Security "max-age=31536000"
    SSLCertificateFile /etc/pki/tls/certs/server.crt
    SSLCertificateKeyFile /etc/pki/tls/private/server.key

    ErrorLog "logs/error_log"
    CustomLog "logs/access_log" combined
</VirtualHost>   

httpd.service

[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target
Documentation=man:httpd(8)
Documentation=man:apachectl(8)
 
[Service]
Type=notify
ExecStart=/usr/local/apache2/bin/httpd $OPTIONS -DFOREGROUND
ExecReload=/usr/local/bin/httpd $OPTIONS -k graceful
ExecStop=/bin/kill -WINCH ${MAINPID}

KillSignal=SIGCONT
PrivateTmp=true

[Install]
WantedBy=multi-user.target

ここからは、Apache Httpdとは関係ないけど。

Apache Tomcat

server.xml

<?xml version='1.0' encoding='utf-8'?>
<Server port="8001" shutdown="SHUTDOWN">

  <!--APR library loader. Documentation at /docs/apr.html -->
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html -->
  <Listener className="org.apache.catalina.core.JasperListener" />
  <!-- Prevent memory leaks due to use of particular java/javax APIs-->
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <!-- JMX Support for the Tomcat server. Documentation at /docs/non-existent.html -->
  <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />

  <GlobalNamingResources>
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>

  <Service name="Catalina">

    <Connector port="8888" protocol="HTTP/1.1"
     connectionTimeout="20000"
     redirectPort="8443" />

    <Connector port="8002" protocol="AJP/1.3"
     redirectPort="8003" useBodyEncodingForURI="true"
     maxProcessors="160" minProcessors="5"
     acceptCount="100" debug="0" connectionTimeout="20000" />

    <Engine name="Catalina" defaultHost="localhost">
      <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">
           <Context path="/" docBase="/home/webapps/hogeapps">
             ...
           </Context>
      </Host>
    </Engine>
  </Service>
</Server>

■ ipatables-service

 

#!/bin/sh

echo "Checking for existing $CHAIN_NAME chain..."
iptables -S $CHAIN_NAME
if [ 0 -ne $? ];
then
    echo "No existing chain. Create new."
    iptables -N $CHAIN_NAME
fi

echo "Flushing and filling rule to only accept port $ACCEPT_PORT to the chain..."
iptables -F $CHAIN_NAME
iptables -A $CHAIN_NAME -m conntrack --ctstate RELATED,ESTABLISHED -j RETURN
iptables -A $CHAIN_NAME -m conntrack --ctstate INVALID -j DROP
IFS=','
for p in $ACCEPT_PORT
do
    iptables -A $CHAIN_NAME -p tcp -m conntrack --ctstate NEW --dport $p -j RETURN
done
iptables -A $CHAIN_NAME -j DROP
# print rule for confirmation
iptables -S $CHAIN_NAME

echo "Checking whether the $CHAIN_NAME chain enforced to the entrance network interface..."
iptables -S DOCKER-USER | grep $CHAIN_NAME
if [ 0 -ne $? ];
then
    EXTDEV=`ip route show | grep default | awk '{print $5;}'`
    echo "Currently not enforced. Enforcing the chain to $EXTDEV interface."
    iptables -I DOCKER-USER -i $EXTDEV -j $CHAIN_NAME
    # print rule for confirmation
    iptables -S DOCKER-USER | grep $CHAIN_NAME
fi

# wait infinitely
tail -f /dev/null

といった感じで、用意しましたら、コンテナimageを作成。

docker build [オプション] -t [コンテナimage名]:[タグ] [Dockerfileまでのパス]

f:id:ts0818:20180922141509p:plain

f:id:ts0818:20180922144651p:plain

コンテナimageができたようです。 

確認してみると、「REPOSITORY」が「cent_java_tom_httpd」というコンテナimageが作成されてるのが確認できました。

f:id:ts0818:20180922144748p:plain

 

コンテナimageから、コンテナを作成...できてない?

実際に、コンテナimageからコンテナを作成します。

Dockerのコマンドで、コンテナを作成する場合は、 

docker run -t -i [コンテナimageのRepository名]:[コンテナimageのタグ] /bin/bash

Kubernetesのコマンドで、コンテナを作成する場合は、

kubectl apply -f [pod用のマニフェストファイル] /bin/bash

でいけます。Kubernetesのコマンドを実施するには、Kubernetesの環境とkubectlコマンドをインストールしておく必要があります。(Minikube なら、Kubernetes環境とkubectlコマンドが用意された仮想マシンを作成してくれます。事前に、VirtualBoxなどの仮想化アプリケーションをインストールしておく必要があります)

knowledge.sakura.ad.jp

⇧  Minikubeの導入については、上記サイト様が詳しいです。 

 

自分の場合は、Minikubeを導入しているので、マニフェストファイルを作成して、kubectlコマンドで、コンテナを作成します。(Kubernetesの場合、Podというコンテナを管理するためのものも同時にできます、というより、Podが作成され、その中にコンテナができる感じですかね)

というわけで、マニフェストファイル(拡張子「.yml」)を作成します。 

「C:¥Users¥Toshinobu¥.minikube¥machines¥minikube¥minikube¥manifest¥pod.yml」 となる感じで用意しました。

f:id:ts0818:20180922151451p:plain

ファイルの中身は、こんな感じ。

apiVersion: v1
kind: Pod
metadata:
  name: httpd-tom-java
spec:
  containers:
  - name: httpd-tom-java
    image: cent_java_tom_httpd:10
    command: [ "/bin/bash", "-c", "--" ]
    args: [ "while true; do sleep 30; done;" ]
    ports:
    - containerPort: 80
  restartPolicy: OnFailure

ファイルが編集できたら、さっそくPodの作成。

f:id:ts0818:20180922152049p:plain

そしたらば、コンテナにログインしてみます。

Dockerのコマンドで、コンテナにログインする場合は、 

docker exec -it [コンテナ名] /bin/bash

Kubernetesのコマンドで、コンテナにログインする場合は、

kubectl exec -it [コンテナ名] /bin/bash

で、いけるのですが、コンテナ名は?ってことで、

Dockerのコマンドで、コンテナの一覧を表示する場合は、 

docker ps -a

Kubernetesのコマンドで、コンテナの名前を確認する場合は、

serverfault.com

⇧  ということらしいんですが、Podの中に複数コンテナがあった場合はどうするんでしょうね?

まぁ、今回は、1Podに対して、1Containarですけど。 

kubectl get pods --all-namespaces

f:id:ts0818:20180922153140p:plain

Minikubeの場合は、

minikube dashboard

で、ブラウザでKubernetesの状況が確認できます...が稀に上手くいかない時があるので、

f:id:ts0818:20180922153901p:plain

その場合は、一旦、仮想マシンを停止し、

minikube stop

再び、起動することで、Kubernetesクラスター環境も再度編成され、解消されると思われます。

minikube start

f:id:ts0818:20180922154243p:plain

f:id:ts0818:20180922154419p:plain

動いたらば、Dockerをサーバ側で使えるように、Docker daemonを起動しておきます。

f:id:ts0818:20180922154552p:plain

では、再度ダッシュボードへ。

f:id:ts0818:20180922154945p:plain

今度は、遷移できました...が、Podの起動に失敗してますね...

f:id:ts0818:20180922154904p:plain

f:id:ts0818:20180922155119p:plain

stackoverflow.com

⇧  どうやら、ローカルのコンテナimageを利用したい場合は、

The problem is with image pull policy - you have set thist to Always (default setting) and it meand that docker deamon tries alway to pull image from outer docker registry - and you want to use local one instead

try tu add --image-pull-policy=Never when creating deployment

good tutorial of using locally created image is here (it helped me):

https://kubernetes.io/docs/tutorials/hello-minikube/#create-a-docker-container-image

minikube - Kubernetes cannot pull image from private docker image repository - Stack Overflow

マニフェストファイルに、「imagePullPolicy: Always」以外を追加する必要がありそうです。

「imagePullPolicy: Never」を試したところ、

f:id:ts0818:20180922161702p:plain

f:id:ts0818:20180922161948p:plain

で、Podの状態が変わらず、「imagePullBackOff」... 

 

qiita.com

⇧  上記サイト様によりますと、「imagePullPolicy: IfNotPresent」でいけるそう。

ということで、Pod用のマニフェストファイルを修正。

apiVersion: v1
kind: Pod
metadata:
  name: httpd-tom-java
spec:
  containers:
  - name: httpd-tom-java
    image: cent_java_tom_httpd:10
    imagePullPolicy: IfNotPresent
    command: [ "/bin/bash", "-c", "--" ]
    args: [ "while true; do sleep 30; done;" ]
    ports:
    - containerPort: 80
  restartPolicy: OnFailure

そしたらば、Podにマニフェストファイルの差分を反映します。

kubectl apply -f [マニフェストファイル]   

f:id:ts0818:20180922163134p:plain

再度、ダッシュボードを見るも、

f:id:ts0818:20180922163539p:plain

変わらんやんけ~!

仕方がないので、一旦、Podを削除します。 

kubectl delete pods [Pod名] --grace-period=0 --force

f:id:ts0818:20180922163947p:plain

⇧  ダッシュボードのほうで見ると、反映されてないときがありますが、Podが削除されました。

では、再作成。

f:id:ts0818:20180922164219p:plain

まったく変わらず...何これ~

f:id:ts0818:20180922164323p:plain

ふと気になってコンテナimageの一覧を表示したら、作成してたコンテナimageが無くなっとったという...何故に?

f:id:ts0818:20180922171759p:plain

というわけで、再作成。 

f:id:ts0818:20180922172110p:plain

f:id:ts0818:20180922175004p:plain

作成されています。

f:id:ts0818:20180922175037p:plain

で、Podをまた作ったんだけど、同じ現象が。

f:id:ts0818:20180922175145p:plain

 で、Podのログを観てみたところ、

kubectl describe [pod名]

f:id:ts0818:20180922180219p:plain 

Status:       Failed
Reason:       Evicted
Message:      Pod The node was low on resource: [DiskPressure].

何ていうか、見事に失敗してますな。Nodeのリソースが足りなくなったらしい...っていうか、普通のWebアプリケーションも実装できないって...Minikubeで構築されたKubernetesの設定ドイヒーな気が....

ましてや、OracleDBとか入れる前でこれって...

 

ボヤキつつ、公式のサイトを見るも、

Configure Out Of Resource Handling - Kubernetes

⇧  具体的な例が載ってないという...終わってる。

とりあえず、

https://www.openstack.org/assets/presentation-media/How-to-build-scalable-reliable-and-stable-Kubernetes-cluster-atop-Openstack.pdf

によると、KubernetesのNodeのリソースの割当は下記のようになっているらしい。

f:id:ts0818:20180922195819p:plain

対応表が、こんな感じで、 

categories components solution ref
kubernetes system daemons kubelet,docker configure
--kube-reserved
[1]
OS system daemons etcd,flanneld,apiserver configure
--system-reserved
[1]
eviction thresholds kubelet configure
--eviction-hard
[1]
kube-system pods kube-scheduler,
kube-controller, kube-proxy,
prometheus, fluentd
configure
guaranteed QoS class
[2]
end-user pods   configure
needed QoS class
[2]

「solution」にあるように設定を修正するのに、「ref」の番号のものを参照ということらしい。

[1] Reserve Compute Resources for System Daemons: 

https://kubernetes.io/docs/tasks/administer-cluster/reserve-compute-resources/

[2] Configure Quality of Service for Pods:

https://kubernetes.io/docs/tasks/configure-pod-container/quality-service-pod/

 

仕方がないので、

Out of Resource Handling | Cluster Administration | OpenShift Container Platform 3.5

⇧  OpenShiftの情報を、参考に作業して参ります。

 まずは、Dockerのベースサイズを大きくするらしいんですが、Minikubeの内蔵しているDockerのストレージ・ドライバは、overlay2 らしい。

前途有望な overlay ですが、機能がまだ若く、プロダクションで使うべきではありません。特に overlay を使うと過度の inode 消費を引き起こします(特にイメージが大きく成長する場合)。また、RPM との互換性がありません。

overlay2 は同じ高速なユニオン・ファイルシステムを使いますが、Linux カーネル 4.0 で追加された 追加機能 を使います。これは過度のiノード消費を防ぐものです。

daemon — Docker-docs-ja 17.06.Beta ドキュメント

なんか、Minikubeって実用に耐えない感じなんすかね....

dockerd --storage-opt dm.basesize=50G

で、ベース・デバイスのサイズを指定して、

sudo service docker stop
sudo rm -rf /var/lib/docker
sudo service docker start

変更を反映できるらしいんですが、

dm.basesize

ベース・デバイス作成時の容量を指定します。これはイメージとコンテナのサイズの上限にあたります。デフォルトの値は 10GB です。 

ユーザはこのオプションを使ってベース・デバイス容量を拡張できますが、縮小はできません。

daemon — Docker-docs-ja 17.06.Beta ドキュメント

⇧  縮小できないって...欠陥品も良いとこじゃないすか...しかも、今回は、デバイス・ドライバーが、overlay2 なので、上記の例は、devicemapper というデバイス・ドライバーの オプションらしいので使えないという...

 

とりあえず、仮想マシンsshログインします。 

minikube ssh    

f:id:ts0818:20180922230019p:plain

そして、Dockerの公式通りにコマンド実行したら、

f:id:ts0818:20180922230316p:plain

⇧  見事に、権限で弾かれるという...Minikube内蔵のDockerは微妙に仕様が違うんですかね...ちょいちょい変えてくるの本当に止めて欲しい。

ということで、sudo付けたらいけるっしょ、と

f:id:ts0818:20180922230647p:plain

⇧  い、行けねぇ...

develop.logical-studio.com

⇧  上記サイト様によりますと、docker.pidっちゅうプロセスが、「/var/run/docker.pid」ファイルに記載されている内容と異なるらしいのが原因だとか。

systemctl status docker.service -l   

f:id:ts0818:20180922231403p:plain

⇧  壮絶な文字化けですが、かろうじて、プロセスIDが判明。2344 であると。

んじゃあ、「/var/run/docker.pid」を確認...

f:id:ts0818:20180922231707p:plain

できねぇじゃね~か!っていうか、Minikube使えね~。とりあえず、「:q!」でviエディタを終了。とりあえず、「/var/run/docker.pid」 ファイルを、「/home/docker」にコピーしときます。

f:id:ts0818:20180922233839p:plain

そしたらば、exitして、仮想マシンのIPをチェック。

f:id:ts0818:20180922234012p:plain

Teraterm仮想マシンに接続します。TeraTermをインストールしてない場合はインストールしちゃいましょう。

eng-entrance.com

 

時間の都合上、翌日へ。

Minikubeの場合は、必ず、Minikube内臓のDockerのdaemonを起動しておきましょう。

Dockerのdaemonの起動は、「minikube docker-env」で表示される、「@FOR /f "tokens=*" %i IN ('minikube docker-env') DO @%i」を実行すればOK。

f:id:ts0818:20180923104956p:plain

TeraTermを起動。「ホスト(T):」に、「minikube ip」で確認したIPアドレスを入力し、「OK」。

f:id:ts0818:20180923103036p:plain

「続行(C)」を選択。

f:id:ts0818:20180923104327j:plain

デフォルトだと、「ユーザー名(N):」に「docker」、「パスフレーズ(P):」に「tcuser」を入力し、「OK」。 

f:id:ts0818:20180923104307p:plain

仮想マシンssh接続ができてますが、「/home/docker/docker.pid」ファイルは見事に消え失せているという...仮想マシンを停止しちゃったせいですね...

f:id:ts0818:20180923105303p:plain

というわけで、 「su -」でrootユーザーになって(パスワードは、「tcuser」で)、ファイルをコピーして、「exit」で元のユーザーに戻ります。

f:id:ts0818:20180923105740p:plain

⇧  「/home/docker/docker.pid」が配置されました。 

DockerのプロセスIDも再確認。再起動したから変わってますね...

f:id:ts0818:20180923110057p:plain

Ctrl + C で処理を抜けて、SCPコマンドで、仮想マシンから、ホスト側(自分の場合ですと、Windows 10 Home)にファイルを送信。

scp -r [仮想マシンへのログインユーザー名]@[仮想マシンのIP]:[仮想マシン側のファイルまでのパス] [ホスト側でファイルを配置したいパス]

f:id:ts0818:20180923110609p:plain

配置されました。

f:id:ts0818:20180923111819p:plain

開いてみると、プロセスIDに差異はないようです。

f:id:ts0818:20180923111930p:plain

どうやら、 

docs.docker.com

dockerd is the persistent process that manages containers. Docker uses different binaries for the daemon and client. To run the daemon you type dockerd.

To run the daemon with debug output, use dockerd -D or add debug: true to the daemon.json file.

Note: In Docker 1.13 and higher, enable experimental features by starting dockerd with the --experimental flag or adding experimental: true to the daemon.json file. In earlier Docker versions, a different build was required to enable experimental features.

dockerd | Docker Documentation

⇧ 「/etc/docker/daemon.json」ファイルにexperimental: true を追加すると実験的な機能が使えるようになるらしい、そんなファイル無かったけどね。

f:id:ts0818:20180923124224p:plain

というわけで、作成。viエディターで新規作成。

sudo vi /etc/docker/daemon.json

f:id:ts0818:20180923124607p:plain

⇧ 「i」でINSERTモードになって、「{  "experimental": true }」 を入力し、「Esc」キーを押して、「:wq」を入力で、ファイルの内容を保存してviエディターを終了。

ややこしいんだけど、

docs.docker.com

⇧  Windowsを使っているけれど、Minikube内蔵のDockerのdaemonは、仮想マシンLinux カーネル上に構築されてるので、LinuxのほうのDockerの手順を参照ってことみたいですね...

というか、daemon.json自体が、Linuxしか使えないらしい...

Important: Setting hosts in the daemon.json is not supported on Docker for Windows or Docker for Mac.

Configure and troubleshoot the Docker daemon | Docker Documentation

「/etc/docker/daemon.json」の内容を反映するには、下記コマンドでいけるらしいですね。おりゃ~。

sudo systemctl daemon-reload   

f:id:ts0818:20180923130038p:plain

今度は、dockerd コマンド いける?

f:id:ts0818:20180923130458p:plain

⇧  はい、駄目でした。

なんだよ~、プロセスIDは、違ってないはずでしょうに。

一応、確認。 

ps aux | grep [d]ocker

結果

root      2343  3.4  3.5  806708 72280 ?        Ssl  01:28   5:59 /usr/bin/dockerd -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --tlsverify --tlscacert /etc/docker/ca.pem --tlscert /etc/docker/server.pem --tlskey /etc/docker/server-key.pem --label provider=virtualbox --insecure-registry 10.96.0.0/12
root      2349  0.1  0.9 1331220 18500 ?        Ssl  01:28   0:17 docker-containerd --config /var/run/docker/containerd/containerd.toml
root      2775  0.0  0.2    8928  4384 ?        Sl   01:28   0:00 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/84c73a6365126e8c7b46770a65d9d8a0790a0778bf5fba26e5322fa87952637a -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
root      2776  0.0  0.1    8928  3720 ?        Sl   01:28   0:00 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/96985e0868881f6dd664dd167ca4fb7418e831d8501589e45c56fe026dcc7c53 -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
root      2800  0.0  0.1    7520  3724 ?        Sl   01:28   0:00 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/3483777d9c3001202c093846fd3e97fc59c75295b11875060cecf4bc0dbfea22 -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
root      2826  0.0  0.2    7520  4372 ?        Sl   01:28   0:00 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/c533cdc2a2af07e897696a49c667971af7fc54a42bd68889a290c94c3af8323f -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
root      2840  0.0  0.1    8928  3740 ?        Sl   01:28   0:00 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/c5f80552469b69ba096a83a6f2072bdb4489dfdeb6eb47e1bf4d2551323330aa -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
root      2977  0.0  0.1    8928  3424 ?        Sl   01:28   0:00 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/a638155a1a6c1042b0fcc2f72196770e01f67107ec121bbf117e0de2a74577bf -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
root      2984  0.0  0.1    7520  3728 ?        Sl   01:28   0:00 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/67b53444ed8d33b56472660d12ede66b2d1bb656944bf53acbf6de85b943cbfe -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
root      2992  0.0  0.4   12228  8332 ?        Sl   01:28   0:04 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/7f89546ae0d6a0ca363ce218aa9dd3a0105bd8cf1dc8a3bd1bacb3bb8b1166e4 -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
root      3155  0.0  0.2    8928  4372 ?        Sl   01:29   0:00 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/a44018fe57cf7f699e24ea8e13b7c4325a7aa28834ed4c4e04e0692df79f7e08 -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
root      3288  0.0  0.1    7520  3736 ?        Sl   01:29   0:00 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/4556c815bb5d11597582f9834a35312bd5714f6bd930fde77fee44fc90b67386 -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
root      3305  0.0  0.1    7520  3748 ?        Sl   01:29   0:00 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/5dfae9fc96a8678a8944a15268958b4f2d189fcd1b4bf419a8d4fe38b31d508d -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
root      3354  0.0  0.2    8928  4364 ?        Sl   01:29   0:00 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/eff89598bb5c4a985413b4debd2352dacf0231507dbbd26cf3383c594a09cd47 -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
root      3370  0.0  0.1    7520  3732 ?        Sl   01:29   0:00 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/1a6050a75b1d7d4cbc201dd8d717a5675236f98fb085ba080f0c998f0b2bee02 -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
root      3472  0.0  0.1    7520  3728 ?        Sl   01:29   0:00 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/edde77482b6656ac7beb1d1566ff5c3ccfcc888008dfe77b19de43abb1298e15 -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
root      3479  0.0  0.1    7520  3756 ?        Sl   01:29   0:00 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/c3d98b44dcff6508af15321476a259985251327125a250ee45de7ab564f58111 -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
root      3575  0.0  0.2    7520  4376 ?        Sl   01:29   0:00 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/6384d20e33c17ec84ed41183f68028fb09b308a4b25292ba9f40d1510cb30af0 -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
root      3617  0.0  0.2    7520  4316 ?        Sl   01:29   0:00 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/3f14dd50700ba5c478f95c6bcd4ab162eb7bf5f94aeba776b2a8d48690c7e088 -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
root      3662  0.0  0.1    7520  3732 ?        Sl   01:29   0:00 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/560c9967a3b30bf56431e91fb742840151744dfa2306e28809f1ab24d6b4a82e -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
root      3703  0.0  0.1    8928  3728 ?        Sl   01:29   0:00 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/74ab9961ee78d38d7b90012e392a87ab283479a21d17cf458c212e09468beb2e -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
root      3891  0.0  0.1    8928  3728 ?        Sl   01:29   0:00 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/df4674c7af256add78d8e419b0d55975b6bdda00da1a4145198416dd2e7082fa -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
root      3893  0.0  0.1    8928  3732 ?        Sl   01:29   0:00 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/d448bd360e9ed81f14b153b61c5a8cb6ca0fc4a3f5f80f707f7812946d594802 -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
root      3926  0.0  0.1    7520  3724 ?        Sl   01:29   0:00 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/38640f705482f84e4d43d090f9241627b5bda04f7b57e38ec4c10164452f7528 -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
root      4107  0.0  0.2    8928  4376 ?        Sl   01:29   0:00 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/5456b2972f0ea3b8ae663154835bfa6e59a703a809017a5a4e2b4632150eb68b -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
root      4108  0.0  0.1    8928  3728 ?        Sl   01:29   0:00 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/2c4b6f8dd66d050b3f0f65e75fa00bc0982b115f77fa7ad04b1c29ede565e438 -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
root      4122  0.0  0.1    7520  3424 ?        Sl   01:29   0:00 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/a03408034984b4368986ae855ac5a1e208e3ebcf621851348ab58178a844eedf -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
root      4349  0.0  0.1    7520  3724 ?        Sl   01:29   0:00 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/9d20751e15590ebab8be9265f9620ea9d5ada39ae983e54dc3bf6abc6c7e0166 -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
root      4420  0.0  0.2    8928  4272 ?        Sl   01:29   0:00 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/c5548bee50e0c82145e79d620423e1a07235570609199e92fce6c53bb0eaf9d7 -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
root      4451  0.0  0.1    8928  3724 ?        Sl   01:29   0:00 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/8362f72bcaa42ac2c394eac2046a6e6bb81f322ec9903032b77a90c048ece842 -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
root      4551  0.0  0.2    7520  4244 ?        Sl   01:29   0:00 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/46c84b0f9ccf00875e6646d67be25f1635637a279888df78042b43c52b8cc3e3 -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
root      4782  0.0  0.1    8928  3484 ?        Sl   01:29   0:00 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/7f25a2f60861028f5d7e2abf3f0b24db873123ce749d6585bab98369f5b6eb40 -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
root      5001  0.0  0.1    7520  3428 ?        Sl   01:30   0:00 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/adcc310299965c3701176b7f385ec26bc2b7298029a686ea2e2004bd2975b03b -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
root      5045  0.0  0.1    7520  3428 ?        Sl   01:30   0:00 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/41fbee0060256378d849e530d111439ffbc42ac5091437bb98d47a7f911d6607 -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
root      5096  0.0  0.1    7520  3720 ?        Sl   01:30   0:00 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/0899673b3b003c94d584224ee5295ec924c2de0cd6de86889f7855ecc5066f62 -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
root      5307  0.0  0.1    8928  3756 ?        Sl   01:30   0:00 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/b8c74494a4220389e03b4304301ae937f93f643a5af368942c1fdb74d21e72ba -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
root      5413  0.0  0.1    7520  3724 ?        Sl   01:30   0:00 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/4ec4a4248dc85b5114b43a07d739f56f36e05b8264c0c0a7de81dd6f96117b01 -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
root      5475  0.0  0.1    8928  4076 ?        Sl   01:30   0:00 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/13e196cebdfd054b252d058aa19493de9c588c4248bd490eb3b5db27357e329b -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
root      5761  0.0  0.1    7520  3724 ?        Sl   01:30   0:00 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/437e88d542d4434acf519942a58893664f70214d05156e923ba3c12907f36977 -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
root      5961  0.0  0.1    7520  3736 ?        Sl   01:30   0:00 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/369058b84899f197c5a0bc3e2f84f7cc0f5cf0012d5bc7cc4300ad7f7a61393c -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
root     12633  0.0  0.2   22116  4544 ?        Ss   01:47   0:00 sshd: docker [priv]
docker   12768  0.0  0.1   22116  2992 ?        S    01:47   0:00 sshd: docker@pts/0
docker   12769  0.0  0.1   16236  3356 pts/0    Ss   01:47   0:00 -bash                                                                                                                                                                 

う、う~ん...問題なさげに見えますが。

github.com

⇧  上記サイト様の、deviantony 様を信じるしか無いかと。「/usr/lib/systemd/system/docker.service」を編集するようなので、一応、「home/docker」にバックアップを取っときます。

f:id:ts0818:20180923142327p:plain

では、ファイルの中身を見てみます。

[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network.target docker.socket
Requires=docker.socket

[Service]
Type=notify

# DOCKER_RAMDISK disables pivot_root in Docker, using MS_MOVE instead.
Environment=DOCKER_RAMDISK=yes


# This file is a systemd drop-in unit that inherits from the base dockerd configuration.
# The base configuration already specifies an 'ExecStart=...' command. The first directive
# here is to clear out that command inherited from the base configuration. Without this,
# the command from the base configuration and the command specified here are treated as
# a sequence of commands, which is not the desired behavior, nor is it valid -- systemd
# will catch this invalid input and refuse to start the service with an error like:
#  Service has more than one ExecStart= setting, which is only allowed for Type=oneshot services.
ExecStart=
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --tlsverify --tlscacert /etc/docker/ca.pem --tlscert /etc/docker/server.pem --tlskey /etc/docker/server-key.pem --label provider=virtualbox --insecure-registry 10.96.0.0/12
ExecReload=/bin/kill -s HUP

# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity

# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
TasksMax=infinity
TimeoutStartSec=0

# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes

# kill only the docker process, not all processes in the cgroup
KillMode=process

[Install]
WantedBy=multi-user.target

気になるとこといえば、ExecStart が2つあるということぐらいですかね。

と思ったら、

Start the daemon using operating system utilities

On a typical installation the Docker daemon is started by a system utility, not manually by a user. This makes it easier to automatically start Docker when the machine reboots.

The command to start Docker depends on your operating system. Check the correct page under Install Docker. To configure Docker to start automatically at system boot, see Configure Docker to start on boot.

Configure and troubleshoot the Docker daemon | Docker Documentation

⇧  の中の、Configure Docker to start on boot  のリンク先の「sudo systemctl enable docker」コマンド を実行しないといけないらしい、何じゃそりゃ...。

一旦、「Esc」キー、「:q」でviエディターを終了しておきます。

Configure Docker to start on boot

Most current Linux distributions (RHEL, CentOS, Fedora, Ubuntu 16.04 and higher) use systemd to manage which services start when the system boots. Ubuntu 14.10 and below use upstart.

systemd

$ sudo systemctl enable docker

Post-installation steps for Linux | Docker Documentation

dockerd コマンドが動いた!っと、

f:id:ts0818:20180923153132p:plain

思いきや、別のエラー...。

f:id:ts0818:20180923153207p:plain

daemon.json に追記するらしい。 

Configure the Docker daemon

There are two ways to configure the Docker daemon:

  • Use a JSON configuration file. This is the preferred option, since it keeps all configurations in a single place.
  • Use flags when starting dockerd.

You can use both of these options together as long as you don’t specify the same option both as a flag and in the JSON file. If that happens, the Docker daemon won’t start and prints an error message.

To configure the Docker daemon using a JSON file, create a file at /etc/docker/daemon.json on Linux systems, or C:\ProgramData\docker\config\daemon.json on Windows.

Configure and troubleshoot the Docker daemon | Docker Documentation

Configure the Docker daemon

Here’s what the configuration file looks like:

{
  "debug": true,
  "tls": true,
  "tlscert": "/var/docker/server.pem",
  "tlskey": "/var/docker/serverkey.pem",
  "hosts": ["tcp://192.168.59.3:2376"]
}

Configure and troubleshoot the Docker daemon | Docker Documentation

⇧  「/usr/lib/systemd/system/docker.service」の情報に合わせれば良いかと。

と思ったら、

qiita.com

⇧  上記サイト様によりますと、「/usr/lib/systemd/system/docker.service」「/etc/docker/daemon.json」でhostの設定がバッティングするらしい。

「/usr/lib/systemd/system/docker.service」の差分だけを編集する方法があり、「drop-in」というらしいです。

sudo systemctl edit docker.service    

⇧ 上記コマンドで「/etc/systemd/system/docker.service.d/override.conf」というファイルが作成されるので、

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd  

f:id:ts0818:20180923172031p:plain

として保存。続いて、「/etc/docker/daemon.json」を編集。

sudo vi /etc/docker/daemon.json    

f:id:ts0818:20180924164411p:plain

⇧ 「i」でINSERTモードになって編集したらば、「Esc」キーを押下、その後で、「:wq」でファイルの内容を保存し、viエディターを終了。 

一応、systemdに反映してみたものの、

sudo systemctl daemon-reload

なんか、Docker daemon の再起動も要るみたい

sudo systemctl restart docker

f:id:ts0818:20180924170043p:plain

⇧  status 的には問題は無さげですかね。Ctrl + Cで抜けられます。

 

というわけで、overlay2の場合のストレージ・ドライバのサイズの拡張は、 

OVERLAY2 OPTIONS

overlay2.size

Sets the default max size of the container. It is supported only when the backing fs is xfs and mounted with pquota mount option. Under these conditions the user can pass any size less then the backing fs size.

Example
$ sudo dockerd -s overlay2 --storage-opt overlay2.size=1G

dockerd | Docker Documentation

でいけるらしい、 

sudo dockerd -s overlay2 --storage-opt overlay2.size=50G

 

f:id:ts0818:20180924170132p:plain

⇧  い、行けねぇじゃね~か!出た出た、docker is not runningって...

動いてるから!「Main PID: 3232(dockerd)」 で動いてるから!

 f:id:ts0818:20180924170313p:plain

⇧  「/var/run/docker.pid」 も、同じプロセスIDになってるんですけど...

f:id:ts0818:20180924194456p:plain

⇧  dockerd -v 、dockerd --help だけは普通に動くっぽいけど... 

 

ちょっと、MinikubeとDockerのコラボレーションによる闇が深すぎて、心が折れたので、また、しばし、調査に戻ります。2週続けて、三連休を無駄にしてしまった...

解決法をご存知の方おりましたら、教えていただけると助かります。

未だ解決できずに申し訳ないですが、今回はこのへんで。

 

 

 

番外編

Minikube内臓のDockerが...サーバ側が壊れたっぽい...

f:id:ts0818:20180923204041p:plain

なんか、よく分からんけど、Minikubeのシステム自体が、コンテナでできていのかは知らんけど、Docker daemon が止まると、 

f:id:ts0818:20180924150154p:plain

⇧  Minikube 系のコマンドが、ほとんど機能しなくなるらしい...とりあえず、Ctrl + C で処理を抜けるしかないかと。

Minikube 使えなさ過ぎる...

github.com

⇧  Minikubeでの仮想マシン停止ができなくなったっす...「/etc/docker/daemon.json」とか作って、Docker daemonを再起動とかが良くなかったのか...

「/etc/docker/daemon.json」を削除して、

一旦、強制終了。

■ VBoxManage コマンドの場合

f:id:ts0818:20180924151331p:plain

VirtualBox マネージャーの場合

VirtualBox マネージャーで、仮想マシン上で右クリックし、「閉じる」>「電源オフ」

f:id:ts0818:20180924151130p:plain

どちらの方法も、電源オフ なので、あまり宜しくないとは思いますが。

f:id:ts0818:20180923204446p:plain

で、再起動すると、復帰しました。

f:id:ts0818:20180924154546p:plain

作業してたファイル(daemon.json とか)は根こそぎ消えたけど...。 

 

f:id:ts0818:20180924154707p:plain