asp.net coreをdockerで動かしてみたメモ

# ASP.NET COREを試す

dockerでインストールして試してみる。
[公式][*2]のサンプルはデプロイ用のようだったので開発環境のサンプルを見れるようにしてみる。


## 環境

* docker1.12.3
* ubuntu-16.04(仮想環境)
* vagrant1.8.4
* virtualbox5.1
* windows10

## フォルダ構造

```yaml
dotnet
  - bin # dockerコマンド用シェルファイル
    - start.sh            # docker-compose run dotnet /bin/bash
    - container_build.sh  # docker-compose build
    - bash.sh             # docker-compose run dotnet /bin/bash
  - docker-compose.yml
  - dotnet
    - Dockerfile
    - project # アプリケーションプロジェクトディレクトリ
      - src
        - SampleWebApplication # yo aspnet generatorで作成
        + bin
        + Controllers
        + Data
        + Models
        + obj
        + Properties
        + Services
        + Views
        + wwwroot
        - .bowerrc
        - .gitignore
        - appsettings.Development.json
        - appsettings.json
        - bower.json
        - global.json
        - Program.cs # URLをdocker用に修正
        - README.md
        - SampleWebApplication.csproj
        - SampleWebApplication.db
        - Startup.cs
        - web.config
  - nginx # docker外からasp.netにアクセスできるようにプロキシとして利用
    - Dockerfile
    - default.conf 
```

## 各ファイルの設定

仮想環境設定。

```
# ansibleインストール用shell
$ansible_install = <<SHELL
    if ! type ansible > /dev/null 2>&1; then
      sudo apt-get update
      sudo apt-get -y install libffi-dev libssl-dev python-pip # package管理ツール
      sudo pip install --upgrade pip
      sudo pip install ansible           # provisioning ツール
    fi
SHELL

# virtual machine設定
Vagrant.configure(2) do |config|
  config.vm.box = "bento/ubuntu-16.04"
  config.vm.box_version = "2.2.9"

  # 繋がらないときは/etc/network/interfaces を確認。enp0s8に設定してやる。
  config.vm.network "private_network", ip: "192.168.50.10", auto_config:false
  
  config.vm.provider "virtualbox" do |vm|
    vm.memory = 2048
    vm.linked_clone = true
    vm.customize [ "modifyvm", :id, "--ioapic", "on"]
    # vm.gui = true # 起動が止まるときの確認用
  end

  config.vm.provision "shell", inline: $ansible_install
  config.vm.provision "shell", inline: <<-SHELL
    sudo ansible-playbook -i /vagrant/provision/playbooks/inventory/hosts /vagrant/provision/playbooks/site.yml -c local
  SHELL
end
```

docker-composeの設定ファイル。

```yaml:docker-compose.yml
version: '2'
services:
  proxy:
    build: ./nginx
    links:
      - dotnet
    ports:
      - "80:80"
  dotnet:
    build: ./dotnet
    environment: 
      - ASPNETCORE_ENVIRONMENT=Development
    volumes:
      - ./dotnet/project/src/SampleWebApplication/Program.cs:/aspnetapp/project/src/SampleWebApplication/Program.cs
```

### asp.netの設定

```docker:dotnet/Dockerfile
FROM microsoft/aspnetcore-build
WORKDIR /aspnetapp
COPY . .
WORKDIR /aspnetapp/project/src/SampleWebApplication
RUN dotnet restore
RUN bower install --allow-root
ENTRYPOINT ["dotnet", "run"]
```

※SampleWebApplicationは[yo-generator aspnet][*4]で作成。
`yo aspnet mvc bootstrap SampleWebApplication`

アドレスとポートの指定。

```csharp:dotnet/project/src/SampleWebApplication/Program.cs
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;

namespace SampleWebApplication
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var host = new WebHostBuilder()
                .UseKestrel()
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseIISIntegration()
                .UseUrls("http://0.0.0.0:5001") // <-- 追記.ポート番号は任意。
                .UseStartup<Startup>()
                .Build();

            host.Run();
        }
    }
}
```

### プロキシ

```docker:nginx/Dockerfile
FROM nginx
COPY default.conf /etc/nginx/conf.d/default.conf
```

dotnetの50001ポートに８０番ポートの通信を受け渡すプロキシ設定。

```txtxt:nginx/default.conf
server{
	listen 80;
	server_name 192.168.50.10;

	location / {

		proxy_pass http://dotnet:5001;
		proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
		proxy_redirect off;
		proxy_buffering off;
		proxy_set_header Host 192.168.50.10;
		proxy_set_header X-RealIP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	}
}
```

### この時点でのソース  
[github](https://github.com/hibohiboo/develop/tree/d22ed3e8ca23cdc0bb1288b9e4570ce3c07a7323/tutorial/lesson/dotnet)

### 実行

コンテナを作成した後、asp.netをたちあげる。

```bash
./bin/container_build.sh # コンテナ作成
./bin/start.sh           # 実行
```

ブラウザでhttp://192.168.50.10 にアクセスすると、以下のような画面が表示される。

![test.png](https://qiita-image-store.s3.amazonaws.com/0/99876/1ebcba05-0681-3004-3c78-88d6ff341edc.png)

## 参照

[dotnet docker][*1]
[aspnet docker][*2]
[docker compose][*3]
[yo][*4]

[*1]:https://github.com/dotnet/dotnet-docker
[*2]:https://github.com/aspnet/aspnet-docker
[*3]:http://qiita.com/zembutsu/items/9e9d80e05e36e882caaa
[*4]:https://github.com/OmniSharp/generator-aspnet