3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Dockerを使用してコンテナを作成し、AWSのECS(Elastic Container Service)にデプロイする基本手順

Last updated at Posted at 2024-04-08

Dockerコンテナの基本的な使い方をまとめました。
コンテナにハードルを感じている方々が、「なんだ、簡単じゃん」と感じてくれて、
コンテナの活用が進むと幸いです。

今回の構成

image.png

Dockerを使用してコンテナを作成し、AWSのECS(Elastic Container Service)にデプロイする手順

1 . Dockerfileの作成
Dockerfileに必要な指定内容を入力。

2 . コンテナイメージの作成
docker buildコマンドを使用して、Dockerfileからコンテナイメージを作成。

3 . ECRへのコンテナイメージのアップロード
docker loginコマンドを使用して、ECRにログイン。
docker pushコマンドを使用して、ECRにコンテナイメージをアップロード。

★ECRの使い方は、以前記載したブログをご参考にしてください。
④ECRにdockerイメージを登録する
https://qiita.com/kimuni-i/items/54249bf7d8620280fd2c

4 . クラスターの作成
AWSのECSコンソールから新しいクラスターを作成。

5 . タスク定義の作成
ECSコンソールからタスク定義を作成し、必要な設定を行います。

6 . クラスターへのサービスのデプロイ
ECSコンソールから新しいサービスをデプロイします。
必要なタスク数を設定し、ロードバランサーで新しいターゲットグループとして設定します。

前提条件docker環境が用意されている事
(Cloud9には、既に環境が用意されているので、環境作成の手間は、かからない)

Dockerが使える状態であるのかを確認

docker コマンドの確認

Admin_8fd6cc7b33f6a9f5:~/environment $ docker version
Client:
 Version:           20.10.25
 API version:       1.41
 Go version:        go1.20.12
 Git commit:        b82b9f3
 Built:             Fri Dec 29 20:37:18 2023
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server:
 Engine:
  Version:          20.10.25
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.20.12
  Git commit:       5df983c
  Built:            Fri Dec 29 20:38:05 2023
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.7.11
  GitCommit:        64b8a811b07ba6288238eefc14d898ee0b5b99ba
 runc:
  Version:          1.1.11
  GitCommit:        4bccb38cc9cf198d52bebf2b3a90cd14e7af8c06
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0
Admin_8fd6cc7b33f6a9f5:~/environment $

1.Dockerfileの作成

Dockerfile に以下の内容を入力する

#作成するコンテナイメージの基となるベースイメージは DockerHub で公開されている Ubuntu 18.04
ここで指定する
FROM ubuntu:18.04

# Install dependencies
# Web サーバーとして Apache HTTP Server をインストール
RUN apt-get update && \
 apt-get -y install apache2

# Install apache and write hello world message
# 'Hello World!'と表示するindex.htmlファイルを作成する
RUN echo 'Hello World!' > /var/www/html/index.html

# Configure apache
RUN echo '. /etc/apache2/envvars' > /root/run_apache.sh && \
 echo 'mkdir -p /var/run/apache2' >> /root/run_apache.sh && \
 echo 'mkdir -p /var/lock/apache2' >> /root/run_apache.sh && \ 
 echo '/usr/sbin/apache2 -D FOREGROUND' >> /root/run_apache.sh && \ 
 chmod 755 /root/run_apache.sh

#コンテナが利用するネットワークポートを指定 ポート80 http通信
EXPOSE 80

#コンテナ実行時に動かすコマンド
#Webサーバを起動するシェルスクリプト
CMD /root/run_apache.sh

参考 AWS Document : https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/docker-basics.html

HTML ファイルから Dockerfile の文字列を張り付けるときに、ノーブレークスペースが入ることがある。これがあると正常に稼働しないため、以下の sed コマンドでノーブレークスペースを削除する

Admin_8fd6cc7b33f6a9f5:~/environment $ sed -i "s/$(echo -ne '\u200b')//g" Dockerfile

既に存在している DockerImage の一覧を確認

Admin_8fd6cc7b33f6a9f5:~/environment $ docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

現状、何もないことがわかる

2.コンテナイメージを作成

docker build コマンドを実行することで、Dockerfile で設定した内容を基に、コンテナイメージを作成

-t : 作成するコンテナイメージに指定したタグを付与。
hello-world というわかりやすいタグを指定

Admin_8fd6cc7b33f6a9f5:~/environment $ docker build -t hello-world .
Sending build context to Docker daemon  9.288MB
Step 1/6 : FROM ubuntu:18.04
18.04: Pulling from library/ubuntu
7c457f213c76: Pull complete 
Digest: sha256:152dc042452c496007f07ca9127571cb9c29697f42acbfad72324b2bb2e43c98
Status: Downloaded newer image for ubuntu:18.04
 ---> f9a80a55f492
Step 2/6 : RUN apt-get update &&  apt-get -y install apache2
 ---> Running in 02d0c76cd3bc
Get:1 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]
・・・
Processing triggers for libc-bin (2.27-3ubuntu1.6) ...
Removing intermediate container 02d0c76cd3bc
 ---> 3eaea64c4ace
Step 3/6 : RUN echo 'Hello World!' > /var/www/html/index.html
 ---> Running in fd4b9bc73ad4
Removing intermediate container fd4b9bc73ad4
 ---> 4f54400202cc
Step 4/6 : RUN echo '. /etc/apache2/envvars' > /root/run_apache.sh &&  echo 'mkdir -p /var/run/apache2' >> /root/run_apache.sh &&  echo 'mkdir -p /var/lock/apache2' >> /root/run_apache.sh &&  echo '/usr/sbin/apache2 -D FOREGROUND' >> /root/run_apache.sh &&  chmod 755 /root/run_apache.sh
 ---> Running in f8132314a3a9
Removing intermediate container f8132314a3a9
 ---> ed08c62a508b
Step 5/6 : EXPOSE 80
 ---> Running in f892873fd1ee
Removing intermediate container f892873fd1ee
 ---> 2b6a40c5c729
Step 6/6 : CMD /root/run_apache.sh
 ---> Running in d8129f714c30
Removing intermediate container d8129f714c30
 ---> 3ce3f58ab047
Successfully built 3ce3f58ab047
Successfully tagged hello-world:latest

作成されたことを確認するために、DockerImage の一覧を確認

Admin_8fd6cc7b33f6a9f5:~/environment $ docker images 
REPOSITORY    TAG       IMAGE ID       CREATED          SIZE
hello-world   latest    3ce3f58ab047   30 seconds ago   205MB
ubuntu        18.04     f9a80a55f492   10 months ago    63.2MB

現在なにもコンテナを動かしていないことを確認するために、docker ps コマンドを実行する

Admin_8fd6cc7b33f6a9f5:~/environment $ docker ps                                                                                                                     
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

コンテナを動かす

Dockerコンテナを起動し、その動作を確認する

Admin_8fd6cc7b33f6a9f5:~/environment $ docker run -d -p 8080:80 --name Hello-local-run hello-world
5ed45c17eee0d4747ea015c047dc2c4e61df5b5f0fa025c7846c1c437bd673af

このコマンドは、hello-worldというイメージからHello-local-runという名前のコンテナを作成し、バックグラウンドで実行します。また、ホストの8080番ポートとコンテナの80番ポートをマッピングします。

Admin_8fd6cc7b33f6a9f5:~/environment $ docker ps
CONTAINER ID   IMAGE         COMMAND                  CREATED          STATUS          PORTS                                   NAMES
5ed45c17eee0   hello-world   "/bin/sh -c /root/ru…"   11 seconds ago   Up 11 seconds   0.0.0.0:8080->80/tcp, :::8080->80/tcp   Hello-local-run

現在実行中のDockerコンテナを表示するコマンドです。結果として、Hello-local-runという名前のコンテナが8080番ポートで実行中であることが示されます。

Admin_8fd6cc7b33f6a9f5:~/environment $ curl localhost:8080
Hello World!

ホストの8080番ポートにHTTPリクエストを送信してレスポンスを取得するコマンドです。結果として、"Hello World!"というレスポンスが返され、コンテナが正常に動作していることが確認されます。

Admin_8fd6cc7b33f6a9f5:~/environment $ docker ps
CONTAINER ID   IMAGE         COMMAND                  CREATED         STATUS         PORTS                                   NAMES
5ed45c17eee0   hello-world   "/bin/sh -c /root/ru…"   3 minutes ago   Up 3 minutes   0.0.0.0:8080->80/tcp, :::8080->80/tcp   Hello-local-run

コンテナがまだ実行中であることを確認します。

docker exec コマンドを実行して、コンテナの中身を確認

NAMES で確認した名前を指定

Admin_8fd6cc7b33f6a9f5:~/environment $ docker exec -i -t Hello-local-run bash
root@5ed45c17eee0:/# pwd
/
root@5ed45c17eee0:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@5ed45c17eee0:/# ls -la
total 8
drwxr-xr-x   1 root root   28 Apr  8 01:24 .
drwxr-xr-x   1 root root   28 Apr  8 01:24 ..
-rwxr-xr-x   1 root root    0 Apr  8 01:24 .dockerenv
drwxr-xr-x   2 root root 4096 May 30  2023 bin
drwxr-xr-x   2 root root    6 Apr 24  2018 boot
drwxr-xr-x   5 root root  340 Apr  8 01:24 dev
drwxr-xr-x   1 root root   66 Apr  8 01:24 etc
drwxr-xr-x   2 root root    6 Apr 24  2018 home
drwxr-xr-x   1 root root   45 May 23  2017 lib
drwxr-xr-x   2 root root   34 May 30  2023 lib64
drwxr-xr-x   2 root root    6 May 30  2023 media
drwxr-xr-x   2 root root    6 May 30  2023 mnt
drwxr-xr-x   2 root root    6 May 30  2023 opt
dr-xr-xr-x 186 root root    0 Apr  8 01:24 proc
drwx------   1 root root   27 Apr  8 01:22 root
drwxr-xr-x   1 root root   33 Apr  8 01:24 run
drwxr-xr-x   2 root root 4096 May 30  2023 sbin
drwxr-xr-x   2 root root    6 May 30  2023 srv
dr-xr-xr-x  13 root root    0 Apr  8 01:24 sys
drwxrwxrwt   1 root root    6 Apr  8 01:22 tmp
drwxr-xr-x   1 root root   53 May 30  2023 usr
drwxr-xr-x   1 root root   17 Apr  8 01:22 var
root@5ed45c17eee0:/# cd /root 
root@5ed45c17eee0:~# ls -la
total 12
drwx------ 1 root root   27 Apr  8 01:22 .
drwxr-xr-x 1 root root   28 Apr  8 01:24 ..
-rw-r--r-- 1 root root 3106 Apr  9  2018 .bashrc
-rw-r--r-- 1 root root  148 Aug 17  2015 .profile
-rwxr-xr-x 1 root root  108 Apr  8 01:22 run_apache.sh
root@5ed45c17eee0:~# cat run_apache.sh
. /etc/apache2/envvars
mkdir -p /var/run/apache2
mkdir -p /var/lock/apache2
/usr/sbin/apache2 -D FOREGROUND
root@5ed45c17eee0:~# cd /var/www/html/
root@5ed45c17eee0:/var/www/html# ls -la
total 4
drwxr-xr-x 1 root root 24 Apr  8 01:22 .
drwxr-xr-x 1 root root 18 Apr  8 01:22 ..
-rw-r--r-- 1 root root 13 Apr  8 01:22 index.html
root@5ed45c17eee0:/var/www/html# cat index.html
Hello World!
root@5ed45c17eee0:/var/www/html# exit
exit

run_apache.shの内容を確認すると、
dockerfileで記載したものと同じ内容のものがある事がわかる。

3.コンテナイメージを、ECR にアップロードする

Admin_8fd6cc7b33f6a9f5:~/environment $ docker build -t アカウントid.dkr.ecr.ap-northeast-1.amazonaws.com/Hello-ecs-helloworld0408:0.0.1 .
Sending build context to Docker daemon  9.288MB
Step 1/6 : FROM ubuntu:18.04
 ---> f9a80a55f492
Step 2/6 : RUN apt-get update &&  apt-get -y install apache2
 ---> Using cache
 ---> 3eaea64c4ace
Step 3/6 : RUN echo 'Hello World!' > /var/www/html/index.html
 ---> Using cache
 ---> 4f54400202cc
Step 4/6 : RUN echo '. /etc/apache2/envvars' > /root/run_apache.sh &&  echo 'mkdir -p /var/run/apache2' >> /root/run_apache.sh &&  echo 'mkdir -p /var/lock/apache2' >> /root/run_apache.sh &&  echo '/usr/sbin/apache2 -D FOREGROUND' >> /root/run_apache.sh &&  chmod 755 /root/run_apache.sh
 ---> Using cache
 ---> ed08c62a508b
Step 5/6 : EXPOSE 80
 ---> Using cache
 ---> 2b6a40c5c729
Step 6/6 : CMD /root/run_apache.sh
 ---> Using cache
 ---> 3ce3f58ab047
Successfully built 3ce3f58ab047
Successfully tagged アカウントid.dkr.ecr.ap-northeast-1.amazonaws.com/Hello-ecs-helloworld0408:0.0.1
Admin_8fd6cc7b33f6a9f5:~/environment $ docker images 
REPOSITORY                                                                 TAG       IMAGE ID       CREATED          SIZE
hello-world                                                                latest    3ce3f58ab047   28 minutes ago   205MB
アカウントid.dkr.ecr.ap-northeast-1.amazonaws.com/Hello-ecs-helloworld0408   0.0.1     3ce3f58ab047   28 minutes ago   205MB
ubuntu                                                                     18.04     f9a80a55f492   10 months ago    63.2MB

ECR にアップロードするために、docker login

--password-stdin には、コンテナレジストリからコピーしてきた URL のうち、スラッシュ(/)より前の部分を指定する

Admin_8fd6cc7b33f6a9f5:~/environment $ aws ecr get-login-password | docker login --username AWS --password-stdin アカウントid.dkr.ecr.ap-northeast-1.amazonaws.com
WARNING! Your password will be stored unencrypted in /home/ec2-user/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

docker push で ECR に作成したコンテナイメージをアップロード

Admin_8fd6cc7b33f6a9f5:~/environment $ docker push アカウントid.dkr.ecr.ap-northeast-1.amazonaws.com/Hello-ecs-helloworld0408:0.0.1 
The push refers to repository [アカウントid.dkr.ecr.ap-northeast-1.amazonaws.com/Hello-ecs-helloworld0408]
bf74da574259: Pushed 
3947945c0619: Pushed 
89111c7b09f4: Pushed 
548a79621a42: Pushed 
0.0.1: digest: sha256:d6ff2816c249e31520c66b1d006f885a64f0ed563a6a9aced0224ce2f7688026 size: 1155

4.クラスターを作成

ECSクラスターを作成する.PNG

5.タスク定義を作成する

タスク定義を作成する1.PNG

タスク定義の設定箇所
タスク定義を作成する1 設定箇所.PNG

イメージURIには、先程ECRにプッシュしたイメージを記載する

6.クラスターにサービスをデプロイ

image.png

作成ボタンからデプロイの設定を行う
デプロイ.PNG

必要なタスクは、2つとし、
必要なタスクを2つデプロイする.PNG

ロードバランサで、新しいターゲットグループとして設定
ロードバランサ.PNG

以上で完了です。意外と簡単です。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?