Windows上のDockerでつくるLAMP+Memcached開発環境(Proxy設定あり)

# はじめに
Windows上でDockerを用いたLAMP開発環境を構築手順をまとめました。
社内Proxyがある環境で構築したためそのへんの手順も記載しています。
（ProxyサーバーのURLは仮に http://proxy.example.com:8080/ とします。）

# 主なバージョン

- docker 18.09.0
- docker-compose 1.23.1
- Host:Centos7.3
- Container:
 - PHP 7.3.3
 - MySQQL 5.7
 - Memcached 1.4


# ツールのインストール
- [VirtualBox-6.0.0-127566-Win.exe](https://www.virtualbox.org/wiki/Downloads)
- [vagrant_2.2.2_x86_64.msi](https://www.vagrantup.com/downloads.html)
- [Win7AndW2K8R2-KB3191566-x64.zip](https://docs.microsoft.com/ja-jp/powershell/wmf/5.1/install-configure)

すべてデフォルトインストールでよかったと思います。

#  Vagrant Pluginの設定
管理者権限でコマンドプロンプトを起動し、以下のコマンドを実行します。

```shell-session
> set http_proxy=proxy.example.com:8080
> set https_proxy=proxy.example.com:8080

> vagrant plugin install vagrant-vbguest
> vagrant plugin install vagrant-proxyconf
```

※ vagrant-proxyconfのVer.2.0.0でエラーとなる場合があるようなのでその場合1系を指定してインストールしてみてください。

# VagrantFileの設定

以下だけ設定してあとはデフォルトです。

```config:Vagrantfile
# OSの指定
config.vm.box = "bento/centos-7.3"

# ポートフォワーディング
config.vm.network "forwarded_port", guest: 80, host: 80
config.vm.network "forwarded_port", guest : 22, host: 2222

# マウントするディレクトリーの設定
config.vm.synced_folder "./", "/vagrant", owner: "vagrant", group: "vagrant"

# タイムアウト設定
config.vm.boot_timeout = 120

# シンボリックリンクの作成を許可
config.vm.provider :virtualbox do |vb|
  vb.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate/vagrant", "1"]
end

# proxy設定
if Vagrant.has_plubin?("vagrant-proxyconf")
  config.proy.http = "http://proxy.example.com:8080/"
  config.proy.https = "http://proxy.example.com:8080/"
  config.proxy.no_proxy = "localhost, 127.0.0.1"
end
```

# Vagrantのセットアップ
管理者権限でコマンドプロンプトを起動し、以下のコマンドを実行します。

```shell-session
> mkdir workspace
> cd workspace
> vagrant box add bento/centos-7.3 https://app.vagrantup.com/bento/boxes/centos-7.3
> vagrant up
```

<font color="Red">Error getting repository data for C7.6.1810-base, repository not found</font>

vagrant up時に上ようにマウントができないとエラーが出る場合は yum update を実行すれば解決します。

localhost:2222にログインし、yumをアップデートする。

```shell-session
# yum update
```

その後、再度コマンドプロンプトにて起動。

```shell-session
> vagrant up
```

# docker, docker-compose のインストール
無事Vagrantが起動したらDockerのインストールを実行します。

必要なパッケージをもろもろインストールします。

```shell-session
# yum install -y yum-utils device-mapper-persistent-data lvm2
```

yumのパッケージインデックスを更新。(DockerのINSTALLやUPGRADEの前にやっておくことを推奨されているらしい。)

```shell-session
# yum makecache fast
```

レポジトリを追加します。

```shell-session
# yum-config-manager -add-repo https://download.docker.com/Linux/centos/docker-ce
```

Dockerのインストール·起動。

```shell-session
# yum install -y docker-ce
# systemctl start docker
```

起動確認。

```shell-session
# docker --version
Docker version 18.09.0, build 4d60db4
```

続いてdocker-composeを入れます。

```shell-session
# curl "https://github.com/docker/compose/releases/download/1.28.1/docker-compose-$(uname -s)-$(uname-m)" -o /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose
```

起動確認。

```shell-session
# docker-compose --version
docker-compose version 1.23.1, build b02f1306
```

# DockerのProxy設定

dockerサービス用ディレクトリ下に、http-proxy.conf ファイルを作成します。

```shell-session
# mkdir /etc/systemd/system/docker.service.d
```

http-proxy-confファイルに下記の内容を入力し、保存します。

```shell-session
# vi /etc/systemd/system/docker.service.d/http-proxy.conf

[Service]
Environment="HTTP_PROXY=http://proxy.example.com:8080/"
```

Dockerサービスの再起動。

```shell-session
sudo systemctl daemon-reload
sudo systemctl restart docker
```
# 設定ファイルの作成

各コンテナの設定ファイルをVagrant上に作成します。
(名前やパスワード類は適当なので適宜変更してください。)

**下記ファイルををまとめて GitHub に上げました。**
https://github.com/higuching/dev-lamp


```config:構成
docker-compose.yml
└ php/
  └ contents
    └ index.php             // 中身は <?php phpinfo();
  └ Dockerfile
  └ php.ini
└ mysql/
  └ Dockerfile
  └ my.cnf
```


```docker-compose.yml
version: '2'

services:
  mysql:
    build: ./mysql
    hostname: 'localhost_mysql'
    environment:
      MYSQL_ROOT_PASSWORD: hogehoge
    volumes:
      - ./mysql/db:/var/lib/mysql
    container_name: dev_mysql
  php:
    build: ./php
    hostname: 'localhost'
    environment:
      HTTP_PROXY: http://proxy.example.com:8080
      HTTPS_PROXY: http://proxy.example.com:8080
    ports:
      - '80:80'
    volumes:
      - /vagrant/hoge:/httpd/hoge    # コンテンツソースファイルなど
    links:
      - mysql
      - memcached
    container_name: dev_php
  memcached:
    image: memcached:1.4
    ports:
      - '1121:1121'
    container_name: dev_memcached
```
```conf:php/Dockerfile
FROM php:7.3.3-apache

ENV http_proxy http://proxy.example.com:8080
ENV https_proxy http://proxy.example.com:8080
ENV PHP_MEMCACHED_VERSION 3.1.3

COPY php.ini /usr/local/etc/php/

RUN apt-get update
RUN apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng-dev libmcrypt-dev ¥
  && docker-php-ext-install pdo_mysql mysqli mbstring gd iconv
RUN docker-php-ext-install opcache

RUN apt-get install -y apache2
ADD hoge.conf /etc/apache2/sites-available/hoge.conf
RUN cd /etc/apache2/sites-available/ && a2ensite hoge.conf && a2dissite 000-default.conf

RUN apt-get install -y libmemcached-dev zlib1g-dev
RUN curl -L -o /tmp/memcached.tar.gz https://github.com/php-memcached-dev/php-memcached/archive/v$PHP_MEMCACHED_VERSION.tar.gz ¥
    && tar xfz /tmp/memcached.tar.gz ¥
    && rm -r /tmp/memcached.tar.gz ¥
    && mkdir -p /usr/src/php/ext ¥
    && mv php-memcached-$PHP_MEMCACHED_VERSION /usr/src/php/ext/memcached ¥
    && echo memcached >> /usr/src/php-available-exts ¥
    && docker-php-ext-install memcached

RUN { ¥
  echo 'session.save_handler = memcached'; ¥
  echo 'session.save_path = memacched:1121'; ¥
} >> /usr/local/etc/php/conf.d/docker-php-ext-memcached.ini

# その他プロファイラやテストなど入れる場合は追記
```
```config:mysql/Dockerfile
FROM mysql:5.7

ENV http_proxy http://proxy.example.com:8080
ENV hppts_proxy http://proxy.example.com:8080

COPY ./my.cnf /etc/mysql/conf.d/

RUN /etc/init.d/mysql start
```

# コンテナのビルド·起動

コンテナをビルドします。

```shell-session
# cd /path/to/dir/
# docker-compose build           //--no-cacheオプションをつけるとフルビルドになります。
```

続いてコンテナを起動します。

```shell-session
# docker-compose up -d
```

# ブラウザで確認

以下のURLにアクセスして php_info が表示されれば完了です。

http://localhost/

# Tips

- ホストからDBへのログイン方法

```shell-session
# mysql -u root -p -h 127.0.0.1 --port 3306
```

- 各コンテナへのログイン方法

```shell-session
# docker exec -it dev_php /bin/bash
```