【Docker】Docker Toolbox ローカルのフォルダをコンテナにマウントする

docker run...の時に「-v {ローカルのフォルダパス}:{コンテナ側のフォルダパス}」でマウントするやり方。Docker for Windowsの場合はそのまま記述するだけだけど、Docker Toolboxを使ってる時は以下2段階必要。

(1) ローカルのフォルダをVirtualBox上のdocker-machineにマウント
(2) docker-machineからコンテナにマウント

(1) ローカルのフォルダをVirtualBox上のdocker-machineにマウント

(1.1) VirtualBoxマネージャーを開き、対象のマシン上(マシン名:通常default)で右クリック→「設定」
f:id:daylambsbecomelions:20190623201816p:plain
(1.2) 「共有フォルダ」メニューから共有フォルダ部分をダブルクリック
f:id:daylambsbecomelions:20190623202415p:plain
(1.3) 「フォルダーのパス」でマウントしたいローカルフォルダを選択。docker-machine側の「フォルダー名」は特に指定がなければデフォルトの「host」のままでOK。
f:id:daylambsbecomelions:20190623202552p:plain
(1.4) docker-machineをstartさせ、「host」フォルダに指定したローカルのフォルダがマウントされていることを確認

(2) docker-machineからコンテナにマウント

(2.1) こちらはシンプルにマウントした「host」フォルダを「マウント元」にしてdocker runコマンド

docker run -d --privileged -v {マウント元(docker-machine側)フォルダパス}:{マウント先(コンテナ側)フォルダパス} --name {コンテナ名} {イメージ名}
(例) docker run -d --privileged -v /host/src:/var/www/html --name web-server centos

(2.2) コンテナに接続してマウントできてることを確認

【Docker】How to solve 'Failed to get D-Bus connection: Operation not permitted'

I tried to build centos7 container and type 'systemctl ***' command, I got titled error. As many other sites mentioned, adding '--privileged' option when docker run didn't work to me. What worked was adding '/sbin/init' at the end of command when docker run as below.

(例) docker run -d --privileged -p 8000:80 -it --name {container name} centos/httpd /sbin/init

If you use centos, utilizing the image 'centos/systemd' will also allow you to use 'systemctl' command.

docker pull centos/systemd
docker run -d --privileged -p 8000:80 -it --name {container name} centos/systemd
docker exec -it {container name} bash

【Docker】How to solve 'Forbidden :You don't have permission to access /phpmyadmin on this server' phpMyAdmin |

When accessing phpmyadmin in docker, source ip would be '172.17.0.1', not '127.0.0.1'. So what you have to do is in '/etc/httpd/conf.d/phpMyAdmin.conf', either change 'Require ip 127.0.0.1' to 'Require ip 172.17.0.1', or to 'Require all granted'.

(original)

AddDefaultCharset UTF-8
   <IfModule mod_authz_core.c>
     # Apache 2.4
     <RequireAny>
       Require ip 127.0.0.1
       Require ip ::1
     </RequireAny>
   </IfModule>

(revised)

AddDefaultCharset UTF-8
   <IfModule mod_authz_core.c>
     # Apache 2.4
     <RequireAny>
       #Require ip 127.0.0.1
       #Require ip ::1
       Require all granted
     </RequireAny>
   </IfModule>

Do not forget restart httpd!

【Docker】How to solve 'cgroups: cannot found cgroup mount destination: unknown'

When trying to start a multiple containers with Docker Toolbox, I got below error.

cgroups: cannot found cgroup mount destination: unknown

This happens because those containers you tried to start have systemd, and here's solution.

sudo mkdir /sys/fs/cgroup/systemd
sudo mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd

Make sure you do this on docker-machine 'default' server, which you can login through terminal soft as TeraTerm with ip '192.168.99.100', user 'docker' and password 'tcuser'.
Or, if you are in Docker Quick Terminal, you can execute there by connecting "docker-machine ssh default" as well.

Note 'default' is volatile, you need to type above command every time you start docker-machine.

【Docker】CentOS7コンテナ systemctl実行時の「Failed to get D-Bus connection: Operation not permitted」エラー対処方法

色んなサイトにあったdocker runする時に「--privileged」オプションを
つけてコンテナを立ち上げるって方法では解決しなかった。

色々試したところ、docker runする時に最後に「/sbin/init」をつけてコンテナを立ち上げたらできた。

(例) docker run -d --privileged -p 8000:80 -it --name {コンテナ名} centos/httpd /sbin/init

もしくはcentosなら、centos/systemdというイメージを使うとそのままでもOK

docker pull centos/systemd
docker run -d --privileged -p 8000:80 -it --name {コンテナ名} centos/systemd
docker exec -it {コンテナ名} bash

【PHP】curlのjsonレスポンス内 日本語の文字化けを解決

curlAPIを呼び出して返ってきたjsonデータ内の日本語が
文字化けする時の対処方法。色んなサイトを見て色々試した
けどうまくいかなかったり処理が大げさ過ぎたり。

decodeしたのをまたencodeして何やってんだ?って記述だけど、
少なくとも1行で目的は達成できたので紹介。

<?php
$mojibake_kaishou = json_encode(json_decode($response), JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT);
?>

curlの全体の処理はこちら。

<?php
//curlの開始
$curl = curl_init(); 
// オプション設定
$options = array(
CURLOPT_URL => $url,
CURLOPT_CUSTOMREQUEST => $method,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPPROXYTUNNEL => true,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_TIMEOUT => $curlopt_timeout,
);
//オプションの設置
curl_setopt_array ($curl, $options);
//curl実行/リスポンスの代入
$response = curl_exec($curl);
//Uniodeエスケープを元に戻す(ログ出力用)
$unicode_decode_json = json_encode(json_decode($response), JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT);
//Uniodeエスケープを元に戻し、配列に変換する(返り値用)
$unicode_decode_array = json_decode(json_encode(json_decode($response), JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT));
//(curlの戻り値に含まれる日本語がunicodeエスケープされ文字表示されないため一度decodeし、エスケープ処理なしで再度encodeし、それをまたdecodeしている)
?>

【Docker】phpMyAdmin | Forbidden :You don't have permission to access /phpmyadmin on this serverのエラー対処方法

Dockerでこんな感じでphpをインストールする時にphpMyAdminも一緒にインストールして、

yum -y install enablerepo=remi, remi-php72 php php-devel php-mbstring php-pdo php-gd php-xml php-mcrypt php-pecl-zip php-pear php-mysql phpMyAdmin

いざ、ドメイン/phpmyadminをブラウザで入力してGO!ってやったら

Forbidden :You don't have permission to access /phpmyadmin on this server

あれ?なんだこれ。ログイン画面とかが出るハズなんだけどな。
で調べてみたら「/etc/httpd/conf.d/phpMyAdmin.conf」の以下の部分を、

AddDefaultCharset UTF-8
   <IfModule mod_authz_core.c>
     # Apache 2.4
     <RequireAny>
       Require ip 127.0.0.1
       Require ip ::1
     </RequireAny>
   </IfModule>

以下のように書き換えることで解決。

AddDefaultCharset UTF-8
   <IfModule mod_authz_core.c>
     # Apache 2.4
     <RequireAny>
       #Require ip 127.0.0.1
       #Require ip ::1
       Require all granted
     </RequireAny>
   </IfModule>

Dockerだとアクセス元のアドレスは127.0.0.1じゃなくて、172.17.0.1なんだよね。
だから127.0.0.1の部分を172.17.0.1に変えてもいけるんだけど、まー開発環境だし何でも許容でいっかってことで。
アパッチの再起動は忘れずに!