前期第04回 - oddmutou/jugyo-2026kyototech GitHub Wiki

今回の目標

  • Dockerをインストールできるように
  • Docker Compose をインストールできるように
  • Docker Compose コマンドを叩けるように
  • Docker上で起動したnginxで静的ファイルを配信できるように

Docker

Docker とは

仮想的な環境を簡単に作るための技術です。仮想的な環境は簡単に作成と削除を行うことができ,面倒なミドルウェアのインストール・設定を毎回行う必要がなくなります。

仮想的な環境のことをコンテナと呼びます。一つのサーバー(コンピューター)内に沢山作ることができ,また同時に動かすことができます。

コンテナは 仮想マシン (VMと呼ばれます) と似たように扱えるのですが,仮想マシン(VM)と違って,ホストと一部のリソースを共有します(※1)。そのため,仮想マシン(VM)にくらべオーバーヘッドが小さく,より軽量で,より早く作成と削除ができます。

※1 WindowsやMacにもDockerを便利に使えるツール(Docker Desktop)が有りますが,その場合は共有しません。Linux上でLinuxのコンテナを上げるからこそ資源を共有できるのです。WindowsやMacでDockerを使う時は結局LinuxのVMが上がってしまうのです。この授業ではLinuxをインストールしているサーバー(EC2インスタンス)上でDockerを使うため気にしなくてもいいですが,もしWindowsやMacのパソコン上で作業をする場合はVM上げるのとあまり違いがないということを片隅に置いといてください。

Docker インストール方法 & 自動起動化

Amazon Linux2の場合

sudo yum install -y docker
sudo systemctl start docker
sudo systemctl enable docker

dockerをインストールをすることができましたが、dockerは全てのユーザーが使えるようになってはいません。

デフォルトのユーザー(ec2-user)でもsudoつけずにdockerコマンドを立たけるように、dockerグループに追加します。

sudo usermod -a -G docker ec2-user

ご存知の通り、usermodを反映するために一度ログアウトする必要があります。

sshの場合は一度ログアウトしログインしなおすことで反映させることができます。

screenのウィンドウ等もすべて一度終了させる(exitコマンドで)とよいでしょう。

Docker Compose

この授業では直接dockerコマンドを叩くことはあまりしません。全てDocker Composeというツール経由でdockerを叩きます。

Docker Compose とは

複数のDockerのコンテナを簡単に扱うためのツール(Dockerコマンドのサブコマンド)です。

参考: https://docs.docker.com/compose/

Docker Compose インストール方法

Amazon Linux 2 の場合

DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
mkdir -p $DOCKER_CONFIG/cli-plugins
curl -SL https://github.com/docker/compose/releases/download/v5.1.2/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose
chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose

インストールできたかどうかの確認

docker compose version

buildx の新しいバージョンのインストール

Amazon Linux の標準のパッケージマネージャがインストールするDockerの場合、buildの最新版を別途導入する必要がある場合があります。

mkdir -p ~/.docker/cli-plugins
ARCH=$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/')
BUILDX_URL=$(curl -s https://api.github.com/repos/docker/buildx/releases/latest | grep "browser_download_url.*linux-$ARCH" | cut -d '"' -f 4)
curl -L $BUILDX_URL -o ~/.docker/cli-plugins/docker-buildx
chmod +x ~/.docker/cli-plugins/docker-buildx

docker buildx version で確認して、 v0.34.1 (またはそれ以上のバージョン) が表示されたら大丈夫です!

(参考: https://github.com/amazonlinux/amazon-linux-2023/issues/1032#issuecomment-3874686692)

docker compose 使ってみよう

Docker Composeは,カレントディレクトリにあるcompose.ymlという設定ファイルを参照します。(もちろんオプションで他の場所にある設定ファイルを参照することもできます。)

まずは作業用のディレクトリを作ってその中に移動しましょう。

mkdir dockertest
cd dockertest

まずは設定ファイルを書きましょう。

vim compose.yml

中身はこんなかんじ

services:
  web:
    image: nginx:latest
    ports:
      - 80:80

起動

docker compose up

起動できたら,ウェブブラウザでEC2インスタンスのホスト名またはIPアドレス(SSHでログインするときと同じもの)に接続してみましょう。

ブラウザのURLのところに http://IPアドレス と入力して開いてみましょう。

Welcome to nginx!って表示されていたら成功です。

確認できたら Docker Compose を停止させてみましょう。ログが流れているウィンドウ(先程docker compose upを叩いたところ)で Ctrl+C(コントロールキーとCの同時押し)を押すと終了します。

nginx

nginxとは

Webサーバーです。さっき上げましたね。

自分の作ったファイルや,プログラムの出力結果もWebに配信することができます。

nginxでファイルを配信してみましょう

nginxの設定ファイルを書いてみましょう。

まず設定ファイル用のディレクトリを作ります。

mkdir nginx
mkdir nginx/conf.d

設定ファイルを作成

vim nginx/conf.d/default.conf

中身はこんなかんじで

server {
    listen       0.0.0.0:80;
    server_name  _;
    charset      utf-8;

    root /var/www/public;
}

次に配信するファイルを置くディレクトリをつくります。

mkdir public

配信するファイルを作りましょう。

vim public/index.html

なかみはこんなかんじで

<!DOCTYPE html>
<h1>Hello world</h1>

最後に compose.yml を編集します。

vim compose.yml

なかみはこんなかんじで

services:
  web:
    image: nginx:latest
    ports:
      - 80:80
    volumes:
      - ./nginx/conf.d/:/etc/nginx/conf.d/
      - ./public/:/var/www/public/

シメにdocker compose を再起動して確認。

先程docker compose upしたままの場合はCtrl+Cで終了させる。 その後,再度docker compose upを叩いて起動。

ブラウザで http://EC2インスタンスのアドレス/index.html にアクセスして確認してみましょう。

複数ファイルを置いてみる

nginxのルート下に、さらにディレクトリを作って、index.html 以外のファイルを設置することができます。

mkdir public/hoge
vim public/hoge/huga.html

適当にHTMLを書いて、 ブラウザで http://EC2インスタンスのIPアドレス/hoge/huga.html にアクセスして確認してみましょう。

演習

適当に複数ページを作って、a要素(<a href="">みたいなやつのこと)を使ってページ間で遷移できるようにしてください。href属性は相対パスで指定しましょう。

例: http://54.81.21.121/profile.html

⚠️ **GitHub.com Fallback** ⚠️