動機 windows10 HomeエディションでもDockerを使いたかったのと、公開サーバー上にDockerを導入して簡単に同期できないかを模索したかった。
採用プラン
VagrantでCentOS7の仮想マシンを立ち上げ、その中でDockerをインストール、Wordpressやその他ウェブアプリの開発環境を整える
結果
vagrantfileのプロビジョニング機能で公開サーバー側と開発環境での設定を楽に近づけることができる
すべてvagrant upでvagrantfileのみを読み込むようにすれば、将来的にPCが変わったとしても開発環境を一発で構築することができる
手順
vagrantfileを作成
vagrant init centos/7
vagrantfileを編集する
以下をコメントアウト
config.vm.network "private_network", ip: "192.168.33.10"
共有フォルダの設定は以下のように記述(Rsyncでのデフォルト設定を回避)
config.vm.synced_folder ".", "/vagrant", type:"virtualbox"
vagrant up
vagrant up
※ちょっと待つ(私は30分待ちました)
vagrant ssh
vagrant ssh
※vagrant upで立ち上げた仮想マシン(centOS)にログイン出来れば成功
vagrantfileを編集して、Dockerをプロビジョニング
以下を追記config.vm.provision "docker", run: "always"
docker-composeもインストールするため、vagrantのプラグインをインストールする
vagrant plugin install vagrant-docker-compose
docker-composeをプロビジョニング
config.vm.provision "docker_compose", compose_version: "1.23.1", yml: "/vagrant/docker-compose.yml", run: "always"
出現したエラーとその対策の例
sudo yum -y update をすると
http://mirror.centos.org/centos/7/os/x86_64/repodata/repomd.xml: [Errno 14] curl#6 - "Could not resolve host: mirror.centos.org; Unknown error" Trying other mirror.
というエラーが何度も出る
対策
名前解決ができていないようなので、Google Public DNS サービスを使ってみる。
↓ 成功
sudo vi /etc/resolv.conf
で nameserver 8.8.8.8 を追加する。
参考
https://blog.csdn.net/spyiu/article/details/25163101
https://so-zou.jp/web-app/network/ip-address/?url=8.8.8.8localeを日本語に変更した後に出た以下のエラーを
-bash: warning: setlocale: LC_ALL: cannot change locale (ja_JP.UTF-8)
以下のコマンドで
localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
解決した。
forwarded_portのhostに1024以下を指定するとvagrant up時に以下の警告が表示される
==> default: You are trying to forward to privileged ports (ports <= 1024). Most ==> default: operating systems restrict this to only privileged process (typically ==> default: processes running as an administrative user). This is a warning in case ==> default: the port forwarding doesn't work. If any problems occur, please try a ==> default: port higher than 1024.
仮に使いたいポートがすでに占有されていて使えない場合、
netstat -aon | findstr 0.0:80
で80ポートを使用している通信を探し、
tasklist | findstr (netstatで表示された一番右の番号)
でポートを占有しているプロセスを特定する
wordpressが初回起動ですぐに立ち上がらない
docker-compose.ymlで depend_on にDBコンテナを指定すると、mysql → wordpressの順で立ち上げられるが、mysqlの立ち上げ処理が完了することなく、wordpressコンテナ立ち上げの処理も始まってしまうので
ERROR: for vagrant_wordpress_1_c27847903284 UnixHTTPConnectionPool(host='localhost', port=None): Read timed out. (read timeout=60) ERROR: for wordpress UnixHTTPConnectionPool(host='localhost', port=None): Read timed out. (read timeout=60) An HTTP request took too long to complete. Retry with --verbose to obtain debug information. If you encounter this issue regularly because of slow network conditions, consider setting COMPOSE_HTTP_TIMEOUT to a higher value (current value: 60).
や
以下のコマンドで
docker logs (wordpressコンテナのname)
ログを確認すると
MySQL Connection Error: (2002) Connection refused Warning: mysqli::__construct(): (HY000/2002): Connection refused in Standard input code on line 22
が出現する。
なので、docker-compose.ymlのwordpress内に
restart: always
を記述して、失敗してももう一度wordpress立ち上げ直すように設定するとmysqlコンテナが完全に準備できた後、wordpressが動いてくれる。
お困り例
Rsyncがデフォルトで適用されるようになったためshared_folderの設定をするときは一工夫する必要がある
参考
http://www.1x1.jp/blog/2014/03/vagrant-rsync-synced-folder.htmlデフォルトではRsyncが動きホスト → ゲストの一方通行かつvagrant up時のみ同期が行われるため、Rsyncを使わずにvboxsfでリアルタイム同期するように設定
config.vm.synced_folder ".", "/vagrant", type:"virtualbox"
※ホスト側の共有フォルダはカレントディレクトリでOKかな (わざわざ共有用のフォルダを作成して設定しなくてもカレントディレクトリが共有されていればそこから新しくフォルダを作れば同期できるので同じことと思う)
お困りというよりかは無知例…
docker-compose.ymlファイルに記述したnginxのportsにて 「xxxx(host):80」でないとうまくポートフォワード出来ない。
docker exec -it (コンテナID) bash
でコンテナ内に入り
vi /etc/nginx/conf.d/default.conf
をすると listen しているポート番号が指定されている。 このポート番号(80番なら)でないと基本的に対応しないので 例えば、「xxxx(host):8080」としても httpプロトコルでの(localhostなど)アクセスではnginxが対応できない。
mysqlのdocker-compose.ymlの変更内容が反映されない
mysqlをdocker-composeでupした後にdocker-compose.ymlなどで指定した環境変数を変更しても変わらない(反映されない)。 マウントされているディレクトリを消すか、volumeを使って永続化をしているなら
docker volume ls
で確認し、
docker volume rm (ボリューム名)
で削除する必要がある。 削除した後に
docker-compose up -d
で再度立ち上げる
ちなみに以下に不採用プランを4つ…
不採用プラン1
Dcoker用に最適化された軽量なCoreOS上でDockerを動かし、その上でwordpressを動かす
以下のサイトを参考にvagrantでcoreOSをセットアップ https://github.com/coreos/coreos-vagrant
結果
セットアップの説明通りに行かず、エラーを潰せど次のエラーを吐かれめげた。
環境構築に時間を取られたくないためこの方法は諦めた。
エラー例
ファイル共有の設定をvagrantfileに記述した後 vagrant up をして、仮想マシン作成時に
"vboxsf" file system is not available
coreos Failed to mount folders in Linux guest. This is usually because the "vboxsf" file system is not available. Please verify that the guest additions are properly installed in the guest and can work properly.
というメッセージが出て共有ディレクトリのマウントに失敗する
対処
VirtualBox Guest Additionsのカーネルモジュールが正しくビルドされていないのが原因のようなので、以下のように同モジュールをビルドし直して仮想マシンを再起動すればよいらしい。
↓ 失敗1
vagrant ssh -c "sudo /etc/init.d/vboxadd setup" ```` が出来ない。 ↓ 失敗2 vbguestというプラグインをインストールして ```bash vagrant plugin install vagrant-vbguest
vbguestを動かす
vagrant vbguest
coreOSには対応していないらしくうまく機能しなかった。
vagrantfileからファイル共有の設定をコメントアウトして再度vagrant upするとcoreOSを立ち上げる所まで出来たが、vagrant sshで内部へ接続することが出来ない。
.ssh/config: terminating, 1 bad configuration options vagrant
対処
↓ 成功
vagrant ssh-config
vagrant sshの参照情報を確認してみる。
そもそも.ssh内にconfigファイルが作成されており(どこかの記事を参考にconfigファイルを作っていた…)、そちらが先に読み込まれていたようで vagrant ssh が出来なかったため、.ssh/configの方を削除したら上手くいった。ファイル共有に再挑戦するも
"vboxsf" file system is not available
coreos Failed to mount folders in Linux guest. This is usually because the "vboxsf" file system is not available. Please verify that the guest additions are properly installed in the guest and can work properly.
のエラーで結局先に進まず諦めた。。。
不採用プラン2
docker toolboxでwordpressを動かす
以下のdocker-compose.ymlの内容で
version: "2"
services:
wordpress:
image: wordpress:latest
ports:
- "9000:80"
depends_on:
- db
environment:
WORDPRESS_DB_HOST: "db:3306"
env_file: .env
db:
image: mysql:5
env_file: .env
volumes:
- db-data:/var/lib/mysql
volumes:
db-data:
.envファイル
WORDPRESS_DB_NAME=wordpress
WORDPRESS_DB_USER=wp_user
WORDPRESS_DB_PASSWORD=password
MYSQL_RANDOM_ROOT_PASSWORD=yes
MYSQL_DATABASE=wordpress
MYSQL_USER=wp_user
MYSQL_PASSWORD=password
結果
mysqlはコンテナが作られ動いているようだったが、wordpressのコンテナが30秒ほど立ち上がったと思ったら消えてなくなってしまった。そのためlocalhost:9000でブラウザからアクセス出来なかった。
エラー例
mysqlへの接続関係のエラー
Warning: mysqli::__construct(): (HY000/2002): Connection refused in Standard input code on line 22 wordpress_1 | wordpress_1 | MySQL Connection Error: (2002) Connection refused
↓ 失敗1
以下をdocker-compose.ymlに追記してもダメrestart: unless-stopped
↓ 失敗2
以下を実行してもダメsudo restart docker
そもそもDocker Toolboxで進めていいのかということもあり早々に諦めた。
不採用プラン3
MAMPをインストールしてhtdocsにwordpressを配置して始める
結果
MAMPを入れてやると公開サーバーとローカル開発環境を同期する手間が増えるよね?
ウェブアプリなどを作ろうと思っているため出来れば出来ればDockerでやりたい。
MAMPでやるのはwordpressだけなので、とりあえず最終手段にしておく。。。
エラー例
データベース接続確立エラーが出る
↓
データベースを作成すればよい(未検証)
不採用プラン4
VCCWを使ってVagrant上にWordpressを導入して使用する
結果
VCCW依存になりかねない
そもそもdockerを使用しないので目的に合わない
公開サーバーに同様にVCCWを導入するつもりがない
特にエラーが出ることなく、Wordpressのダッシュボードを開くところまで出来た。
Share this post
Twitter
Google+
Facebook
Email