1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

1人で0からWebアプリを作成できるようになる入門記事(1) Docker入門

Last updated at Posted at 2024-06-29

この記事は1人で0からWebアプリを作成できるようになる入門記事の第一回です

結論から

1.プロジェクトに以下のファイルを作成

docker-intro-directory.png

docker-compose .yaml
version: '3.8'
services:
    nginx:
        build:
            context: .
            dockerfile: Dockerfile
        image: nginx:latest
        container_name: nginx
        ports:
            - 8080:80
        volumes:
            - ./source:/var/www/html/localhost
        tty: true
        stdin_open: true
        environment:
            - NGINX_HOST=localhost
            - NGINX_PORT=80
Dockerfile
FROM nginx:latest
COPY nginx.conf /etc/nginx/nginx.conf
RUN apt update && \
    apt install vim -y
RUN mkdir -p /var/logs/nginx
EXPOSE 80
nginx.conf
events {
    worker_connections  4096;
}
http{
    include mime.types;
    default_type application/octet-stream;
    server{
        listen 80;
        server_name localhost;
        root /var/www/html/localhost;
        charset UTF-8;
    }
    log_format formatA '[$time_local]$connection - $status';
    access_log /var/logs/nginx/access_log formatA;
}
source/index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>Docker Test</title>
    <link href="index.css" rel="stylesheet" type="text/css" media="all" />
  </head>
  <body>
    <h1>Docker is running!</h1>
    <h2>Dockerfile</h2>
    <div class="code-block">
      FROM nginx:latest <br />
      COPY index.html /var/www/html/localhost/ <br />
      COPY index.css /var/www/html/localhost/ <br />
      RUN apt update && \ <br />
      apt install vim
    </div>
    <h2>docker-compose.yaml</h2>
    <div class="code-block">
      version: '3.8'<br />
      services:<br />
      &nbsp;&nbsp;nginx:<br />
      &nbsp;&nbsp;&nbsp;&nbsp;build:<br />
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;context: .<br />
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dockerfile: Dockerfile<br />
      &nbsp;&nbsp;&nbsp;&nbsp;image: nginx:latest<br />
      &nbsp;&nbsp;&nbsp;&nbsp;container_name: nginx<br />
      &nbsp;&nbsp;&nbsp;&nbsp;ports:<br />
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- 8080:80<br />
      &nbsp;&nbsp;&nbsp;&nbsp;volumes:<br />
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- ./source:/var/www/html/localhost<br />
      &nbsp;&nbsp;&nbsp;&nbsp;tty: true<br />
      &nbsp;&nbsp;&nbsp;&nbsp;stdin_open: true<br />
      &nbsp;&nbsp;&nbsp;&nbsp;environment:<br />
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- NGINX_HOST=localhost<br />
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- NGINX_PORT=80
    </div>
  </body>
</html>
source/index.css
div.code-block {
    color: aqua;
    background: black;
    margin: 1rem;
    padding: 1rem;
    width: 70%;
}

2.以下のコマンドでイメージ作成・コンテナ/作成・起動/停止・削除

イメージの作成
docker-compose build
コンテナの作成・起動
docker-compose up
コンテナの停止・破棄
docker-compose down
コンテナでコマンド実行
docker-compose run [サービス名] [コマンド]
コンテナでコマンド実行(起動中のコンテナ)
docker-compose exec [サービス名] [コマンド]

目次

1.1 Dockerとは何か?

Docker はアプリケーションを開発(developing)、移動(shipping)、実行(running)するためのオープンなプラットフォームです。Docker はインフラストラクチャ 1 とアプリケーションを切り離すため、ソフトウェアを短時間で提供できます。Docker があれば、アプリケーションを管理するのと同じ方法で、あなたのインフラも管理できます。Docker 的な手法を最大限活用しますと、テストやコードのデプロイを素早くできますので、コードを書いてから、プロダクション(実行環境)で動かすまでにかかる時間を著しく軽減できます。

Docker ドキュメント日本語化プロジェクト「Docker 概要」
https://docs.docker.jp/get-started/overview.html

何言ってるのかわかない人向けの要約・補足:

  • アプリを作るにはアプリの本体(ソースコード)に加えて、アプリを動かすための環境(ハードウェアやOS)が必要
  • アプリを作る際に、そのアプリが特定の環境でしか動かないと不便
  • Dockerは1つのコンピュータの中に、アプリを動かすための複数の環境を再現できる
  • また、Dockerは環境の詳細をアプリのソースコードのように記述できる

1.2 Dockerの基本的な概念

コンテナ (Container)

Dockerはコンテナと呼ばれる環境の上でアプリケーションを実行します。コンテナには、アプリケーションの実行に必要なものがすべて詰まっています。

docker-abst.png

イメージ (Image)

イメージはコンテナの元となるテンプレートファイルです。イメージはDockerfileというファイルを用いて記述され、DockerfileにはOSの情報や環境変数、コンテナを作成するために実行するコマンドなどを記述します。

Dockerファイル(Dockerfile)

Dockerファイルはイメージを作成する方法(レシピ)が書かれたファイルです。Dockerファイルからイメージをbuildし、イメージからコンテナをcreateします。

docker-abst-2.png

1.3 Dockerのインストール

1.4 Dockerfileの作成とイメージのビルド

どこかに適当なフォルダを作り、その中に以下のようなファイルを作成してください。

index.html
<h1>Hello Docker!</h1>
Dockerfile
FROM nginx:latest
COPY index.html /var/www/html/localhost/index.html
RUN service nginx start
ENV NGINX_HOST=localhost
ENV NGINX_PORT=80
EXPOSE 80

Docker Desktopが起動した状態で、先ほど作成したディレクトリに移動して以下のコマンドを実行。

イメージの作成
docker build -t nginx:latest .

以下のコマンドで作成したイメージの一覧が確認できます。

イメージ一覧
docker image ls
結果
REPOSITORY               TAG       IMAGE ID       CREATED             SIZE
nginx                    latest    25957b75ef68   1 minutes ago      253MB

1.5 コンテナの作成・起動と停止

1.4で作成したイメージからコンテナを作成して起動します
以下のコマンドでイメージ名を指定してコンテナを作成できます

コンテナの作成
docker create [オプション] [イメージ名:タグ]
コンテナの作成
docker create --name nginx -p 8080:80 nginx:latest

コンテナが作成されているか確認します

コンテナの確認
docker container ls -a
結果
CONTAINER ID   IMAGE          COMMAND                   CREATED              STATUS    PORTS     NAMES
e5ad83bf5621   nginx:latest   "/docker-entrypoint.…"   About a minute ago   Created             nginx

コンテナに割り振られたID CONTAINER ID 、作成元のイメージ名 IMAGE 、コンテナの名前 NAMES 、状態 STATUS が確認できます

次に、以下のコマンドでコンテナを起動します

コンテナの起動
docker start [コンテナ名:タグもしくはコンテナID]
コンテナの起動
docker start nginx

コンテナが起動できているか確認します。

コンテナの確認
docker container ls
結果
CONTAINER ID   IMAGE          COMMAND                   CREATED         STATUS         PORTS     NAMES
e5ad83bf5621   nginx:latest   "/docker-entrypoint.…"   5 minutes ago   Up 4 seconds   80/tcp    nginx

-a オプションですべてのコンテナを表示し、ない場合は起動中のコンテナのみを表示します。

http://localhost:8080/index.htmlにアクセスすると以下のような画面が表示されます

nginx_hello_docker.png

以下のコマンドでコンテナを停止できます。

コンテナの停止
docker container stop [コンテナ名]
コンテナの停止
docker container stop nginx

コンテナの status がstoppedになっているか確認します

コンテナ確認
docker container ls -a
結果
CONTAINER ID   IMAGE          COMMAND                   CREATED         STATUS                      PORTS     NAMES
e5ad83bf5621   nginx:latest   "/docker-entrypoint.…"   6 minutes ago   Exited (0) 19 seconds ago             nginx

また、以下のコマンドでコンテナを削除できます。

コンテナの停止
docker container rm [コンテナ名]
コンテナの停止
docker container rm nginx
コンテナ確認
docker container ls -a
結果
CONTAINER ID   IMAGE          COMMAND                   CREATED         STATUS                      PORTS     NAMES

docker run はコンテナの作成docker createとコンテナの起動docker startを両方実行してくれます。通常はこちらを使う場合が多いです。

コンテナの作成・起動
docker run [オプション] [イメージ名]
docker run --name nginx -p 8080:80 nginx:latest

1.6 コンテナ上でのコマンドの実行

以下の方法で実行中のコンテナでコマンドを実行することができます

コマンド実行(起動中のコンテナ)
docker exec [コンテナ名] [コマンド]

試しに、以下のコマンドでフォルダの中身を表示してみます。

lsコマンド実行
docker exec nginx ls /var/www/html/localhost
結果
index.html

また、-itオプションをつけてbashコマンドを実行するとコンテナのシェルに入ることができます

コマンド実行
docker exec -it nginx bash

このコマンド実行の方法はdocker runコマンドでも使えます

コマンド実行
docker run -it nginx:latest bash

1.7 Docker Composeによる複数コンテナの管理

Docker Compose を使うと、複数のコンテナをまとめて起動することができます
Docker Compose では、yamlファイルを用いて記述を行います
複数のコンテナをまとめて管理できるメリットだけでなく、yamlで簡単に記述でき、見通しがいいというメリットもあります。

ディレクトリに以下のファイルを作成してください

docker-intro-directory.png

source/index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>Docker Test</title>
    <link href="index.css" rel="stylesheet" type="text/css" media="all" />
  </head>
  <body>
    <h1>Docker is running!</h1>
    <h2>Dockerfile</h2>
    <div class="code-block">
      FROM nginx:latest <br />
      COPY index.html /var/www/html/localhost/ <br />
      COPY index.css /var/www/html/localhost/ <br />
      RUN apt update && \ <br />
      apt install vim
    </div>
    <h2>docker-compose.yaml</h2>
    <div class="code-block">
      version: '3.8'<br />
      services:<br />
      &nbsp;&nbsp;nginx:<br />
      &nbsp;&nbsp;&nbsp;&nbsp;build:<br />
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;context: .<br />
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dockerfile: Dockerfile<br />
      &nbsp;&nbsp;&nbsp;&nbsp;image: nginx:latest<br />
      &nbsp;&nbsp;&nbsp;&nbsp;container_name: nginx<br />
      &nbsp;&nbsp;&nbsp;&nbsp;ports:<br />
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- 8080:80<br />
      &nbsp;&nbsp;&nbsp;&nbsp;volumes:<br />
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- ./source:/var/www/html/localhost<br />
      &nbsp;&nbsp;&nbsp;&nbsp;tty: true<br />
      &nbsp;&nbsp;&nbsp;&nbsp;stdin_open: true<br />
      &nbsp;&nbsp;&nbsp;&nbsp;environment:<br />
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- NGINX_HOST=localhost<br />
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- NGINX_PORT=80
    </div>
    <a href="http://localhost:8090">localhost:8090</a>
  </body>
</html>
index.css
div.code-block {
    color: aqua;
    background: black;
    margin: 1rem;
    padding: 1rem;
    width: 70%;
}
nginx.conf
events {
    worker_connections  4096;
}
http{
    include mime.types;
    default_type application/octet-stream;
    server{
        listen 80;
        server_name localhost;
        root /var/www/html/localhost;
        charset UTF-8;
    }
    log_format formatA '[$time_local]$connection - $status';
    access_log /var/logs/nginx/access_log formatA;
}
Dockerfile
FROM nginx:latest
COPY nginx.conf /etc/nginx/nginx.conf
RUN mkdir -p /var/logs/nginx
ENV NGINX_HOST=localhost
ENV NGINX_PORT=80
EXPOSE 80
docker-compose .yaml
version: '3.8'
services:
    nginx-1:
        build:
            context: .
            dockerfile: Dockerfile
        image: nginx-1:latest
        container_name: nginx-1
        ports:
            - 8080:80
        volumes:
            - ./source:/var/www/html/localhost
        tty: true
        stdin_open: true
        environment:
            - NGINX_HOST=localhost
            - NGINX_PORT=80
    nginx-2:
        image: nginx:latest
        container_name: nginx-2
        ports:
            - 8090:80
        tty: true
        stdin_open: true

各項目の解説

  • version
    Composeファイル形式のバージョン指定(2024/6現在3.8が最新)
  • services
    サービス(Dockerのイメージ、コンテナ、設定などのまとまり)の一覧
  • build
    ビルドdocker-compose build時の設定
    • context
      DockerfileなどDockerのビルドに必要なファイルの場所を指定する
    • dockerfile
      context内のDockerfileを指定する
  • image
    イメージを指定する。指定されたイメージが無ければbuildを元にイメージを作成する
  • container_name
    コンテナ名を指定する
  • ports
    ポート転送設定。ホスト側のポート:コンテナ側のポート
  • volumes
    ホスト側のディレクトリとコンテナ側のディレクトリを同期する
  • tty
    コンテナに入出力デバイスを割り当てる
  • stdin_open
    標準入出力とエラー出力をコンテナに結びつける

次に、ディレクトリ上で以下のコマンドを実行してイメージを作成します。

イメージの作成
docker-compose build

以下のコマンドでコンテナを作成・起動します

コンテナの作成・起動
docker-compose up

localhost:8080/index.html
にアクセスして確認します

このような画面が表示されます
nginx_index_html.png

localhost:8090
にアクセスして確認します

こちらはNginxのデフォルトの画面になっています
welcome_to_nginx.png

コンテナの停止・破棄
docker-compose down

で終了・コンテナを破棄します。

また、

デタッチモードでの起動
docker-compose up -d

でデタッチモードとして起動できます

コマンドを実行するときは

コマンド実行
docker-compose run [サービス名] [コマンド]
コマンド実行(起動中のコンテナ)
docker-compose exec [サービス名] [コマンド]

で実行できます

1.8 DockerHubからイメージを取得

Dockerhubには、様々なイメージが公開されています。
これらのイメージを利用すれば、自分で環境を構築しなくても、最初から使える環境が入手できます。

Ubuntu
https://hub.docker.com/_/ubuntu

Python
https://hub.docker.com/_/python

PyTorch
https://hub.docker.com/r/pytorch/pytorch

NodeJS
https://hub.docker.com/_/node

OpenJDK
https://hub.docker.com/_/openjdk

Go
https://hub.docker.com/_/golang

なんでもあります

1
2
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
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?