hijikitaroのブログ

しがないSIerとして、日々プロジェクトを管理し、システムを育て、日々お子を見守り育てる中での出来事や学びを淡々と書いています。

AWS EC2 Linux で Docker と Docker Compose を利用する方法

はじめに

背景

Dockerを名前だけ知っている状態から使える状態にしたい、いや、今後のITに関わっていく身として使える状態にするべきと感じたため。

目的

Dockerを使える、以上。

開発環境

※Dockerを実行する環境はAWSAWSにつなぐ環境としてWindows・Git Bash

セットアップ

セットアップ実行による各環境の状態の概要イメージ図は下記となる(自分の脳内イメージ)

インストール前

f:id:hijikitaro:20190806003312p:plain
Docker_1
Dockerインストール後
f:id:hijikitaro:20190806003315p:plain
Docker_2
Docker Composeインストール後
f:id:hijikitaro:20190806003317p:plain
Docker_3

前提

  • AWSのアカウントを持っていること(EC2サービスを利用するため)
  • DockerHubのアカウントを持っていること(最終的にDockerHubへpushまで行うため)
  • AWS EC2へ接続していること
    • Git BashAWS EC2へssh接続する(下記コマンドで接続)
#コマンド
ssh -i '{キーペア}' ec2-user@{IPv4 パブリック IP}
#結果
Last login: Sun Aug  4 11:37:01 2019 from pl73134.ag1001.nttpc.ne.jp

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/          

Dockerインストール手順

Linuxリポジトリを最新化する

#コマンド
sudo yum -y update
#実行結果
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
amzn2-core                                                   

~(省略)~

Complete!

Dockerをインストールする

#コマンド
sudo yum -y install docker
#実行結果
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
Resolving Dependencies

~(省略)~

Complete!

Dockerを起動する

#コマンド
sudo service docker start
#実行結果
Redirecting to /bin/systemctl start docker.service

Dockerをホスト側でいつも起動している状態にする

#コマンド
sudo chkconfig docker on
#実行結果
Note: Forwarding request to 'systemctl enable docker.service'.
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.

ec2-userにDocker起動の権限を付与する(sudoなしでDockerコマンドが実行可能とする)

#コマンド
sudo usermod -a -G docker ec2-user
#実行結果(なし)
#コマンド
sudo gpasswd -a $USER docker
#実行結果
Adding user ec2-user to group docker

Dockerを再起動する

#コマンド
sudo systemctl restart docker
#実行結果(なし)

AWSへ再ログインする

Dockerの情報を確認する + sudoなしでDockerコマンドが実行できるか確認する

#コマンド
docker info
#実行結果
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 0
Server Version: 18.06.1-ce

~(省略)~

Docker Composeインストール手順

docker-composeをインストールする

#コマンド
sudo curl -L "https://github.com/docker/compose/releases/download/1.23.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
#実行結果
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   617    0   617    0     0   5876      0 --:--:-- --:--:-- --:--:--  5876
100 11.1M  100 11.1M    0     0  43.2M      0 --:--:-- --:--:-- --:--:--  101M

docker-composeの実行権限を付与する

#コマンド
sudo chmod +x /usr/local/bin/docker-compose
#実行結果(なし)

docker-composeの情報を確認する + sudoなしでDockerコマンドが実行できるか確認する

#コマンド
docker-compose --version
#実行結果
docker-compose version 1.23.1, build b02f1306

操作

操作実施による各環境の状態の概要イメージ図は下記となる(自分の脳内イメージ)

実施前

f:id:hijikitaro:20190806003322p:plain
Docker_4
Docker基本手順実施後
f:id:hijikitaro:20190806003325p:plain
Docker_5
Docker Compose基本手順実施後
f:id:hijikitaro:20190806003307p:plain
Docker_6

Docker基本手順(例:nginxイメージの起動)

※DockerFileからイメージを作成し、コンテナを起動する方法はDocker Compose基本手順に記載する

DockerHubからDockerイメージをダウンロードする

#コマンド
docker pull nginx
#実行結果
Using default tag: latest
latest: Pulling from library/nginx
f5d23c7fed46: Pull complete
918b255d86e5: Pull complete
8c0120a6f561: Pull complete
Digest: sha256:eb3320e2f9ca409b7c0aa71aea3cf7ce7d018f03a372564dbdb023646958770b
Status: Downloaded newer image for nginx:latest

Dockerイメージがダウンロードされているか確認する

#コマンド
docker images
#実行結果
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              e445ab08b2be        12 days ago         126MB

Dockerイメージからコンテナを起動する

#コマンド
docker run  -d -p 8080:80 --name nginx-test nginx
#実行結果
{CONTAINER ID}

※pullをしなくてもrunした際に、イメージがなければpullが実行される

コンテナの状況を確認する

#コマンド
docker ps -a
#実行結果
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
47fa0b8179aa        nginx               "nginx -g 'daemon of…"   27 seconds ago      Up 26 seconds       0.0.0.0:8080->80/tcp   nginx-test

コンテナへアクセスする(コンテナで起動しているアプリへアクセス)

AWS EC2 せきゅりてグループのインバウンドでTCPのポート8080をアクセス可能とする設定をしておく

http://{IPv4 パブリック IP}:8080

f:id:hijikitaro:20190806003219p:plain
demo_1

Docker Compose基本手順

Docker Compose実施用のディレクトリを作成する

#コマンド
mkdir composetest
#実行結果(なし)
#コマンド
cd composetest
#実行結果(なし)

ディレクトリ内に「app.py」ファイルを作成する

ファイルの中身は以下内容を記載(※Docker公式ドキュメントからコピペ)

from flask import Flask
from redis import Redis


app = Flask(__name__)
redis = Redis(host='redis', port=6379)


@app.route('/')
def hello():
    redis.incr('hits')
    return 'Hello World! I have been seen %s times.' % redis.get('hits')


if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True)

ディレクトリ内に「requirements.txt」ファイルを作成する

ファイルの中身は以下内容を記載(※Docker公式ドキュメントからコピペ)

flask
redis

ディレクトリ内に「Dockerfile」ファイルを作成する

ファイルの中身は以下内容を記載(※Docker公式ドキュメントからコピペ)

FROM python:2.7
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD python app.py

DockerfileからDockerイメージを作成する

#コマンド
docker build -t web .
#実行結果
Sending build context to Docker daemon  4.096kB
Step 1/5 : FROM python:2.7
2.7: Pulling from library/python

~(省略)~

Successfully built dc0c5e997d61
Successfully tagged web:latest

ディレクトリ内に「docker-compose.yml」ファイルを作成する

ファイルの中身は以下内容を記載(※Docker公式ドキュメントからコピペ)

version: '2'
services:
  web:
    build: .
    ports:
     - "5000:5000"
    volumes:
     - .:/code
    depends_on:
     - redis
  redis:
    image: redis

Docker Composeで各コンテナを起動する

#コマンド
docker-compose up
#実行結果
Creating network "composetest_default" with the default driver
Pulling redis (redis:)...
latest: Pulling from library/redis

~(省略)~

web_1_cd3269ab739c |  * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
web_1_cd3269ab739c |  * Restarting with stat

コンテナへアクセスする(コンテナで起動しているアプリへアクセス)

AWS EC2 せきゅりてグループのインバウンドでTCPのポート5000をアクセス可能とする設定をしておく

http://{IPv4 パブリック IP}:5000

f:id:hijikitaro:20190806003309p:plain
demo_2

終わりに

今回でかなりDockerが何者かが見えてきた気がする。さらに、雰囲気の理解としてGitとかなり近いものを感じる。例えば、コマンドが同じなど。今度はDockerとGitの類似性について調べてみるとさらに理解が深まるのではと感じている。

参考