kuro

3 minute read

動機 windows10 HomeエディションでもDockerを使いたかったのと、公開サーバー上にDockerを導入して簡単に同期できないかを模索したかった。

採用プラン

VagrantでCentOS7の仮想マシンを立ち上げ、その中でDockerをインストール、Wordpressやその他ウェブアプリの開発環境を整える

結果
vagrantfileのプロビジョニング機能で公開サーバー側と開発環境での設定を楽に近づけることができる
すべてvagrant upでvagrantfileのみを読み込むようにすれば、将来的にPCが変わったとしても開発環境を一発で構築することができる

手順

  1. vagrantfileを作成

    vagrant init centos/7
    
  2. vagrantfileを編集する

    以下をコメントアウト

    config.vm.network "private_network", ip: "192.168.33.10"
    

    共有フォルダの設定は以下のように記述(Rsyncでのデフォルト設定を回避)

    config.vm.synced_folder ".", "/vagrant", type:"virtualbox"
    
  3. vagrant up

    vagrant up
    

    ※ちょっと待つ(私は30分待ちました)

  4. vagrant ssh

    vagrant ssh
    

    ※vagrant upで立ち上げた仮想マシン(centOS)にログイン出来れば成功

  5. vagrantfileを編集して、Dockerをプロビジョニング
    以下を追記

      config.vm.provision "docker", run: "always"
    
  6. docker-composeもインストールするため、vagrantのプラグインをインストールする

    vagrant plugin install vagrant-docker-compose
    
  7. 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.8

  • localeを日本語に変更した後に出た以下のエラーを

    -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
    

    で再度立ち上げる

    参考
    https://qiita.com/damele0n/items/ac20e93749eb060fddfa


ちなみに以下に不採用プランを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"
    ````
    が出来ない。
    
    &darr; 失敗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のダッシュボードを開くところまで出来た。