VirtualBoxからDockerへWebサーバの移植

備忘録

# 環境
・Windows 10 professional 64bit
## VirtualBox環境
・OS : CentOS7
・メインメモリ : 2048MB
・ストレージ : 50GB (33.5GB使用中）
・フォルダマウントあり

Apache + PHP + MySQLのWebサーバ
・Apache 2.4.6
・PHP 7.2.10
・mysql  Ver 8.0.12


# VirtualBox環境を抽出
・`yum history`を使用して実行したyumの履歴を表示
![yum_history.jpg](https://qiita-image-store.s3.amazonaws.com/0/300075/04208a82-0019-0680-3999-14b1d74e6dce.jpeg)

・`yum history info ID`を使用して実行た内容を確認する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/300075/5a9cf83b-2d12-e9b5-669d-a2eba69a5295.png)

全てのyumを確認すると，Apache, PHP, MySQLの他に`Xdebug`がいインストールされているのが確認できた

上記より，Apache，PHP，MySQL,Xdebugの設定ファイルをコピーしてVirtualBoxから抽出する
【各設定ファイル】
　Apache　: /etc/httpd
　PHP, Xdebug　: /etc/php.ini, /etc/php.d
　MySQL　: /etc/my.cnf

また，DBのDUMPファイルを取得する

```bash
mysqldump -u root -p db名 > db名.dump
```
  
これらのファイルをまとめて圧縮し取り出す

```bash
# ファイルを1つのフォルダ(SetFolder)にまとめてから
tar -cf setting.tar ./SetFolder
gzip -9 setting.tar
```
この圧縮したデータをマウントしているディレクトリに移動させるか，SFTP等を使い抽出する

# Docker環境の作成
## Docker-Composeの作成
WebサーバとDBサーバを立ち上げるDocker-Composeを作成する

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

services:
 db:
  image         : mysql
  environment   :
   - MYSQL_ROOT_PASSWORD=rootpass
   - MYSQL_DATABASE=db
   - MYSQL_USER = user
   - MYSQL_PASSWORD= pass
  ports         : 
   - "53306:3306"
  volumes       : 
   - "/d/Transplant/db:/docker-entrypoint-initdb.d"
  container_name: "trans_db"

 web:
  depends_on    : 
   - db
  build         : ./build/web/
  ports         : 
   - "50080:80"
  volumes       : 
   - "/d/Transplant/html:/var/www/html"
  links         : 
   - db
  container_name: "trans_web"
  working_dir   : /var/www/html/sg
  privileged    : true
```

【各設定】
・version : Docker-Composeのバージョン
・services : 立ち上げるサービスの定義
・db, web : 立ち上げるサービス名
・images : インストールするイメージ
・environment : サービスの環境変数
・ports : 公開用ポート（ホスト側：コンテナ側）
・volumes : マウントするパス（ホスト側：コンテナ側）
・container_name : コンテナ名
・depends_on : 依存関係
・build : 構築時のオプション
・links : 他のサービスとリンクさせる
・working_dir : コンテナ内のワーキングディレクトリ
・privileged : すべてのデバイスのアクセス許可


## dockerfileの作成
Webサーバ構築オプション（`build`）で使用するdockerfileを作成する

```dockerfile:dockerfile
   FROM centos:7
   RUN  yum -y update
   RUN  yum -y install httpd
   RUN  yum install -y epel-release && \
　　　　 yum install -y http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
   RUN  yum -y remove php-*
   RUN  yum -y install --enablerepo=remi,remi-php72 php php-mbstring php-xml php-xmlrpc php-gd php-pdo php-pecl-mcrypt php-mysqlnd php-pecl-mysql
   RUN  yum --skip-broken --disablerepo=* --enablerepo=remi-php72 -y install php-pecl-xdebug
   EXPOSE 80
   
   RUN systemctl enable httpd
   CMD ["/sbin/init"]
```
CentOS7をベースにApacheとPHP，MySQL，Xdebugをインストールする
CentOS7のリポジトリではPHP7.2をインストールできないので，remiリポジトリをインストールしてremiリポジトリを使用してPHP7.2をインストールする
最後に80ポートをエクスポートし，Apacheを自動起動するようにする

Docker-Composeとdockerfileのディレクトリ関係は以下のようになっている

```
docker
 |--docker-compose.yml
 |--build
     |--web
         |--dockerfile
```

## コンテナ生成
・Docker-Composeのあるディレクトリで以下のコマンドを実行する

```powershell
$ docker-compose up -d
```
すると，docker-compose.ymlに記載された通りにコンテナが立ち上がる

## サーバ環境設定
・VirtualBoxから抽出した設定ファイルを元にサーバの設定を行う
　【各設定ファイル】
　Webサーバ
　Apache　: /etc/httpd
　PHP, Xdebug　: /etc/php.ini, /etc/php.d

　DBサーバ
　MySQL　: /etc/my.cnf

## プログラム，DBの配置
・Webサーバにプログラムを配置する
　マウントしているフォルダにプログラムを配置する

・DBサーバにデータを取り込む
　マウントしているフォルダにDUMPファイルを配置し，コンテナ内でリストアをする

```powershell
# DBサーバコンテナに入る
$ docker exec -it trans_db bash 
```

```bash
# マウントされているフォルダに移動する
$ mysql -u root -p db名 < db名.dump
```

# 参考
・[Docker Documentation](https://docs.docker.com/)
・[Docker ドキュメント日本語化プロジェクト](http://docs.docker.jp/index.html)