書籍「Pythonで学ぶ強化学習」のサンプルコードを実行可能な環境をdockerで構築 (プロキシ版)

# 概要
[書籍「Pythonで学ぶ強化学習」のサンプルコードを実行可能な環境をdockerで構築 (GUI出力対応)](https://qiita.com/kinziro/items/cb29f5ce9e0961e4895c)を会社等のプロキシ環境で使う際の設定になります。

# 環境
Ubuntu 18.04

# 目指す環境
- python==3.5
- tensorflow==1.12.0
- docker内でグラフプロット等のGUI使用可能
- **プロキシ環境で動作するコンテナ**

# 下準備
### 1. dockerのインストール
[書籍「Pythonで学ぶ強化学習」のサンプルコードを実行可能な環境をdockerで構築 (GUI出力対応)](https://qiita.com/kinziro/items/cb29f5ce9e0961e4895c#1)の1を参照

### 2. ホスト側のGUI表示用設定
[書籍「Pythonで学ぶ強化学習」のサンプルコードを実行可能な環境をdockerで構築 (GUI出力対応)](https://qiita.com/kinziro/items/cb29f5ce9e0961e4895c)の2を参照

### 3. NVIDIAドライバーとnvidia-docker2のインストール(GPU使用の場合)
[書籍「Pythonで学ぶ強化学習」のサンプルコードを実行可能な環境をdockerで構築 (GUI出力対応)](https://qiita.com/kinziro/items/cb29f5ce9e0961e4895c)の3を参照

### 4. dockerのプロキシ設定とsudoなし設定
docker pull等を実行できるようにdockerのプロキシ設定を行います。
あとsudoも使わなくていいように設定しておきます。

参考記事 : [Ubuntu Docker インストールとproxyとsudo無し実行](https://qiita.com/yusk24/items/05d6377975f3ba7118cf)

### 5. DNSの設定
Ubuntuの場合、dockerコンテナのDNS設定はホスト側のDNS設定を引き継ぎます。
具体的にはホストの「/etc/resolve.conf」がコンテナ内にコピーされます。
この際にGUIの設定画面等で設定したホスト側のDNS設定やDHCPから配布された設定が「/etc/resolve.conf」に反映されていない場合があります。
以下のページを参考に、nameserverが自分自身を指定している場合(127.0.0.1など)の場合は設定を変更して下さい。

参考記事 : [Ubuntu 16.10: /etc/resolv.confのnameserver 127.0.0.1を防ぐ](https://www.hiroom2.com/2017/08/24/ubuntu-1610-nameserver-127-0-0-1-ja/)

# dockerの設定
### 6. Dockerfile
[書籍「Pythonで学ぶ強化学習」のサンプルコードを実行可能な環境をdockerで構築 (GUI出力対応)](https://qiita.com/kinziro/items/cb29f5ce9e0961e4895c)と比べて②環境変数設定, ③apt.confの作成 を追加しています。これでコンテナ内のプロキシ環境変数とaptのプロキシを設定しています。
使用する際は「PROXY_ID」, 「PROXY_PASS」, 「PROXY_HOST」, 「PROXY_PORT」のoooを自分のプロキシの「認証ID」, 「認証パスワード」, 「サーバー名」, 「ポート番号」に変更します。

```docker:Dockerfile
# GPUの場合
#FROM tensorflow/tensorflow:1.12.0-gpu-py3
# ①CPUの場合
FROM tensorflow/tensorflow:1.12.0-py3
COPY into_container/requirements.txt /root/

# ②環境変数設定
ENV PROXY_ID ooo
ENV PROXY_PASS ooo
ENV PROXY_HOST ooo
ENV PROXY_PORT ooo
ENV PROXY_SERVER http://"$PROXY_ID":"$PROXY_PASS"@"PROXY_HOST":"PROXY_PORT"
ENV http_proxy "$PROXY_SERVER"
ENV https_proxy "$PROXY_SERVER"
ENV ftp_proxy "$PROXY_SERVER"
ENV HTTP_PROXY "$PROXY_SERVER"
ENV HTTPS_PROXY "$PROXY_SERVER"
ENV FTP_PROXY "$PROXY_SERVER"

# ③apt.confの作成
RUN echo "Acquire::ftp::proxy \"""$PROXY_SERVER""\";" > /etc/apt/apt.conf \
 && echo "Acquire::fttp::proxy \"""$PROXY_SERVER""\";" >> /etc/apt/apt.conf \
 && echo "Acquire::fttps::proxy \"""$PROXY_SERVER""\";" >> /etc/apt/apt.conf

# ④パッケージインストール
RUN add-apt-repository -y ppa:jonathonf/vim \
 && apt-get update \
 && apt-get install -y git vim xterm sudo python3-tk \
 && pip3 install --upgrade pip \
 && pip3 install -r /root/requirements.txt

# ⑤ユーザーの切り替え
RUN groupadd -g 1000 developer && \
    useradd  -u 1000 -g 1000 --groups sudo --create-home --shell /bin/bash developer && \
    echo 'developer:P@ssw0rd' | chpasswd
USER developer
WORKDIR /home/developer
```

### 7. ビルド
普通にビルドすればOKです。

```build.sh
docker build -t baby-steps-env .
```

### 8. コンテナ起動

[書籍「Pythonで学ぶ強化学習」のサンプルコードを実行可能な環境をdockerで構築 (GUI出力対応)](https://qiita.com/kinziro/items/cb29f5ce9e0961e4895c)の5を参照

### 9. 実行

[書籍「Pythonで学ぶ強化学習」のサンプルコードを実行可能な環境をdockerで構築 (GUI出力対応)](https://qiita.com/kinziro/items/cb29f5ce9e0961e4895c)の6を参照

### 7. 動作確認

コンテナ内のbashコンソールで

[書籍「Pythonで学ぶ強化学習」のサンプルコードを実行可能な環境をdockerで構築 (GUI出力対応)](https://qiita.com/kinziro/items/cb29f5ce9e0961e4895c)の7を参照

### 8. Gitリポジトリ
Gitに今回紹介したソースをあげていますのでよければご利用ください。
Ubuntu用 : [kinziro/baby-steps-ubuntu-env_on_docker_in_proxy](https://github.com/kinziro/baby-steps-ubuntu-env_on_docker_in_proxy)

# 参考にさせて頂いたサイト
[Ubuntu Docker インストールとproxyとsudo無し実行](https://qiita.com/yusk24/items/05d6377975f3ba7118cf)
[Ubuntu 16.10: /etc/resolv.confのnameserver 127.0.0.1を防ぐ](https://www.hiroom2.com/2017/08/24/ubuntu-1610-nameserver-127-0-0-1-ja/)