IPv6 only VPS with Germany !!

IPv6 only VPS with Germany !!

皆さん、こんばんちわ
IPv4の海を漂っておりましたが、v6の海に漂着したピン村(pinson)と申します。
今後ともどうぞよろしくなのです。

それはさておき、今回初めてIPv6 onlyでwordpressを作っております。
それも、日本国内だとIPv6 onlyで展開しているVPSが無く仕方なしに海外VPSを利用しました。
しかし、料金も安く程よくスペックがいいのでこれからは海外VPSの利用も積極的に視野に入れようと思っていた次第です。

Contents

今回の目的は?

題して、IPv6 Only 初めてのVPS構築入門!!
とでもしておきましょう。

それでは、構築していきます。

環境

image

最終的に上のようになる予定です。
(なんとか形にしました。w)

構築

では、いよいよ構築作業に入っていきます。
その前に、自宅にIPv6のインターネット接続があるか確認しましょう。
私の場合、よく確認せずIPv6 Only VPSを契約してしまったので皆さん十分注意して契約しましょう。
ちなみに、私が今回取った回避法は携帯回線がIPv6対応だったのでAPN設定を変更し通信方法をIPv4/IPv6に設定したうえでUSBテザリングをしました。!

それでは、puttyでSSHしていきます。

image

  • 万が一、既にdocker入ってたら面倒くさそうなので先にyum removeを叩いておいて一応の保険をかけておきます。
root@localhost ~# yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine

上のコマンドを打ってNo package ですぅ~という結果が出ればそれでいいです。
パッケージのアンインストールがあった場合でも結果的にオーライなので大丈夫ですw

  • 次にdockerのrepository と yum-utils関連のパッケージを入れていきます。
root@localhost ~# yum install -y yum-utils device-mapper-persistent-data lvm2

root@localhost ~# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  • 最新バージョンのDocker CEをダウンロードしていきます。ちなみに、"CE"ですがcommunity edition の略で "EE" Enterprise Editionも種類としてあります。
root@localhost ~# yum install -y docker-ce docker-ce-cli containerd.io
  • 特に、エラーなく終わる"はず"なのでインストールしたDockerを起動します。
root@localhost ~# systemctl start docker
  • ついでに、再起動後も自動で立ち上がるようにDockerの自動起動有効化をしておきます。
root@localhost ~# systemctl enable docker
  • Dockerが立ち上がったらdockerのバージョンを確認しておきましょう。
root@localhost ~# docker -v

構築Lv2

さて、今回の構築一番の佳境にさしかかります。w
何が、問題かというと今回割り当てられているIPv6のVPSではDocker Hubから " docker pull xxxxx " っていうコマンドが使えないことです。

しかしながら、よくよく思い出すとこのVPSはIPv4が割り当てられていたことを思い出す方いらっしゃるかもしれません。
もう一度、環境で提示した図を確認してみましょう。

image

(。´・ω・)ん?

image

IPv4って書いてあります。
これ、どういうことかというと....

VPSのコントロールパネルを見ると...

image

なんと...
"192.168.0.129" と書いてあります...
これは、あとからSupport Requestを起こして聞いた結果
「ローカルonlyで外には出れないよ~、ごめんチョ(意訳) 」 という回答を得ましたのでIPv4で外に出れないということになります。

つまり、IPv6でDocker HUbからコンテナイメージを引っ張って来なきゃいけないのですが Docker HUBはIPv6に対応していません。

さて、どうするかというと...

携帯回線のIPv4/IPv6の回線でDocker HUbからWindowsのGit bash経由でdocker pull xxxx し、tar形式でコンテナをまとめて携帯回線のIPv6でSFTPを繋ぎtar形式でまとめたコンテナを転送するという方法を取ります。

ゆえに、WindowsにDocker for windowsを入れなくてはならない という部分が発生しますが今回はしょうがないの一言で片づけることにします。

MINGW64 ~ docker pull wordpress
Using default tag: latest
latest: Pulling from library/wordpress
85b1f47fba49: Pull complete
d8204bc92725: Pull complete
92fc16bb18e4: Pull complete
31098e61b2ae: Pull complete
f6ae64bfd33d: Pull complete
003c1818b354: Pull complete
a6fd4aeb32ad: Pull complete
a094df7cedc1: Pull complete
e3bf6fc1a51d: Pull complete
ad235c260360: Pull complete
edbf48bcbd7e: Pull complete
fd6ae81d5745: Pull complete
69838fd876d6: Pull complete
3186ebffd72d: Pull complete
b24a415ea2c0: Pull complete
225bda14ea90: Pull complete
d47a53aaaacc: Pull complete
ce9b97a033e9: Pull complete
Digest: sha256:6216f64ab88fc51d311e38c7f69ca3f9aaba621492b4f1fa93ddf63093768845
Status: Downloaded newer image for wordpress:latest

こんな感じで、イメージを引っ張ってきてくれます。
しかし今のままではSFTPで転送できるようなtar形式にはなっていないので次の手順でtar形式にしていきます。

  • docker pull xxxx で引っ張ってきたイメージをtar形式にアーカイブする。
MINGW64 ~ docker save -o wordpress.tar wordpress  

引き続き、git bashで上のようにコマンドを打ってみましょう。
そうすると、wordpress.tarというのが存在していると思います。
容量が5GB 弱あるのでSFTPで転送する際も時間がかかるので注意しましょう。

上の要領で、Mysql コンテナもpullしてきます。

MINGW64 ~$ docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
123275d6e508: Pulling fs layer
27cddf5c7140: Pulling fs layer
c17d442e14c9: Pulling fs layer
5fc78b1e06f8: Pulling fs layer
cd38802f42bb: Pulling fs layer
b370e336f220: Pulling fs layer
f519d6d4d2f6: Pulling fs layer
c52c0310cd34: Pulling fs layer
cd74fd7796ae: Pulling fs layer
3f08e322a29c: Pulling fs layer
2caa0eda62a7: Pulling fs layer
eac28354a6fe: Pulling fs layer
5fc78b1e06f8: Waiting
cd38802f42bb: Waiting
b370e336f220: Waiting
f519d6d4d2f6: Waiting
c52c0310cd34: Waiting
cd74fd7796ae: Waiting
3f08e322a29c: Waiting
2caa0eda62a7: Waiting
eac28354a6fe: Waiting
c17d442e14c9: Verifying Checksum
c17d442e14c9: Download complete
27cddf5c7140: Verifying Checksum
27cddf5c7140: Download complete
cd38802f42bb: Verifying Checksum
cd38802f42bb: Download complete
123275d6e508: Verifying Checksum
123275d6e508: Download complete
5fc78b1e06f8: Verifying Checksum
5fc78b1e06f8: Download complete
f519d6d4d2f6: Verifying Checksum
f519d6d4d2f6: Download complete
123275d6e508: Pull complete
27cddf5c7140: Pull complete
b370e336f220: Verifying Checksum
b370e336f220: Download complete
c52c0310cd34: Verifying Checksum
c52c0310cd34: Download complete
c17d442e14c9: Pull complete
5fc78b1e06f8: Pull complete
cd38802f42bb: Pull complete
3f08e322a29c: Verifying Checksum
3f08e322a29c: Download complete
b370e336f220: Pull complete
2caa0eda62a7: Verifying Checksum
2caa0eda62a7: Download complete
f519d6d4d2f6: Pull complete
c52c0310cd34: Pull complete
eac28354a6fe: Verifying Checksum
eac28354a6fe: Download complete
cd74fd7796ae: Verifying Checksum
cd74fd7796ae: Download complete
cd74fd7796ae: Pull complete
3f08e322a29c: Pull complete
2caa0eda62a7: Pull complete
eac28354a6fe: Pull complete
Digest: sha256:7901b65a6be478f7f15348dec0440c491a364af202112c61cb3925d7fb67d8f4
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest
  • 続いて、pullしてきたdocker imageをtar形式にアーカイブします。
MINGW64 ~ docker save -o mysql.tar mysql

ここまでで、 wordpress.tar , mysql.tarというファイルがそれぞれ出来ていると思います。

image

さて、とりあえずdocker containerの準備が整ったので再度携帯回線に繋ぎWinSCPでwordpress.tar , mysql.tarとかを移動させていきます。

.tarで作ったアーカイブが結構容量食うので転送にも時間がかかります。

転送が完了したらいよいよSSHで実作業になっていきます。

構築Lv3

  • SSHでサーバーにアクセスします。

image

次に、docker で読み込むためのコンテナイメージを読み込みます。
さっき、tarでまとめたやつですね。

root@blog ~# docker load -i wordpress.tar

root@blog ~# docker load -i mysql.tar
root@blog ~# docker load -i wordpress.tar
37412c153883: Loading layer [==================================================>] 204.7 MB/204.7 MB
c3d26400d3ff: Loading layer [==================================================>] 3.584 kB/3.584 kB
5cd2e0cfe892: Loading layer [==================================================>] 8.552 MB/8.552 MB
2c3aa4e96952: Loading layer [==================================================>] 10.24 kB/10.24 kB
4c0354ed71f4: Loading layer [==================================================>] 9.728 kB/9.728 kB
2f6273a5f133: Loading layer [==================================================>] 4.096 kB/4.096 kB
dcdbe9fe2ca1: Loading layer [==================================================>]  7.68 kB/7.68 kB
a9aa8861270e: Loading layer [==================================================>] 13.87 MB/13.87 MB
fa7f9311a060: Loading layer [==================================================>] 4.096 kB/4.096 kB
61a961ab5d2b: Loading layer [==================================================>] 33.01 MB/33.01 MB
8933dc910eee: Loading layer [==================================================>] 11.78 kB/11.78 kB
493137409f3e: Loading layer [==================================================>] 4.608 kB/4.608 kB
749e8aaa7dd4: Loading layer [==================================================>] 6.892 MB/6.892 MB
6594bf4ea5b9: Loading layer [==================================================>] 4.608 kB/4.608 kB
24605e7ca88b: Loading layer [==================================================>] 7.168 kB/7.168 kB
4f2aeb865fa0: Loading layer [==================================================>] 25.14 MB/25.14 MB
2ff5b2ab6416: Loading layer [==================================================>] 10.24 kB/10.24 kB
Loaded image: wordpress:latest

読み込みが終わったらdocker imagesで内容を確認しましょう。

root@blog ~# docker images

image

それぞれ、wordpress , mysql の表記があれば正常にimportされています。

docker自体は以前、

systemctl enable docker

で、自動起動を有効化していたはずなので立ち上がっているはずです。
立ち上がっていなかったら、

systemctl start docker

でサービスを立ち上げてください。

  • Mysql containerを起動させます。
root@blog ~# docker run --name mysql -e MYSQL_ROOT_PASSWORD=Mysqlのログインパスワード -d mysql

起動確認は、

root@blog ~# docker ps -a

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                 NAMES
a438ae42397a        wordpress           "docker-entrypoint.s…"   2 days ago          Up 2 days           0.0.0.0:80->80/tcp    wordpress
c1eacb2be88a        mysql               "docker-entrypoint.s…"   2 days ago          Up 47 hours         3306/tcp, 33060/tcp   mysql
[root@blog ~]#

で出来ます。

mysqlのdocker containerが立ち上がったことを確認したらwordpress用のmysql databaseを作っていきます。

  • Mysql containerにログインします。
root@blog ~# docker exec -it mysql /bin/bash

無事、ログインできると root@[container ID] ~# という表記になります。
なお、コンテナログインの際にはパスワードやユーザー名はいらないみたいです。

root@c1eacb2be88a:/# mysql -u root -p  
Enter password: xxxxxxxxxxxx  ←docker run の -e MYSQL_ROOT_PASSWORDでしたパスワードです。 

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 443
Server version: 8.0.19 MySQL Community Server - GPL

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create database データベース名; 

mysql> create user 'ユーザ名'@'%' IDENTIFIED BY 'パスワード';

mysql> grant all on データベース名.* to 'ユーザー名'@'%';

mysql> alter user 'ユーザー名'@'%' identified with mysql_native_password by 'パスワード';

mysql> select user,host,plugin from mysql.user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| root             | %         | caching_sha2_password |
| xxxxxxxxx        | %         | mysql_native_password |  ←こんな感じになってればok
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
6 rows in set (3.49 sec)

mysqlでデータベースとユーザー名を作るときのキモはwordpressデータベースに登録するユーザー名をlocalhostではなく "%" で指定すること+MySQL8系における認証プラグインを旧式に変更すること
これが、重要です。
dockerでmysql と wordpressコンテナを別々に起動する場合は同一コンテナ内にmysqlとwordpressがあるわけではないので localhostにしてしまうと接続が通らないという盲点があります。
加えてMySQL8系からデフォルトの認証形態が変更となったため、これも変更する必要があります。

参照先は以下です。
mysql Access Deined
WordPress推奨構成とデータベースの作成

  • wordpressコンテナとmysqlコンテナを接続します

docker の --linkオプションでwordpressを展開します。
言葉で説明すと、同一ホスト上で稼働するコンテナ同士で通信させる技術です。
ホントは、IPv6 Grobalをせっかく5つも持ってるのでMySQLを除くすべてのコンテナにIPv6グローバルを割り当てたかったのですがやり方的によく分かんなかったんで--linkで済ましてしまいます。
Docker+IPv6でゴチャゴチャやる方法はこちら(英語)

root@blog ~# docker run --name wordpress  -e WORDPRESS_DB_USER=データベースユーザー名 -e WORDPRESS_DB_PASSWORD=データベースのパスワード -e WORDPRESS_DEBUG=1 --link mysql:mysql -d -p 80:80 wordpress

root@blog ~# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                 NAMES
a438ae42397a        wordpress           "docker-entrypoint.s…"   2 days ago          Up 2 days           0.0.0.0:80->80/tcp    wordpress
c1eacb2be88a        mysql               "docker-entrypoint.s…"   2 days ago          Up 2 days           3306/tcp, 33060/tcp   mysql

wordpressをdocker runさせるとき、参照先のMySQLから情報を正確に呼び出せるよう wordpress用のデータベースユーザー名、パスワードを環境変数で指定します。(-e WORDPRESS_DB_USER とか書いてあるやつ)

ついでに、インストール中にエラーが発生した場合詳細情報が分かるようにDEBUGを有効にしておきます。
"WORDPRESS_DEBUG=1"ってやつがそうです。

ここまで行くと、ドメイン名叩けばwordpressのインストール画面が出てくると思います。
しかし、IPv6に関してはv4のようにIP直叩きでサーバーにアクセスすることが出来ない為独自ドメインでIPv6とドメイン名に紐づけておく必要があります。

image

私の場合、上のようなインストール画面が出てきたあとMysql8系の認証形態変更とwordpress user名を% ではなくlocalhostにしていたため原因究明と私自身における納得の問題でめちゃくちゃ時間がかかりましたwwww

ま、そゆことで無事wordpressが立ち上がった形になります。ハイ

構築プラスα

wordpressプラグインについてです。
私の場合は、ドイツにIPv6のサーバーがあるためping も330msぐらいで"大変接続が遅い"んですね。
なので、CloudFlareでIPv6/IPv4のconvertかましてたりするとCloudFlare側のタイムアウトが発生しロクにプラグインも入れることが出来ません。
こんな時には、IPv4側でwordpressプラグインをオフライン(zip)でダウンロードし展開したものをSFTPでIPv6のサーバー側に転送します。

最後に、IPv6のサーバーからDocker containerにディレクトリ事コピーさせなきゃいけないのでコマンドを叩きます。

root@blog ~# docker container cp /root/wp-githuber-md/ wordpress:/var/www/html

root@blog ~# docker exec -it wordpress /bin/bash

root@a438ae42397a:/var/www/html# mv wp-githuber-md /var/www/html/wp-content/plugins

これで、pluginのオフラインインストールは完了です。
プラグイン自体の容量が大きいとオフラインインストールしか方法がなくなるので頭の片隅に置いておいたほうがいいかもしれません。

今回、長く長くなりましたがこれくらいにしようと思います。
では、皆さんまた次回!!