パソコンを使い始めて、4年目を迎えました。いまも分からないことだらけですが、少しづついろんなことを覚えていきたいですね。
久々に小説を一気読みしてしまった...図書館で借りれたからつい。反省。
⇧ タイトルからも何となく分かる通り、ヘッドハンターの話なんですが、主人公の鹿子小穂が、諸事情により、30歳にしてヘッドハンターデビューという。いや、面白かったです。
表紙の絵も2冊で1つになるという遊び心があって良い感じです、しかも夜から朝になるってところが何かを暗示してるような。
小穂さんは、むっちゃ成長しとるというのに、まったく成長の見られないボクです...
学習のモチベーションがだだ下がりですが、粛々と。
いや~、Dockerのコンテナimageでコンテナを作成したけど、見事にApache Httpdが起動していないという...
⇧ この回の記事ですね。
で、ソースコードからインストールしたApache Httpdで、systemdによるhttpdの起動(systemctl start httpd)を実現する場合、
⇧ 上記サイト様によりますと、「mod_systemd」っちゅうモジュールを自分でインストールしてくる必要があるようです。
各Linuxディストリビューションのパッケージ管理ツール(CentOSだとyum、Ubuntuなんかだとapt)なんかでApache Httpdをインストールしてる場合は、「mod_systemd」を組み込んでくれてるようです。
Apache Httpd 2.5系からは、「mod_systemd」モジュールは同梱されるんじゃないかという専らの噂です。
というわけで、今回は、Apache Httpdサーバをsystemdで起動できるようにトライ。
コンテナimageはできたんですが、コンテナimageのサイズが大きすぎるのか、コンテナ化できないという現象が起き、Minikube内臓のDockerのデバイスのサイズを大きくできないところで、詰まっています...
例のごとく解決できていないので、お時間のある方のみご照覧ください。
Dockerのコンテナとsystemdの微妙な関係
そもそも、何で、Dockerコンテナにおいて、systemdが弾かれるのか?
⇧ 上記サイト様によりますと、「systemd」は「D-Bus」による接続を確立しようとし、Dockerコンテナ側はそれを許可しない、と。
そも、「D-Bus」とは何ぞ?
Wikipedia先生!
D-Bus (Desktop Bus) はメッセージバスと呼ばれる、アプリケーション間でやりとりを行うための、プロセス間通信(IPC:Inter-Process Communication)実装のひとつ。加えて、プロセスの生成期間を調節し、それらのサービスが必要なときに簡単に呼び出すことが出来るようにするものである。軽量さ、低依存度を保って開発されている。
⇧ プロセス間のやり取り...
D-BusはKDE (バージョン2~3) 独自のIPC実装であるDCOP(Desktop COmmunication Protocol)から影響されて生まれ、KDE4 (Qt4) で採用された。
⇧ 「udev」は、「libudev」「udevd」「udevadm」 の3つで構成されてるらしい。
D-Busは現在、多くの言語とライブラリとのバインディングを持ち、C言語, Java, C++, C#, Python, Ruby, Perl, GTK+, Qt, Maemo(携帯端末用のデスクトップ環境)などから利用出来る。
う、う~ん...。よく分からんですが、まぁ、プロセス間のやり取りを実現してると。「systemd」は、D-Busを利用してサービス(httpdサーバの起動とか)を実現しているという感じですかね。
で、何で「systemd」が、Dockerのコンテナにおいて『Failed to get D-Bus connection: Operation not permitted ...』とかを起こすのか?
⇧ 上記のAlsadiさんの話によると、コンテナには、大きく分けて、
- process containers
- Dockerとか
- system containers
- LXD(Linux Continer)、OpenVZなど
の 2種類が存在するそうな。
あくまで、推測でしかないのですが、おそらく、Dockerのコンテナは、「process container」とあるように「プロセス」の1種ということで、プロセスの中で、プロセス間通信であるD-Busは利用できないという流れですかね?
Apache Httpdのmod_systemdとは?
ApacheのHttpd 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.
⇧ 詳細は、「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.
プロセスって言ってますね。
Dockerコンテナを利用しない場合のイメージ図は、
⇧ こんな感じですかね。
Dockerコンテナを利用した場合のイメージは、
こんな感じですかね。
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だけの問題ではなく、
⇧ 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.
Docker HubのofficialなCentOS 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」となるように作成しました。
では、ファイルを編集。
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を新たに作成します。
⇧ この回の記事で、Minikubeを導入したこともあって、今回は、MinikubeのDocker環境を利用していきます。
Dockerが使える環境であれば、Minikubeじゃなくても大丈夫です。ただ、Dockerfileを試したいので、Dockerの利用できる環境ということでMinikubeを使っています。
Minikubeで作成していた仮想マシンを起動し、
Minikube内蔵のDocker daemon に環境変数を通して、サーバ側でDockerが使える状態にしておきます。
では、systemd を有効にした CentOS 7.5.1804のコンテナimageを作成。「コンテナimage」「タグ」は、適当な名前で大丈夫です。
docker build -f [Dockerfileまでのパス] -t [コンテナimageの名前]:[タグ] [Dockerfileが格納されてるディレクトリ]
コンテナimageが出来上がりました。
後半で、このコンテナimageを使っていきたいと思います。
Apache Httpdに「mod_systemd」を導入してみる
systemdを有効にしなければいけないことが判明したわけですが、Apache Httpdの2.4系をソースコードからインストールした場合、mod_systemdというモジュールが同梱されていないため、別途、mod_systemdをインストールする必要があるようです。
mod_systemdの導入方法については、
⇧ モジュールをコンパイルして導入する場合
⇧ モジュールをコンパイルせずに導入する場合
を参考にさせていただきました。
今回は、コンパイルする方法で。まずは、「mod_systemd.c」ってファイルをインストールせねば、なんですが、CentOS 7.5.1804を使っている場合、「systemd-devel-219-57.el7.x86_64.rpm」をインストールしておく必要があるらしい。
RPM resource systemd-devel(x86-64) で検索できるみたいです。
⇧ 「systemd-devel(x86-64)」と入力し、「Search...」をクリックで。
rpmパッケージが表示されました。
今回は、「systemd-devel-219-57.el7.x86_64.rpm」 を利用ということで。リンクのアドレスをコピーして、適当なテキストエディターに貼り付けておきます。(各Linuxディストリビューションのパッケージ管理ツールでもインストールできるようなので、わざわざrpm形式のファイルをインストールしなくても良いのかもしれません。)
依存関係が多すぎたので、パッケージ管理ツールでインストールすることにします。
続きまして、「mod_systemd.c」を。
https://httpd.apache.org/dev/devnotes.html にアクセス。
⇧ 「Source Repositories」の「Trunk」をクリック。
「modules/」を選択。
「arch/」 を選択。
「unix/」を選択。(Windowsの環境の場合は、おそらく「win32/」だと思われますが、今回は、仮想マシンのCentOS7.5.1804にインストールしたApache Httpdに対してのモジュール追加なので、「unix/」で。)
「mod_systemd.c」を選択。
「Links to HEAD」 の「download」のリンクアドレスをコピーし、適当なテキストエディターに貼り付けておきます。
前前前回で作成していたDockerfileを編集していきます。
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を作成するにあたり、残りの必要なファイルは、
⇧ この回の記事で、作成してるのですが、
⇩ ディレクトリとファイルの構成がこんな感じで
残りの、必要なファイルの内容は、
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>
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
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までのパス]
コンテナimageができたようです。
確認してみると、「REPOSITORY」が「cent_java_tom_httpd」というコンテナimageが作成されてるのが確認できました。
コンテナ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などの仮想化アプリケーションをインストールしておく必要があります)
⇧ Minikubeの導入については、上記サイト様が詳しいです。
自分の場合は、Minikubeを導入しているので、マニフェストファイルを作成して、kubectlコマンドで、コンテナを作成します。(Kubernetesの場合、Podというコンテナを管理するためのものも同時にできます、というより、Podが作成され、その中にコンテナができる感じですかね)
というわけで、マニフェストファイル(拡張子「.yml」)を作成します。
「C:¥Users¥Toshinobu¥.minikube¥machines¥minikube¥minikube¥manifest¥pod.yml」 となる感じで用意しました。
ファイルの中身は、こんな感じ。
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の作成。
そしたらば、コンテナにログインしてみます。
Dockerのコマンドで、コンテナにログインする場合は、
docker exec -it [コンテナ名] /bin/bash
Kubernetesのコマンドで、コンテナにログインする場合は、
kubectl exec -it [コンテナ名] /bin/bash
で、いけるのですが、コンテナ名は?ってことで、
Dockerのコマンドで、コンテナの一覧を表示する場合は、
docker ps -a
Kubernetesのコマンドで、コンテナの名前を確認する場合は、
⇧ ということらしいんですが、Podの中に複数コンテナがあった場合はどうするんでしょうね?
まぁ、今回は、1Podに対して、1Containarですけど。
kubectl get pods --all-namespaces
Minikubeの場合は、
minikube dashboard
で、ブラウザでKubernetesの状況が確認できます...が稀に上手くいかない時があるので、
その場合は、一旦、仮想マシンを停止し、
minikube stop
再び、起動することで、Kubernetesクラスター環境も再度編成され、解消されると思われます。
minikube start
動いたらば、Dockerをサーバ側で使えるように、Docker daemonを起動しておきます。
では、再度ダッシュボードへ。
今度は、遷移できました...が、Podの起動に失敗してますね...
⇧ どうやら、ローカルのコンテナ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」を試したところ、
で、Podの状態が変わらず、「imagePullBackOff」...
⇧ 上記サイト様によりますと、「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 [マニフェストファイル]
再度、ダッシュボードを見るも、
変わらんやんけ~!
仕方がないので、一旦、Podを削除します。
kubectl delete pods [Pod名] --grace-period=0 --force
⇧ ダッシュボードのほうで見ると、反映されてないときがありますが、Podが削除されました。
では、再作成。
まったく変わらず...何これ~
ふと気になってコンテナimageの一覧を表示したら、作成してたコンテナimageが無くなっとったという...何故に?
というわけで、再作成。
作成されています。
で、Podをまた作ったんだけど、同じ現象が。
で、Podのログを観てみたところ、
kubectl describe [pod名]
Status: Failed Reason: Evicted Message: Pod The node was low on resource: [DiskPressure].
何ていうか、見事に失敗してますな。Nodeのリソースが足りなくなったらしい...っていうか、普通のWebアプリケーションも実装できないって...Minikubeで構築されたKubernetesの設定ドイヒーな気が....
ましてや、OracleDBとか入れる前でこれって...
ボヤキつつ、公式のサイトを見るも、
Configure Out Of Resource Handling - Kubernetes
⇧ 具体的な例が載ってないという...終わってる。
とりあえず、
によると、KubernetesのNodeのリソースの割当は下記のようになっているらしい。
対応表が、こんな感じで、
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ノード消費を防ぐものです。
なんか、Minikubeって実用に耐えない感じなんすかね....
dockerd --storage-opt dm.basesize=50G
で、ベース・デバイスのサイズを指定して、
sudo service docker stop sudo rm -rf /var/lib/docker sudo service docker start
変更を反映できるらしいんですが、
dm.basesize
ベース・デバイス作成時の容量を指定します。これはイメージとコンテナのサイズの上限にあたります。デフォルトの値は 10GB です。
ユーザはこのオプションを使ってベース・デバイス容量を拡張できますが、縮小はできません。
⇧ 縮小できないって...欠陥品も良いとこじゃないすか...しかも、今回は、デバイス・ドライバーが、overlay2 なので、上記の例は、devicemapper というデバイス・ドライバーの オプションらしいので使えないという...
minikube ssh
そして、Dockerの公式通りにコマンド実行したら、
⇧ 見事に、権限で弾かれるという...Minikube内蔵のDockerは微妙に仕様が違うんですかね...ちょいちょい変えてくるの本当に止めて欲しい。
ということで、sudo付けたらいけるっしょ、と
⇧ い、行けねぇ...
⇧ 上記サイト様によりますと、docker.pidっちゅうプロセスが、「/var/run/docker.pid」ファイルに記載されている内容と異なるらしいのが原因だとか。
systemctl status docker.service -l
⇧ 壮絶な文字化けですが、かろうじて、プロセスIDが判明。2344 であると。
んじゃあ、「/var/run/docker.pid」を確認...
できねぇじゃね~か!っていうか、Minikube使えね~。とりあえず、「:q!」でviエディタを終了。とりあえず、「/var/run/docker.pid」 ファイルを、「/home/docker」にコピーしときます。
そしたらば、exitして、仮想マシンのIPをチェック。
Teraterm で仮想マシンに接続します。TeraTermをインストールしてない場合はインストールしちゃいましょう。
時間の都合上、翌日へ。
Minikubeの場合は、必ず、Minikube内臓のDockerのdaemonを起動しておきましょう。
Dockerのdaemonの起動は、「minikube docker-env」で表示される、「@FOR /f "tokens=*" %i IN ('minikube docker-env') DO @%i」を実行すればOK。
TeraTermを起動。「ホスト(T):」に、「minikube ip」で確認したIPアドレスを入力し、「OK」。
「続行(C)」を選択。
デフォルトだと、「ユーザー名(N):」に「docker」、「パスフレーズ(P):」に「tcuser」を入力し、「OK」。
仮想マシンにssh接続ができてますが、「/home/docker/docker.pid」ファイルは見事に消え失せているという...仮想マシンを停止しちゃったせいですね...
というわけで、 「su -」でrootユーザーになって(パスワードは、「tcuser」で)、ファイルをコピーして、「exit」で元のユーザーに戻ります。
⇧ 「/home/docker/docker.pid」が配置されました。
DockerのプロセスIDも再確認。再起動したから変わってますね...
Ctrl + C で処理を抜けて、SCPコマンドで、仮想マシンから、ホスト側(自分の場合ですと、Windows 10 Home)にファイルを送信。
scp -r [仮想マシンへのログインユーザー名]@[仮想マシンのIP]:[仮想マシン側のファイルまでのパス] [ホスト側でファイルを配置したいパス]
配置されました。
開いてみると、プロセスIDに差異はないようです。
どうやら、
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 addingexperimental: true
to thedaemon.json
file. In earlier Docker versions, a different build was required to enable experimental features.
⇧ 「/etc/docker/daemon.json」ファイルにexperimental: true を追加すると実験的な機能が使えるようになるらしい、そんなファイル無かったけどね。
というわけで、作成。viエディターで新規作成。
sudo vi /etc/docker/daemon.json
⇧ 「i」でINSERTモードになって、「{ "experimental": true }」 を入力し、「Esc」キーを押して、「:wq」を入力で、ファイルの内容を保存してviエディターを終了。
ややこしいんだけど、
⇧ Windowsを使っているけれど、Minikube内蔵のDockerのdaemonは、仮想マシンのLinux カーネル上に構築されてるので、LinuxのほうのDockerの手順を参照ってことみたいですね...
というか、daemon.json自体が、Linuxしか使えないらしい...
Important: Setting
hosts
in thedaemon.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
今度は、dockerd コマンド いける?
⇧ はい、駄目でした。
なんだよ~、プロセス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
う、う~ん...問題なさげに見えますが。
⇧ 上記サイト様の、deviantony 様を信じるしか無いかと。「/usr/lib/systemd/system/docker.service」を編集するようなので、一応、「home/docker」にバックアップを取っときます。
では、ファイルの中身を見てみます。
[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
dockerd コマンドが動いた!っと、
思いきや、別のエラー...。
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」の情報に合わせれば良いかと。
と思ったら、
⇧ 上記サイト様によりますと、「/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
として保存。続いて、「/etc/docker/daemon.json」を編集。
sudo vi /etc/docker/daemon.json
⇧ 「i」でINSERTモードになって編集したらば、「Esc」キーを押下、その後で、「:wq」でファイルの内容を保存し、viエディターを終了。
一応、systemdに反映してみたものの、
sudo systemctl daemon-reload
なんか、Docker daemon の再起動も要るみたい
sudo systemctl restart docker
⇧ 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
でいけるらしい、
sudo dockerd -s overlay2 --storage-opt overlay2.size=50G
⇧ い、行けねぇじゃね~か!出た出た、docker is not runningって...
動いてるから!「Main PID: 3232(dockerd)」 で動いてるから!
⇧ 「/var/run/docker.pid」 も、同じプロセスIDになってるんですけど...
⇧ dockerd -v 、dockerd --help だけは普通に動くっぽいけど...
ちょっと、MinikubeとDockerのコラボレーションによる闇が深すぎて、心が折れたので、また、しばし、調査に戻ります。2週続けて、三連休を無駄にしてしまった...
解決法をご存知の方おりましたら、教えていただけると助かります。
未だ解決できずに申し訳ないですが、今回はこのへんで。
番外編
Minikube内臓のDockerが...サーバ側が壊れたっぽい...
なんか、よく分からんけど、Minikubeのシステム自体が、コンテナでできていのかは知らんけど、Docker daemon が止まると、
⇧ Minikube 系のコマンドが、ほとんど機能しなくなるらしい...とりあえず、Ctrl + C で処理を抜けるしかないかと。
Minikube 使えなさ過ぎる...
⇧ Minikubeでの仮想マシン停止ができなくなったっす...「/etc/docker/daemon.json」とか作って、Docker daemonを再起動とかが良くなかったのか...
「/etc/docker/daemon.json」を削除して、
一旦、強制終了。
■ VBoxManage コマンドの場合
■ VirtualBox マネージャーの場合
VirtualBox マネージャーで、仮想マシン上で右クリックし、「閉じる」>「電源オフ」
どちらの方法も、電源オフ なので、あまり宜しくないとは思いますが。
で、再起動すると、復帰しました。
作業してたファイル(daemon.json とか)は根こそぎ消えたけど...。