【忘備録】EC2内にDockerでPython3環境を構築する

## 概要

### 内容
- AWSのEC2にDockerを用いてPython環境を構築する
    - 今回はseleniumでのブラウザ自動操作のパッケージを含めてコンテナ化する

### 環境
- OS:AWS Linux2
- サービス：AWS(EC2)
- タイプ：t2.micro

### 前提
- 自分のアカウントから上記環境のEC2が立てられている状態

### 参考資料
- [Amazon ECS における Docker の基本](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/userguide/docker-basics.html)
- [docker docker-compose コマンド](https://qiita.com/souichirou/items/6e701f6469822a641bdd)
- [DockerImageをDockerHubに登録する方法](https://qiita.com/kon_yu/items/7c40f4dfbd1cce006ce7)
- [AWS EC2インスタンスにdockerとdocker-composeをインストールして簡単なWEBサービスを立ち上げる方法](https://qiita.com/y-do/items/e127211b32296d65803a)

この辺から一部抜き出して履行。

### 必要なファイル
- Dockerfile
- docker-compose.yml

## 工程

- EC2インスタンスへ接続
- インスタンスでインストールされているパッケージとパッケージキャッシュを更新

```
$ sudo yum update -y
```

- 最新の Docker Community Edition パッケージをインストール

```
$ sudo amazon-linux-extras install docker
```

- 次はDocker Composeをcurlでインストール。

```
$ sudo curl -L https://github.com/docker/compose/releases/download/1.21.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
```
```
$ sudo chmod +x /usr/local/bin/docker-compose
```
```
$ docker-compose --version
```
バージョンが表示されていたら成功


- Dockerサービスを開始

```
$ sudo service docker start
```

- ec2-user をdockerグループに追加し、今後コマンドで入力するsudoを省略する

```
$ sudo usermod -a -G docker ec2-user
```

- 反映させるために一旦ログアウトし、再びEC2にログインする
- ec2-user が sudo を使用せずに Docker コマンドを実行できることを確認

```
$ docker info
```

### 2.Dockerhubに登録
- DockerHubにアカウント登録
    - https://hub.docker.com/

- リポジトリを作成

- EC2でDockerHubにログインする

```
$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: アカウント名
Password: パスワード
Login Succeeded
```

### 3.Dockerイメージを作成するためのファイルを作成

- 必要なファイル
    - Dockerfile
    - docker-compose.yml

- Dockerfileを作成。

```
$ touch Dockerfile
```

- vimで中身を編集

```
$ vim Dockerfile
```

- 今回はpython3とブラウザの自動操作をするためのパッケージが入ったイメージコンテナを作成する。

```dockerfile:Dockerfile

FROM python:3
USER root

RUN apt-get update
RUN apt-get -y install locales && \
localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8
ENV TZ JST-9
ENV TERM xterm

#各種パッケージをインストール
RUN apt-get install -y vim less
RUN pip install --upgrade pip
RUN pip install --upgrade beautifulsoup4
RUN pip install --upgrade chromedriver
RUN pip install --upgrade chromedriver-binary
RUN pip install --upgrade datetime
RUN pip install --upgrade pandas
RUN pip install --upgrade pyyaml
RUN pip install --upgrade requests
RUN pip install --upgrade selenium
RUN pip install --upgrade regex
```
- 上記をコピーし:wqで保存する


- 次はdocker-compose.ymlを作成

```
touch docker-compose.yml
```

- これもvimで中身を編集。
```
vim docker-compose.yml
```

```yml:docker-compose.yml
version: '3'
services:
  python3:
    restart: always
    build: .
    container_name: 'scrayping'
    working_dir: '/root/'
    tty: true
    volumes:
      - ./opt:/root/opt
```
- 上記をコピーし:wqで保存する

### 3.Dockerイメージを作成

- docker-compose.ymlの内容に基づいてイメージを作成する
    - このとき「-t」でdockerhubでつけるアカウント名/イメージ名にタグを命名しておかないとDockerHubにpush出来ない。注意

```
$ docker-compose build -t {dockerhubのアカウント名/イメージ名}
```

- イメーシを作成できたかチェック

```
$ docker images

REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
shunsukenashiki/scrayping   latest              ed6df28c956e        About an hour ago   1.15GB
```

こんな感じで作られていればOK


### 4.Dockerイメージを元に、コンテナを作成

- 作成したDocker imageを元にコンテナを作る
    - 「-d」をつける理由は、-dをつけないとバックグラウンドでコンテナが起動しないから

```
$ docker run -d --name #{任意のコンテナ名} -d -it {REPOSITORY名}
```

- コンテナが作成され、起動されているかチェック。作成できていたら完了

```
$ docker ps

CONTAINER ID        IMAGE                       COMMAND             CREATED             STATUS              PORTS               NAMES
b42460c71e9c        shunsukenashiki/scrayping   "python3"           5 seconds ago       Up 4 seconds                            scrayping
```

#### 5.作成したコンテナを実行する

- 作成したコンテナを実行する

```
$ docker exec -it #{任意のコンテナ名} bash
```

- Dockerfileに指定したバージョンが入っていれば完了

```
$ pip3 list

Package         Version
--------------- ---------
beautifulsoup4  4.9.1
certifi         2020.6.20
chardet         3.0.4
chromedriver    2.24.1
DateTime        4.3
idna            2.10
numpy           1.19.1
pandas          1.1.0
pip             20.2.1
python-dateutil 2.8.1
pytz            2020.1
requests        2.24.0
selenium        3.141.0
setuptools      49.2.1
six             1.15.0
soupsieve       2.0.1
urllib3         1.25.10
wheel           0.34.2
zope.interface  5.1.0
```

### Doekerhubにアップロードする

- 動作確認できたら、Dockerhubにpushしていく

```
$ docker push shunsukenashiki/{dockerhubのアカウント名/イメージ名}:latest
```
- Dockerhubにちゃんと紐づけられていれば完了。あとはここからimageをpullすれば使いまわせる