初めてのDocker
Dockerの機能と用語説明
Dockerコンテナ | システムの他の部分に影響を与えることなく、アプリケーションを実行できる仮想空間のような隔離された環境で、すべてのコードと依存関係がパッケージ化されている。 |
Dockerイメージ | アプリケーションの実行に必要なソースコード、依存関係、ツールを含んだパッケージで、コンテナ作成時に指示を出す読み取り専用のファイル。 |
Dockerfile | Dockerイメージを構成するテキストデータで、Dockerfileを読み込むことでDockerイメージが構築される。 |
Docker Compose | 複数のコンテナを1度に操作することができるツール。Docker Composeの設定ファイルであるdocker-compose.ymlファイルは複数のコンテナ間の関係や環境変数などを記述する。 |
Docker Hub | Dockerイメージの共有サービス。Dockerイメージ(Dockerfile)が公開されており、Docker Hubから任意のイメージ(Dockerfile)を取得できる。自身で作成したイメージ(Dockerfile)をリポジトリにアップし、他ユーザーと共有することも可能。 |
Dockerコマンド(基本)
build | DockerfileからDockerイメージを作成する | bash docker image build [オプション] Dockerfileのパス |
run | Dockerイメージを使いDockerコンテナを起動(作成)する | bashdocker container run [オプション] imagename |
start | 作成済(停止中)のコンテナを起動する | bash docker container start [オプション] containername |
stop | Dockerコンテナを停止する | bash docker container stop [オプション] containername |
rm | 停止中のコンテナを削除する | bash docker container rm [オプション] containername |
restart | コンテナを再起動する | bash docker container restart [オプション] containername |
exec | 起動中のコンテナ内でコマンドを実行する | bash docker container exec [オプション] containername コマンド |
実際にDockerを起動してみましょう。よく使われるdocker-compose.ymlから起動します。
Docker Compose とは
複数コンテナのアプリケーションを定義・共有するために役立つように、開発されたツールです。
Compose があれば、サービスを定義する YAML ファイルを作成し、コマンドを1つ実行するだけで、
瞬時にすべて立ち上げたり、すべてを削除したりできます
1. 任意のディレクトリを作成し、その中に/web/Dockerfileを作成してください。
# Dockerベースイメージの指定
FROM nginx
# ビルド時に実行するシェルコマンド
# RUN apt update
# ホスト(ローカル)のファイルやディレクトリをDockerイメージにコピー
# : COPY [コピー元][コピー先]
COPY ./src /usr/share/nginx/html
# コマンドを実行する作業ディレクトリ
# WORKDIR [ディレクトリのパス]
# WORKDIR /app
# コンテナが実行されたとき実行するコマンド
# CMD ["apachectl","-D","FOREGROUND"]
作成ついでにコメントアウトで説明書いてます。
2. 次に、/src/index.htmlを作成します。
index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Docker</title>
</head>
<body>
<p>hello Docker!</p>
</body>
</html>
3.次にルートディレクトリにdocker-compose.ymlを作成します。
docker-compose.yml
services:
web: #サービス名
build: # Dockerfileからビルドする際の相対パスを設定
context: . # 親ディレクトリをコンテキストに
dockerfile: ./web/Dockerfile # webフォルダ内のDockerfileを使用
ports: # ホストマシンのポート番号:コンテナのポート番号
- "80:80"
最終的なディレクトリ構成は以下です。
.
├── docker-compose.yml
├── src
│ └── index.html
└── web
└── Dockerfile
実際にコマンドで起動してみましょう。
docker compose up -d
hello Docker!が表示されたかと思います。
先ほどはnginxのイメージを作成しました。
続いてMySQLのイメージを作成しましょう。
docker-compose.yml
services:
web: #サービス名
build: # Dockerfileからビルドする際の相対パスを設定
context: . # 親ディレクトリをコンテキストに
dockerfile: ./web/Dockerfile # webフォルダ内のDockerfileを使用
ports: # ホストマシンのポート番号:コンテナのポート番号
- "80:80"
+ db: #サービス名
+ # build: Dockerfileからビルドする際の相対パスを設定
+ image: mysql:5.7 # イメージ名:タグ
+ volumes: # データをコンテナの外に保存するための設定
+ - ./mysql/data:/var/lib/mysql # ホストディレクトリ : コンテナ内ディレクトリ
+ environment: # 環境変数
+ MYSQL_ROOT_PASSWORD: password
+ MYSQL_DATABASE: sample_db
+ MYSQL_USER: user
+ MYSQL_PASSWORD: password
+ ports:
+ - "3306:3306" # ホストマシンのポート番号:コンテナのポート番号
+ # depends_on: サービス間の依存関係を定義
+ # command: サービスコンテナが起動したときに実行するコマンド
こちらもついでにコメントアウトで説明書いてます。
MySQLのコンテナが作成されましたね。このように簡単なイメージについては、ymlファイルのみで作成可能です。
また、簡単にコンテナを追加できるのも強みですね
動作確認もかねてphpMyAdminのイメージを作成して、確認しましょう。
docker-compose.yml
services:
web: #サービス名
build: # Dockerfileからビルドする際の相対パスを設定
context: . # 親ディレクトリをコンテキストに
dockerfile: ./web/Dockerfile # webフォルダ内のDockerfileを使用
ports: # ホストマシンのポート番号:コンテナのポート番号
- "80:80"
db: #サービス名
# build: Dockerfileからビルドする際の相対パスを設定
image: mysql:5.7 # イメージ名:タグ
volumes: # データをコンテナの外に保存するための設定
- ./mysql/data:/var/lib/mysql # ホストディレクトリ : コンテナ内ディレクトリ
environment: # 環境変数
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: sample_db
MYSQL_USER: user
MYSQL_PASSWORD: password
ports:
- "3306:3306" # ホストマシンのポート番号:コンテナのポート番号
# depends_on: サービス間の依存関係を定義
# command: サービスコンテナが起動したときに実行するコマンド
+ phpmyadmin:
+ image: phpmyadmin
+ depends_on:
+ - db
+ environment:
+ - PMA_ARBITRARY=1
+ - PMA_HOSTS=db
+ - PMA_USER=root
+ - PMA_PASSWORD=password
+ ports:
+ - "3001:80"
docker compose up -d
3001番にマッピングしたので、
しっかり、sample_dbが作成されて動作しています。