ゲーム開発
Unity
UnrealEngine
C++
Blender
ゲーム数学
ゲームAI
グラフィックス
サウンド
アニメーション
GBDK
制作日記
IT関連
ツール開発
フロントエンド関連
サーバサイド関連
WordPress関連
ソフトウェア設計
おすすめ技術書
音楽
DTM
楽器・機材
ピアノ
ラーメン日記
四コマ漫画
その他
おすすめアイテム
おもしろコラム
  • ゲーム開発
    • Unity
    • UnrealEngine
    • C++
    • Blender
    • ゲーム数学
    • ゲームAI
    • グラフィックス
    • サウンド
    • アニメーション
    • GBDK
    • 制作日記
  • IT関連
    • ツール開発
    • フロントエンド関連
    • サーバサイド関連
    • WordPress関連
    • ソフトウェア設計
    • おすすめ技術書
  • 音楽
    • DTM
    • 楽器・機材
    • ピアノ
  • ラーメン日記
    • 四コマ漫画
      • その他
        • おすすめアイテム
        • おもしろコラム
      1. ホーム
      2. 20210502_01

      【Docker】Dockerの基本的な使い方についてまとめる

      Dockerサーバサイド関連
      2021-05-02

      マイケル
      マイケル
      みなさんこんにちは!
      マイケルです!
      エレキベア
      エレキベア
      こんにちクマ〜〜
      マイケル
      マイケル
      今日はみんな大好き Docker を触ってみるよ!
      エレキベア
      エレキベア
      Dockerってクジラのキャラのやつクマね
      どんな機能なのクマ?
      マイケル
      マイケル
      説明しよう!
      Dockerとは・・・
      Dockerとは
      • アプリケーションやOSの開発・配備を行うためのコンテナを利用した基盤ソフトウェア
      エレキベア
      エレキベア
      よく分からないクマ・・・。
      マイケル
      マイケル
      簡単にいうとコンテナという技術を利用して環境を構築できる仕組みみたいな感じだよ!
      アプリケーションと実行環境を同梱してデプロイできるから、ポータビリティに優れているのが特徴なんだ!
      エレキベア
      エレキベア
      アプリケーションや環境をまとめて配布できたりするわけクマね
      マイケル
      マイケル
      ほぼ同じ環境を別のマシンでも構築できるから、本番環境への移行もコストが少なくて済むんだ!
      他にも、以下のような特徴があるよ!


      [メリット]
      ・数行の構成ファイルとコマンドを1つ叩くだけで同等の環境が再現できる。
      ・コンテナ型仮想化技術を利用し、オーバーヘッドが少ない。
      ・コンテナにアプリケーションと実行環境を同梱してデプロイできる。


      [デメリット]
      ・あくまでアプリケーションを入れるための箱であるため、OSとしての振る舞いを再現することはできない。
       そのため起動するホストによっては影響を受けてしまうこともある

      エレキベア
      エレキベア
      だんだん気になってきたクマ
      使ってみるクマ!
      マイケル
      マイケル
      それじゃ早速触ってみよう!

      参考書籍

      マイケル
      マイケル
      Dockerの使い方を勉強するにあたって参考にした書籍はこちらです!


      Docker/Kubernetes 実践コンテナ開発入門

      マイケル
      マイケル
      ハンズオンで実際に手を動かしながら学習できるので中々楽しいです!
      Kubernetesの内容もしっかり書かれているので、そちらが気になる方にもおすすめです!
      エレキベア
      エレキベア
      内容もかなりみっちりしているクマね

      Dockerの使い方

      マイケル
      マイケル
      Dockerコンテナを起動するまでのフローはこんな感じ!
      マイケル
      マイケル
      まず、Dockerfileというファイルを作成 して
      ビルドすることでDockerImageを作成 します!
      そして DockerImageを元にコンテナを起動 するという流れになります!
      エレキベア
      エレキベア
      ビルドして実行クマね

      Dockerイメージのビルド

      マイケル
      マイケル
      まずはビルド処理から!
      ビルドの元になるDockerfileは下記のように記述することができます!
      FROM busybox
      ENV foo /bar
      WORKDIR ${foo}   # WORKDIR /bar
      ADD . $foo       # ADD . /bar
      COPY \$foo /quux # COPY $foo /quux
      

      参考:
      Dockerリファレンス – 公式ドキュメント

      マイケル
      マイケル
      こちらの記述は下記のような内容になります!
      詳細を知りたい方はDockerの公式リファレンスを参照してください!


      1. busyboxのベースイメージを指定
      2. 環境変数fooに「/bar」を設定
      3. 「/bar」を作業ディレクトリに設定
      4. ホストのカレントディレクトリファイルを「/bar」に追加
      5. 「/bar」のファイルを「/quux」にコピー

      // ビルド
      docker image build -t 【イメージ名:タグ】 【Dockerfileパス】
      

      参考:
      Dockerコマンド – 公式ドキュメント

      エレキベア
      エレキベア
      こんな感じで環境を構築できるクマね〜〜
      マイケル
      マイケル
      作成したイメージは下記のようなコマンドで操作することができます!
      // イメージ一覧
      docker image ls
      // イメージ検索
      docker search 【検索キーワード】
      // イメージ削除
      docker rmi 【イメージID】
      // イメージ一括破棄
      docker image prune
      
      マイケル
      マイケル
      そして作成したイメージは下記コマンドでDockerHub(※)に公開することができます!
      公開後はDockerfile無しでpullコマンドで取得できるようになります!


      ※)コンテナをアップロードして公開・共有できるサービス

        Docker Hub

      // イメージのタグ付け
      docker image tag 【元イメージ名:タグ】 【新イメージ名:タグ】
      // イメージの公開
      docker login -u 【DockerId】 -p 【パスワード】
      docker image tag 【元イメージ:タグ】 【DockerId:タグ】
      docker image push 【リポジトリ:タグ】
      // イメージの取得
      docker image pull 【イメージ名:タグ】

      Dockerコンテナの操作

      マイケル
      マイケル
      イメージをビルド又は取得したら、コンテナを起動しましょう!
      下記コマンドで起動することができます!
      // コンテナの作成・実行
      docker container run 【イメージ名:タグ】 
         -d デタッチモード(自動で削除されない)で起動
         -p ポートを指定(ホスト側:コンテナ側)
         --name コンテナ名を指定
         --rm 停止時にコンテナ破棄(デタッチモード以外)
         --mount マウント設定
      
      マイケル
      マイケル
      起動したら下記のようなコマンドで操作することができます!
      こちらも詳細は公式リファレンスを参照しましょう!
      // コンテナの一覧
      docker container ls
      // コンテナの停止
      docker container stop 【コンテナ名】
      // コンテナの破棄
      docker container rm 【コンテナ名】
      // コンテナの一括破棄
      docker container prune
      // コンテナの再起動
      docker container restart 【コンテナ名】
      // 実行中コンテナでのコマンド実行
      docker container exec 【コンテナ名】 【実行コマンド】
      // コンテナ内ファイルのコピー
      docker container cp 【コピー元】 【コピー先】
      // 標準入力の取得
      docker container logs -f 【コンテナ名】
      // 利用状況の確認
      docker container stats
      エレキベア
      エレキベア
      これで大体操作できるクマね

      使ってみよう!

      マイケル
      マイケル
      それじゃ試しにコンテナ起動までやってみましょう!
      今回は下記Pythonスクリプトを動かす環境を構築します!
      import openpyxl
      
      # Excelファイル読込
      wb = openpyxl.load_workbook('sample.xlsx')
      sheet = wb['Sheet1']
      
      # A1セルの内容を出力
      print(sheet['A1'].value)
      
      ↑Excelファイルの内容を出力するPythonスクリプト

      ↑読み込むExcelファイル
      エレキベア
      エレキベア
      Excelファイルを読み込んで出力するプログラムクマね
      ディレクトリ構成
      マイケル
      マイケル
      ディレクトリ構成は下記の通り!
      先ほどのpythonファイル、Excelファイルに加えてDockerfileを作成しましょう!
      ├── 01_docker
          ├── Dockerfile
          └── sample_python
              ├── sample.py
              └── sample.xlsx
      
      Dockerイメージのビルド
      マイケル
      マイケル
      Dockerfileを下記のように記述してビルドします!
      ベースイメージは「python:3.9」、そしてExcel読み込みのために「openpyxl」というライブラリのインストールコマンドも記述しています!
      FROM python:3.9
      USER root
      
      RUN mkdir sample_python
      WORKDIR /sample_python
      
      RUN pip install openpyxl
      
      // イメージのビルド
      docker image build -t sample/pythonpj01 .
      // イメージ一覧
      docker image ls
      
      マイケル
      マイケル
      これで「sample/pythonpj01」という名前でイメージが作成されました!

      ↑イメージファイルの作成
      Dockerコンテナの起動
      マイケル
      マイケル
      そして次はコンテナの起動です!
      下記のようにオプションを指定して起動しましょう!
      マイケル
      マイケル
      –mountオプションでフォルダを紐づけることで、pythonファイルとExcelファイルを同期しています!
      // コンテナ起動
      // (name:コンテナ名 mount:ホストとコンテナのマウント設定)
      docker container run \
      --name sample_python \
      --mount type=bind,source="$PWD"/sample_python,target=/sample_python \
      -d -it sample/pythonpj01
      
      // コンテナ一覧
      docker container ls
      

      ↑コンテナの起動
      マイケル
      マイケル
      これでコンテナを起動できました!
      下記コマンドでコンテナのターミナルに入り、pythonファイルを実行してみましょう!
      // コンテナでのコマンド実行
      docker container exec -it sample_python bash
      python sample.py

      ↑コンテナ内でのコマンド実行
      マイケル
      マイケル
      無事、Excelファイル内の「ハローマイケル」が表示されました!
      エレキベア
      エレキベア
      (それは何なんだクマ・・・。)

      Docker Composeの使い方

      マイケル
      マイケル
      Dockerの基本的な使い方は以上ですが、複雑な環境を構築するためには複数のコンテナを起動する必要があります!
      マイケル
      マイケル
      そこで登場するのが docker compose です!
      docker composeとは
      • Dockerコンテナを複数起動できる仕組みのこと
      マイケル
      マイケル
      docker-compose.yml というファイルを用意することで複数のコンテナを同時に起動・停止できます!
      エレキベア
      エレキベア
      それは便利クマ〜〜〜

      Docker Composeの操作

      マイケル
      マイケル
      docker-compose.ymlは下記のように記述できます!

      参考:
      Composeを始めましょう – 公式ドキュメント

      version: '3'
      services:
        web:
          build: .
          ports:
           - "5000:5000"
        redis:
          image: "redis:alpine"
      
      マイケル
      マイケル
      処理内容は下記の通り!
      詳細は公式リファレンスを参照しましょう!


      [webコンテナ]
       1. カレントディレクトリのDockerfileをビルド
       2. ポートを「5000:5000」に設定
      [redisコンテナ]
       1. 「redis:alpine」ベースイメージを使用

      マイケル
      マイケル
      コンテナの操作コマンドは以下の通りです!
      // Dockerコンテナの実行
      docker compose up -d
      // Dockerコンテナの停止
      docker compose down
      // Dockerプロセスの確認
      docker compose ps
      エレキベア
      エレキベア
      簡単クマ〜〜〜

      使ってみよう!

      マイケル
      マイケル
      こちらも試しに触ってみましょう!
      今回は下記のようなSQLを発行するPythonスクリプトを実行します!
      import MySQLdb
      
      # 接続する 
      conn = MySQLdb.connect(
       user='user',
       passwd='password',
       host='mysql',
       db='sample')
      
      # カーソルの取得
      cur = conn.cursor()
      
      # userテーブルのデータを取得
      sql = "select * from user"
      cur.execute(sql)
      
      # 実行結果を出力
      rows = cur.fetchall()
      for row in rows:
       print(row)
      
      cur.close
      conn.close
      
      マイケル
      マイケル
      Python環境に加えてMySQL環境もコンテナとして作成する必要があります!
      これをdocker-compose.ymlファイルに記述して起動しましょう!
      エレキベア
      エレキベア
      よくある構成クマね
      ディレクトリ構成
      マイケル
      マイケル
      ディレクトリは下記のような構成にします!
      └── 02_docker_compose
          ├── docker
          │   └── Dockerfile
          ├── docker-compose.yml
          └── sample_python
              └── sample.py
      Dockerfileの作成
      マイケル
      マイケル
      Dockerfileは下記の通りです!
      今度はmysqlclientというライブラリをインストールしましょう!
      FROM python:3.9
      USER root
      
      RUN mkdir sample_python
      WORKDIR /sample_python
      
      RUN pip install mysqlclient
      
      マイケル
      マイケル
      そしてdocker-compose.ymlの記述は以下になります!
      Python環境とMySQL環境で二つコンテナを記述しましょう!
      version: '3'
      services:
          python:
              build: ./docker
              tty: true
              ports:
                  - '8000:80'
              depends_on:
                  - mysql
              volumes:
                  - ./sample_python:/sample_python
          mysql:
              image: mysql:5.7
              environment:
                  MYSQL_DATABASE: sample
                  MYSQL_USER: user
                  MYSQL_PASSWORD: password
                  MYSQL_ROOT_PASSWORD: password
              ports:
                  - "3306:3306"
              volumes:
                  - mysql-data:/var/lib/mysql
      volumes:
          mysql-data:
      
      Dockerコンテナの起動
      マイケル
      マイケル
      ファイルの準備ができたら下記コマンドで起動しましょう!
      // コンテナ起動
      docker compose up -d
      // コンテナ一覧
      docker container ls
      

      ↑コンテナの起動
      マイケル
      マイケル
      そしてMySQLに接続できる確認してデータを作成します!
      // MySQL接続(パスワードを聞かれるため入力する)
      docker container exec -it 02_docker_compose_mysql_1 mysql -u user -p sample
      // データ作成
      CREATE TABLE user (id int PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci;
      INSERT INTO user (name) VALUES ('michael'), ('elekibear');
      // データ検索
      SELECT * FROM user;
      

      ↑MySQLの接続
      マイケル
      マイケル
      最後にPythonファイルの実行!
      検索結果が表示されれば成功です!!
      // Pythonファイルの実行
      docker container exec -it 02_docker_compose_python_1 bash
      python sample.py

      ↑Pythonファイルの実行
      エレキベア
      エレキベア
      やったクマ〜〜〜〜〜

      実践的な使い方

      マイケル
      マイケル
      使い方は一通り学んだので、少し実践的な使い方をしてみます!
      以前つくったLaravelプロジェクトをDocker環境に移行 してみます!


      以前作ったシステム:

      エレキベア
      エレキベア
      これは楽しみクマね〜〜
      マイケル
      マイケル
      環境を構築するにあたっては、下記サイトを参考にさせていただきました!
      詳細を知りたい方は是非みてみてくださいね!

      参考:
      docker-composee
      Laravelの開発環境を整える方法とその解説

      エレキベア
      エレキベア
      分かりやすい記事クマ〜〜

      LaravelプロジェクトのDocker環境化

      ディレクトリ構成
      マイケル
      マイケル
      ディレクトリ構成は下記の通り!
      Laravelプロジェクトの他に、

      ・Laravelプロジェクト用のDockerfile
      ・Nginxの設定ファイル

      を作成しましょう!
      ├── docker
      │   ├── app
      │   │   └── Dockerfile
      │   └── web
      │       └── default.conf
      ├── docker-compose.yml
      └── juiceapp(※Laravelプロジェクト)
      Dockerfileの記述
      マイケル
      マイケル
      こちらはLaravelプロジェクト用のDockerfileの記述です!
      LaravelとPHPの操作に必要なライブラリを記載しています!
      FROM php:7.2-fpm
      
      # install composer
      RUN cd /usr/bin
      RUN curl -sS https://getcomposer.org/installer | php
      RUN ln -s /usr/bin/composer.phar /usr/bin/composer
      
      # install package
      RUN apt-get update
      RUN apt-get install -y git
      RUN apt-get install -y zip
      RUN apt-get install -y unzip
      RUN apt-get install -y vim
      RUN apt-get install -y libpq-dev
      RUN docker-php-ext-install pdo_mysql pdo_pgsql
      
      WORKDIR /var/www/html
      
      マイケル
      マイケル
      そしてこちらがdocker-compose.ymlの記述!

      Webコンテナ: Nginxをアプリ前段に置くためのコンテナ
      Appコンテナ: Laravelプロジェクト用のコンテナ
      mysqlコンテナ: MySQL用のコンテナ
      phpmyadminコンテナ: phpMyAdminを使用するためのコンテナ(※任意)

      といった構成になっています!
      version: '3'
      services:
          web:
              image: nginx:1.20.0
              ports:
                  - '8000:80'
              depends_on:
                  - app
              volumes:
                  - ./docker/web/default.conf:/etc/nginx/conf.d/default.conf
                  - .:/var/www/html
          app:
              build: ./docker/app
              volumes:
                  - .:/var/www/html
              depends_on:
                  - mysql
          mysql:
              image: mysql:5.7
              environment:
                  MYSQL_DATABASE: juicedb
                  MYSQL_USER: user
                  MYSQL_PASSWORD: password
                  MYSQL_ROOT_PASSWORD: password
              ports:
                  - "3306:3306"
              volumes:
                  - mysql-data:/var/lib/mysql
          phpmyadmin:
              image: phpmyadmin/phpmyadmin
              environment:
                  - PMA_ARBITRARY=1
                  - PMA_HOST=mysql
                  - PMA_USER=user
                  - PMA_PASSWORD=password
              links:
                  - mysql
              ports:
                  - 9000:80
              volumes:
                  - /sessions
              depends_on:
                  - mysql
      volumes:
          mysql-data:
      接続設定
      マイケル
      マイケル
      そしてこちらが接続の設定!
      Default.confファイルにNginxの設定として、Laravelプロジェクトに向けるよう記述します!
      server {
          listen 80;
          root /var/www/html/juiceapp/public;
          index index.php index.html index.htm;
          access_log /var/log/nginx/access.log;
          error_log /var/log/nginx/error.log;
          location / {
              try_files $uri $uri/ /index.php$is_args$args;
          }
          location ~ \.php$ {
              fastcgi_split_path_info ^(.+\.php)(/.+)$;
              fastcgi_pass app:9000;
              fastcgi_index index.php;
              include fastcgi_params;
              fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
              fastcgi_param PATH_INFO $fastcgi_path_info;
          }
      }
      ↑Nginxの設定
      マイケル
      マイケル
      そしてLaravelプロジェクトの.envファイルには、MySQLコンテナの設定に修正しておきましょう!
      
      
      ・・・略・・・
      
      DB_CONNECTION=mysql
      DB_HOST=mysql
      DB_PORT=3306
      DB_DATABASE=juicedb
      DB_USERNAME=user
      DB_PASSWORD=password
      
      ・・・略・・・
      
      
      ↑MySQL接続の設定
      動作確認
      マイケル
      マイケル
      以上で設定は完了です!
      下記のようにコンテナ起動とデータ登録を完了させたら画面を開いてみましょう!
      // コンテナ起動
      docker compose up -d
      // データを登録するためbash接続
      docker compose exec app bash
      cd juiceapp
      // DB作成
      php artisan migrate
      // データ登録
      php artisan db:seed
      
      ↑コンテナ起動とデータ登録
      マイケル
      マイケル
      このように画面が開けば成功です!
      エレキベア
      エレキベア
      やったクマ〜〜〜!!!

      おわりに

      マイケル
      マイケル
      というわけで今回はDockerの使い方についてでした!
      どうだったかな?
      エレキベア
      エレキベア
      難しそうなイメージだったクマが
      やってみたらすごく便利だったクマ
      マイケル
      マイケル
      環境構築がこんなに手軽にできると便利だよね!
      今度はKubernetesとかオーケストレーションシステムにも挑戦してみよう!
      エレキベア
      エレキベア
      やったるクマ〜〜〜
      マイケル
      マイケル
      それでは今日はこの辺で!
      アデュー!!
      エレキベア
      エレキベア
      クマ〜〜〜〜

      【Docker】Dockerの基本的な使い方についてまとめる 〜完〜


      Dockerサーバサイド関連
      2021-05-02

      関連記事
      【Unity】GoでのランキングAPI実装とVPSへのデプロイ方法についてまとめる【Go言語】
      2024-04-14
      【Go言語】Gin、GORMでシンプルなREST APIを作成する【CRUD】
      2024-03-26
      【Rails7】Ruby on Rails7で主要な機能をtodoアプリで学ぶ
      2022-11-10
      【Rails7】Ruby on Rails7のローカル環境構築とScaffoldでのアプリ作成
      2022-11-06
      【ブログ改造計画】公開中のブログをGit管理して開発環境を構築する【WordPress】
      2022-04-27
      【ブログ改造計画】WordPressの基本機能とDocker環境の構築について【WordPress】
      2022-04-24
      【NAS】QNAPのNASで最低限しておくべきセキュリティ設定
      2022-02-21
      【Unity】UnityWebRequestを使ってCRUD機能を実装する【Ruby on Rails】
      2021-12-12