Dockerの導入について

Dockerの導入について

I. Dockerは何?

Dockerとは、アプリケーションを開発・配置 ・デプロイ・実施するためのオープンソースプラットフォームです。Dockerを使用すると、アプリケーションをインフラストラクチャから分離できるため、ソフトウェアを迅速に配信できます。 アプリケーションを管理するのと同じ方法でインフラストラクチャを管理できます。 コードを迅速にデプロイ、配置 、テスト、デプロイするためのDockerの方法論を利用することで、コードの書きから本番環境での実行までの遅延を大幅に減らすことができます。

II. Dockerの主なメリット

  • 仮想マシンとは異なり、Dockerは数秒で起動および停止します。
  • 必要な各システムでコンテナを起動できます。
  • コンテナは、仮想マシンよりも高速に構築および削除できます。
  • 作業環境の設定が簡単。
  • 一度だけ設定するだけで、依存関係を再インストールする必要はありません。
  • 他の部分に影響を与える環境を削除するときに、ワークスペースをクリーンに保ちます。

III. インストール

https://docs.docker.com/get-docker/ のURLを参照ください

IV. DOCKER IMAGE

Docker Imageは、コンテナーの作成に使用される読み取り専用のテンプレートです。 Imageは読み取り専用レイヤーで構成されます。 Imageの作成は、いくつかの追加のカスタマイズを使用して別のImageに基づくことができます。 つまり、Docker Imageは、OS、パッケージ、実行するソフトウェアなどの環境設定を保存する場所です。

V. CONTAINER

Docker Containerは、アプリケーションを実行するために必要なすべてのものが含まれているDocker Imageから作成されます。 仮想化と見たいですが、コンテナは非常に軽いので、システムプロセスと見なすことができます。 コンテナの開始、停止、または再起動には数秒しかかかりません。 物理サーバーを使用すると、いくつかの普通な仮想マシンを実行する代わりに、Dockerコンテナーを実行できます。

VI. CONTAINER [C] と仮想マシン [VM]の比較

CONTAINER VIRTUAL MACHINE
リソース コンテナ内のプロセスは実際のリソースを直接使用しますが、オペレーティングシステムは、各プロセスに異なるリソース制限(または無制限)を規定できます。 すべてが仮想ハードウェアによって制限されます。
実施  実OSがソフトウェアを実行します。 実OS→仮想OS→ソフトウェアを実行している仮想OS。 (VPSの場合、ハイパーバイザータイプ1が実際のOSに置き換わります)
パフォーマンス 実際のソフトウェアは実際のハードウェアで実行されます。 起動速度はほぼ通常のソフトウェアと同じです。 実ハードウェアは仮想OSを搭載する必要があります。 コンピュータが起動したため、ソフトウェアが使用されるまでに時間がかかりました。
セキュリティー 同じコンテナ内のプロセスは、引き続き相互に影響を与える可能性があります。 ただし、通常、各コンテナは1つのプロセスのみを実行する必要があります。 異なるコンテナのプロセスは互いに影響を与えることはできません。 ソフトウェアに悪意のあるコードがあると、同じVM内の他のプロセスリソースに影響を与える可能性があります。
サポートソフトウェア Docker Engine, LXC Linux Container, Apache Mesos, CRI-O (Kubernetes)… VirtualBox, VMWare, Microsoft Hyper-V, Parallels, Linux KVM, Docker Machine…

 

VII. DOCKERFILE

Dockerfileは、DockerがImageをビルドするためのコンフィグファイルです。 基本Imageを使用することで初期Imageクラスを構築します。 いくつかの基本的なImage:python、ubuntu、alpine。 次に、追加のレイヤーがある場合は、ベースレイヤーの上にスタックされます。

コンフィグ:

  • FROM:元のImageを指定します:python, ubuntu, alpine…
  • LABEL :Imageにメタデータを提供します。 メンテナー情報を追加するために使用できます。 Imageのラベルを表示するには、dockerinspectコマンドを使用します。
  • ENV :環境変数を設定します。
  • RUN :Imageを構築するときにコマンドを作成できます。 パッケージをコンテナにインストールするために使用されます。
  • COPY :ファイルとフォルダーをコンテナーにコピーします。
  •  ADD :ファイルとフォルダーをコンテナーにコピーします。
  • CMD :実行可能コンテナのコマンドと引数を指定します。 パラメータはオーバーライドでき、CMDのみです。
  • WORKDIR :次のような他のディレクティブの作業ディレクトリを設定します。例えば:RUN, CMD, ENTRYPOINT, COPY, ADD,…
  • ARG :Imageのビルド中に使用される変数値を定義します。
  • ENTRYPOINT :実行可能コンテナのコマンドと引数を指定します。
  • EXPOSE :Imageのポートを定義します。
  • VOLUME :データにアクセスして保存するためのディレクトリマウントポイントを作成します

例:

FROM node:12-alpine
RUN apk add git
RUN mkdir -p /home/node/app
WORKDIR /home/node/app
COPY package*.json ./
RUN npm install
COPY . .
ENV HOST=0.0.0.0 PORT=3334
EXPOSE $PORT
CMD [ "node", "." ]

VIII. 概念

Docker Client:ターミナルのコマンドでdockerと相互作用します。 DockerクライアントはAPIを使用してコマンドをDockerデーモンに送信します。

Docker Daemon:DockerAPIからのリクエスト用のDockerサーバーです。 Image、コンテナ、ネットワーク、およびボリュームを管理します。

Docker Volumes:アプリを使用および作成するためのデータを継続的に保存する場所です。

Docker Registry:Docker Imagesのプライベートストレージです。 Imageはレジストリにプッシュされ、クライアントはレジストリからImageをプルします。 独自のレジストリ、またはAWS、Google Cloud、MicrosoftAzureなどのプロバイダーのレジストリを使用できます。

Docker Hub: Docker Images最大のレジストリ(デフォルト)です。 Imageを検索して、Docker Hub(無料)に独自のImageを保存できます。

Docker Repository:同じ名前でタグが異なるDockerイメージのセット。 例:node:12-alpine.

Docker Networking:コンテナを相互に接続できます。 この接続は、1つまたは複数のホスト上で行うことができます。

Docker Compose:このツールを使用すると、複数のDockerコンテナーでアプリを簡単に実行できます。 Docker Composeを使用すると、docker-compose.ymlファイルでコマンドを構成して再利用できます。 Dockerがインストールされた状態で利用できます。

Docker Swarm:コンテナーのデプロイを調整します。

Docker Services:本番環境のコンテナーです。 サービスはImageのみを実行しますが、Imageを実行する方法を暗号化します。 使用するポート、サービスを実行するためのコンテナーのコピー数は、必要かつ即時のパフォーマンスを発揮します。

IX. Dockerの基本なコマンド

image/containerリスト

docker image/container ls

すべてのontainersリスト

docker ps –a

containerをストップ

docker stop <Container名>

ImageからContainerを実施かつContainer名を変更

docker run –name <Container名> <Image名>

すべてのcontainerをストップ

docker stop $(docker ps –a –q)

containerログを表示

docker logs <Container名>

containerからImageをビルド

docker build -t <Container名> 

バックグラウンドで実行されるコンテナを作成

docker run -d <Image名>

containerを起動

docker start <Container名>

See more: https://docs.docker.com/reference/

X. 初期設定

ステップ1: AWSのEC2にアクセス

  • Tera Termツールを開く
  • HostにホストサーバIPを入力

  • usernameとkeyに入力してから、OKボタンを押下する
  • ステップ2: Dockerをインストール

    1. あなたのインステンスでパッケージを更新
      sudo yum update -y
    2. Dockerをインストール
      sudo yum install docker -y
    3. Dockerサービスを起動
      sudo service docker start
    4. ec2-userをdockerグループに追加して、sudoを使用せずにDockerコマンドを実行できるようにします。
      sudo usermod -a -G docker ec2-user

       

    ステップ3: GITの設定

    1.  Gitをセットアップ
      sudo yum install git
      
    2.  デプロイを行いたいソースコードをGitからClone/pullする
      git clone https://usernameToken:passwordToken@gitlab.com/<project name>/<git name>.git
      または
      git pull origin develop

    ** usernameTokenはDeployToken名であって、passwordTokenは文字のランダムな文字列からGitで自動に作成する。(こちらを参照).

XI. デプロイ

  1. ソースコード格納しているフォルダに移動
    cd <プロジェクトフォルダ>
    

    ソースのDockerfile-devファイルは以下により設定されること

    # Check out https://hub.docker.com/_/node to select a new base image
    FROM node:12-alpine
    RUN apk add git
    
    # Set to a non-root built-in user `node`
    USER node
    
    # Create app directory (with user `node`)
    RUN mkdir -p /home/node/app
    WORKDIR /home/node/app
    
    ENV NODE_ENV="<環境名>"
    ENV PORT="3334" ENV DEBUG="front:*"
    ENV SESSION_SECRET="session-secret"
    
    # Install app dependencies
    # A wildcard is used to ensure both package.json AND package-lock.json are copied
    # where available (npm@5+)
    COPY package*.json ./
    RUN npm install
    
    # Bundle app source code
    COPY . .
    
    # Bind to all network interfaces so that it can be mapped to the host OS
    ENV HOST=0.0.0.0 PORT=3334
    EXPOSE $PORT
    CMD [ "node", "." ]
  2. Imageソースをビルド
    docker build --no-cache -t <Image名> -f Dockerfile.dev . (開発環境用)

    * -t : Imageタグのオプション
    * . : ソースフォルダ
    * –no-cache: キャッシュ保存しない

  3. ImageソースでContainerを起動
    docker run -dp <ホスト·ポート>:<Containerポート> --name <Container名> <Image名>

    * –name: Container名を設定。名前は一意です。そうでない場合は、dockerが生成します。
    * -p: containerポートを開く.
    * -d: バックグラウンドモードをターンオン

  4. nginxフォルダにアクセス
    cd nginx

    nginxフォルダ中にdefault.confとDockerfileファイルを含めている
    default.confファイル:

    server {
        location / {
              proxy_set_header Host $host;
              proxy_set_header X-Real-IP $remote_addr;
              proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
              proxy_set_header X-Forwarded-Proto $scheme;
              proxy_pass http://app:3334;
        }
    }

    Dockerfileファイル

    FROM nginx
    RUN rm /etc/nginx/conf.d/* 
    COPY default.conf /etc/nginx/conf.d/
  5. ソース用Image nginxをビルド
    docker build -t es/nginx .
  6. es/nginxのContainerを起動
    docker run -dp 80:80 --link <Container名>:app --name nginx-proxy es/nginx

ステップ3: ImageとContainerを表示

  • imageリスト

  •  containerリスト

ステップ4:Websiteにアクセス

XI. 参照

https://docs.docker.com/get-docker/

https://docs.docker.com/reference/

https://docs.docker.com/

https://egghead.io/lessons/node-js-setup-an-nginx-proxy-for-a-node-js-app-with-docker