AWS EC2 Linux で Docker と Docker Compose を利用する方法
- はじめに
- 開発環境
はじめに
背景
Dockerを名前だけ知っている状態から使える状態にしたい、いや、今後のITに関わっていく身として使える状態にするべきと感じたため。
目的
Dockerを使える、以上。
開発環境
※Dockerを実行する環境はAWS、AWSにつなぐ環境としてWindows・Git Bash
セットアップ
セットアップ実行による各環境の状態の概要イメージ図は下記となる(自分の脳内イメージ)
インストール前 Dockerインストール後 Docker Composeインストール後
前提
- AWSのアカウントを持っていること(EC2サービスを利用するため)
- DockerHubのアカウントを持っていること(最終的にDockerHubへpushまで行うため)
- AWS EC2へ接続していること
#コマンド 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
操作
操作実施による各環境の状態の概要イメージ図は下記となる(自分の脳内イメージ)
実施前 Docker基本手順実施後 Docker Compose基本手順実施後
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
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
終わりに
今回でかなりDockerが何者かが見えてきた気がする。さらに、雰囲気の理解としてGitとかなり近いものを感じる。例えば、コマンドが同じなど。今度はDockerとGitの類似性について調べてみるとさらに理解が深まるのではと感じている。
参考
- Docker
- Linux