Dockerでforward proxyサーバー(squid)を立てる using Dockerfile

## やること
* proxyサーバ(squid)起動状態のコンテナを立ち上げたい
* [Dockerでforward proxyサーバーを立てる with centos6.5 on virtualbox - Qiita](http://qiita.com/jpshadowapps/items/c70e0d3a977f3889ae48) の続編的なメモ

## 環境
* Virtualbox 4.3.10
    * 作業PCはMac (Mavericks)
* Vagrant 1.4.3
    * 1.5以上は色々とハマるので1.4.3に落とした...
* Docker 0.9.0

## 作業ログ

### Vagrantfile作成

```rb
# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "centos65_86"
  config.vm.box_url = "https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box"

  config.vm.define :vmcentdocker do |vmcentdocker|
    vmcentdocker.vm.hostname = "vmcentdocker"
    vmcentdocker.vm.network :private_network, ip: "192.168.56.110"

    vmcentdocker.vm.provider :virtualbox do |vb|
      vb.customize ["modifyvm", :id, "--memory", 768]
    end

   vmcentdocker.vm.provision :docker do |d|
     d.pull_images "centos"
   end
  end
end
```

### vagrant upでVM起動

```
% vagrant up
:
:
[vmcentdocker] Setting hostname...
[vmcentdocker] Configuring and enabling network interfaces...
[vmcentdocker] Mounting shared folders...
[vmcentdocker] -- /vagrant
[vmcentdocker] Running provisioner: docker...
[vmcentdocker] Installing Docker (latest) onto machine...
[vmcentdocker] Pulling Docker images...
[vmcentdocker] -- Image: centos
```

### vagrant sshでVMにログイン、マウントしたDIRに移動


```
% vagrant ssh

$ cd /vagrant
```

### Dockerfile作成

```
$ vi Dockerfile
```

```
FROM centos:latest
MAINTAINER jpshadowapps

RUN yum -y update

# squidをインストール
RUN yum -y install squid

# 実行ポートを公開
EXPOSE 3128

# squidのサービスを開始し、tail -f を実行してコンテナを起動したままにする
CMD /etc/init.d/squid start && tail -10f /var/log/squid/access.log
```

### ※squidをフォアグラウンド起動させたい場合は？

* 設定ファイルを置き換える。具体的には。。。
* `yum install squid`した際のデフォルトの`/etc/init.d/squid` では、変数定義ファイル`/etc/sysconfig/squid`を別途読み込んでいる
* このファイルでsquid起動時のオプション変数`SQUID_OPTS`が定義されている
* __コンテナのsquidをフォアグラウンドで起動して、docker runをデタッチモードで実行する__ ことによって「squid起動状態のコンテナ」を立ち上げたいので、このオプション変数を独自設定した`/etc/sysconfig/squid`を用意して、Dockerfileで`ADD [src] [dst]`して置き換える
    * `-N`オプションを設定する

```
$ vi add_files/etc/sysconfig/squid
```
```
SQUID_OPTS="-N"

SQUID_SHUTDOWN_TIMEOUT=100
SQUID_CONF="/etc/squid/squid.conf"
```
```
$ vi Dockerfile
```
```
:
:
ADD add_files/etc/sysconfig/squid /etc/sysconfig/squid
:
:
```

### dockerイメージ作成


```
$ docker build -t centos:squid .

:
:
Step 4 : EXPOSE 3128
 ---> Running in 2b71a333a2e9
 ---> 447a4a2f8c7f
Step 5 : CMD /etc/init.d/squid start && tail -10f /var/log/squid/access.log
 ---> Running in db8c6cff2920
 ---> 0a751d73c320
Successfully built 0a751d73c320
:
:
```

### コンテナ起動

* `-d`でデタッチモードで起動する
* `-p [HOST_PORT]:3128`でホストVMとポートバインディングする

```
$ docker run -t -d -p 13128:3128 centos:squid

$ docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                     NAMES
a3055a971f5a        centos:squid        /bin/sh -c /etc/init   2 seconds ago       Up 1 seconds        0.0.0.0:13128->3128/tcp   grave_lumiere
```

#### 別コンソールでdocker attachしておく

* コンテナ起動時に最後に実行したコマンドが`tail -10f`なので、フォアグラウンドで起動したままになっていて、
* tailの結果は標準出力に出力されるので、
* `docker attach`や`docker logs`で標準出力に流れたログを確認することが出来る

```
$ docker attach a3055a971f5a
```

### VM => squidコンテナ => 外部サイト の通信確認

```
$ curl -x localhost:13128 http://www.google.co.jp/
:
(取得したコンテンツをズラズラ表示)
:

$
```

#### docker attachしておいたコンソール

* tailしてるアクセスログが出力される

```
$ docker attach a3055a971f5a
:
1399547799.259    106 172.17.42.1 TCP_MISS/200 12995 GET http://www.google.co.jp/ - DIRECT/173.194.72.94 text/html
```

## メモ

* __あるサービスが起動状態のコンテナ__ を立ち上げたい場合
    * フォアグラウンド起動をサポートしてるサービスの場合
        * サービスはフォアグラウンドで・コンテナはデタッチモード（バックグラウンド）で起動 することによって実現可能
    * フォアグラウンド起動をサポートしていない、あるいはサービススクリプトが用意されていないサービスの場合
        * サービススクリプトでの起動後にダミーのコマンド（例えば`tail -f`でウォッチしたいログをtailしたままにするとか）を実行して、コンテナが終わらないようにする
            * 例 `CMD /etc/init.d/hoge start && tail -10f /var/log/hoge.log`
        * [Supervisor: A Process Control System — Supervisor 4.0.0-dev documentation](http://supervisord.org/) 等を使って起動スクリプトをデーモン化した上で、上記操作で起動する
        * 参考リンク : [Docker+Serf+HAproxy (+Supervisor) | SOTA](http://deeeet.com/writing/2014/04/08/docker-serf-haproxy/)


## 成果物
* [jpshadowapps/docker-centos-squid](https://github.com/jpshadowapps/docker-centos-squid)