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

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


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


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

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

参考書籍

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


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

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

Dockerの使い方

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

Dockerイメージのビルド

ScreenShot 2021 05 02 11 55 40のコピー
マイケル
マイケル
まずはビルド処理から!
ビルドの元になる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コンテナの操作

ScreenShot 2021 05 02 11 55 40のコピー2
マイケル
マイケル
イメージをビルド又は取得したら、コンテナを起動しましょう!
下記コマンドで起動することができます!
// コンテナの作成・実行
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スクリプト
ScreenShot 2021 05 02 11 57 06
↑読み込む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」という名前でイメージが作成されました!
ScreenShot 2021 05 02 13 35 06
↑イメージファイルの作成
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
ScreenShot 2021 05 02 13 40 53
↑コンテナの起動
マイケル
マイケル
これでコンテナを起動できました!
下記コマンドでコンテナのターミナルに入り、pythonファイルを実行してみましょう!
// コンテナでのコマンド実行
docker container exec -it sample_python bash
python sample.py
ScreenShot 2021 05 02 13 42 56
↑コンテナ内でのコマンド実行
マイケル
マイケル
無事、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
ScreenShot 2021 05 02 14 02 40
↑コンテナの起動
マイケル
マイケル
そして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;
ScreenShot 2021 05 02 14 08 01
↑MySQLの接続
マイケル
マイケル
最後にPythonファイルの実行!
検索結果が表示されれば成功です!!
// Pythonファイルの実行
docker container exec -it 02_docker_compose_python_1 bash
python sample.py
ScreenShot 2021 05 02 14 10 51
↑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
↑コンテナ起動とデータ登録
ScreenShot 2021 05 02 14 39 24
マイケル
マイケル
このように画面が開けば成功です!
エレキベア
エレキベア
やったクマ〜〜〜!!!

おわりに

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

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

コメント