
マイケル
みなさんこんにちは!
マイケルです!
マイケルです!

エレキベア
こんにちクマ〜〜

マイケル
今日はみんな大好き Docker を触ってみるよ!

エレキベア
Dockerってクジラのキャラのやつクマね
どんな機能なのクマ?
どんな機能なのクマ?

マイケル
説明しよう!
Dockerとは・・・
Dockerとは・・・
Dockerとは
- アプリケーションやOSの開発・配備を行うためのコンテナを利用した基盤ソフトウェア

エレキベア
よく分からないクマ・・・。

マイケル
簡単にいうとコンテナという技術を利用して環境を構築できる仕組みみたいな感じだよ!
アプリケーションと実行環境を同梱してデプロイできるから、ポータビリティに優れているのが特徴なんだ!
アプリケーションと実行環境を同梱してデプロイできるから、ポータビリティに優れているのが特徴なんだ!

エレキベア
アプリケーションや環境をまとめて配布できたりするわけクマね

マイケル
ほぼ同じ環境を別のマシンでも構築できるから、本番環境への移行もコストが少なくて済むんだ!
他にも、以下のような特徴があるよ!
他にも、以下のような特徴があるよ!
[メリット]
・数行の構成ファイルとコマンドを1つ叩くだけで同等の環境が再現できる。
・コンテナ型仮想化技術を利用し、オーバーヘッドが少ない。
・コンテナにアプリケーションと実行環境を同梱してデプロイできる。
[デメリット]
・あくまでアプリケーションを入れるための箱であるため、OSとしての振る舞いを再現することはできない。
そのため起動するホストによっては影響を受けてしまうこともある

エレキベア
だんだん気になってきたクマ
使ってみるクマ!
使ってみるクマ!

マイケル
それじゃ早速触ってみよう!
参考書籍

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

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

エレキベア
内容もかなりみっちりしているクマね
Dockerの使い方

マイケル
Dockerコンテナを起動するまでのフローはこんな感じ!


マイケル
まず、Dockerfileというファイルを作成 して
ビルドすることでDockerImageを作成 します!
そして DockerImageを元にコンテナを起動 するという流れになります!
ビルドすることでDockerImageを作成 します!
そして DockerImageを元にコンテナを起動 するという流れになります!

エレキベア
ビルドして実行クマね
Dockerイメージのビルド


マイケル
まずはビルド処理から!
ビルドの元になるDockerfileは下記のように記述することができます!
ビルドの元になる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 image ls
// イメージ検索
docker search 【検索キーワード】
// イメージ削除
docker rmi 【イメージID】
// イメージ一括破棄
docker image prune

マイケル
そして作成したイメージは下記コマンドでDockerHub(※)に公開することができます!
公開後はDockerfile無しでpullコマンドで取得できるようになります!
公開後は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スクリプトを動かす環境を構築します!
今回は下記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を作成しましょう!
先ほどのpythonファイル、Excelファイルに加えてDockerfileを作成しましょう!
├── 01_docker
├── Dockerfile
└── sample_python
├── sample.py
└── sample.xlsx
Dockerイメージのビルド

マイケル
Dockerfileを下記のように記述してビルドします!
ベースイメージは「python:3.9」、そしてExcel読み込みのために「openpyxl」というライブラリのインストールコマンドも記述しています!
ベースイメージは「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ファイルを実行してみましょう!
下記コマンドでコンテナのターミナルに入り、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は下記のように記述できます!
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スクリプトを実行します!
今回は下記のような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ファイルに記述して起動しましょう!
これをdocker-compose.ymlファイルに記述して起動しましょう!

エレキベア
よくある構成クマね
ディレクトリ構成

マイケル
ディレクトリは下記のような構成にします!
└── 02_docker_compose
├── docker
│ └── Dockerfile
├── docker-compose.yml
└── sample_python
└── sample.py
Dockerfileの作成

マイケル
Dockerfileは下記の通りです!
今度はmysqlclientというライブラリをインストールしましょう!
今度はmysqlclientというライブラリをインストールしましょう!
FROM python:3.9
USER root
RUN mkdir sample_python
WORKDIR /sample_python
RUN pip install mysqlclient

マイケル
そしてdocker-compose.ymlの記述は以下になります!
Python環境とMySQL環境で二つコンテナを記述しましょう!
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環境に移行 してみます!
以前つくったLaravelプロジェクトをDocker環境に移行 してみます!
以前作ったシステム:

エレキベア
これは楽しみクマね〜〜

マイケル
環境を構築するにあたっては、下記サイトを参考にさせていただきました!
詳細を知りたい方は是非みてみてくださいね!
詳細を知りたい方は是非みてみてくださいね!
参考:
docker-composee
Laravelの開発環境を整える方法とその解説

エレキベア
分かりやすい記事クマ〜〜
LaravelプロジェクトのDocker環境化
ディレクトリ構成

マイケル
ディレクトリ構成は下記の通り!
Laravelプロジェクトの他に、
・Laravelプロジェクト用のDockerfile
・Nginxの設定ファイル
を作成しましょう!
Laravelプロジェクトの他に、
・Laravelプロジェクト用のDockerfile
・Nginxの設定ファイル
を作成しましょう!
├── docker
│ ├── app
│ │ └── Dockerfile
│ └── web
│ └── default.conf
├── docker-compose.yml
└── juiceapp(※Laravelプロジェクト)
Dockerfileの記述

マイケル
こちらはLaravelプロジェクト用のDockerfileの記述です!
LaravelとPHPの操作に必要なライブラリを記載しています!
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を使用するためのコンテナ(※任意)
といった構成になっています!
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プロジェクトに向けるよう記述します!
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とかオーケストレーションシステムにも挑戦してみよう!
今度はKubernetesとかオーケストレーションシステムにも挑戦してみよう!

エレキベア
やったるクマ〜〜〜

マイケル
それでは今日はこの辺で!
アデュー!!
アデュー!!

エレキベア
クマ〜〜〜〜
【Docker】Dockerの基本的な使い方についてまとめる 〜完〜
コメント