LoginSignup
143
205

Dockerを少しずつ理解しようっていうお話

Last updated at Posted at 2024-02-18

はじめに

初めまして!
エンジニアになって数年、今まで本を読むだけでしたが、もっとプライベートで楽しみながら成長したい!自分が学んだ足跡を残していきたい!と思い記事をかきました!
最終的には自在に開発できるようになりたいと思っています。:triumph:
いろいろな記事を参考にさせてもらっています。:bow_tone2:
その中でもこれってどういう意味?とかつまづいたところを念入りに書いていこうかと思います。:fist:

今回の目的

Dockerってもらったものそのまま使えば簡単に動いちゃうのでとてもやりやすい!なんて思うんですけど、一から作ってとなると「はて?どうすればいいのかわからない・・・」とはっきりしてません。:cry:
最小限でDockerを動かしながらそれぞれがどんな役割をしているの?どんなことを書いているの?を理解していきます!

使用したものや事前準備

・Macbook Pro
・Docker Desktop
・Docker Hub
・Visual Studio Code

主に参考にさせていただいた記事

下記の書籍をベースに勉強しました。

検証を始める前に

任意のディレクトリでプロジェクト用のファイルを作りました。

mkdir docker-test

最小構成で段々と作っていきます。

コマンドだけでコンテナを立ち上げる

Dockerfileっていうものがあるんだからそれ使わないといけないんじゃないの??って思っていました。でもその認識自体が間違えていました。:worried:
ベースイメージをDocker Hubから引っ張ってきてメモリ上でコンテナを立ち上げられればいらないのです。

下記のコマンドを実行します。

docker container run --name apache01 -p 8080:80 -d httpd

※dockerコマンドがない方はDockerとDocker Desktopをセッティングしてください

コマンドの説明
・httpdのイメージを元にapache01というコンテナを起動するぞ、8080でアクセスしてきたらコンテナの80に繋ぐぞっていうコマンドです。
・--nameはコンテナ名、-pはポートのマッピング、-dはバックグラウンドで実行するオプション

http://localhost:8080/にアクセスして、こんな画面になれば立ち上げ成功です。

スクリーンショット 2024-02-18 16.51.02.png

docker psを打ち込んでみると先ほど設定した内容でコンテナが動いていることが確認できます。

docker ps

スクリーンショット 2024-02-18 16.52.47.png

次の検証に移るので停止させましょう。

docker stop apache01

docker ps -aで停止したコンテナを確認できます

スクリーンショット 2024-02-18 16.56.57.png

Dockerfileでイメージをカスタマイズしコンテナを立ち上げる

イメージを引っ張ってきたけど、ほんとはフレームワークも入っているイメージがほしいんだよなぁ〜とかそういう悩みがある時は、Dockerfileに書けばカスタムできちゃうっていうお話です。
今回はあっさり系で進めちゃうので最後のコマンドはほぼ同じになります。

Visual Studio Codeを立ち上げて検証用のプロジェクト(docker-test)を開きましょう。
Dockerfileを作成して、下記のように作成してください。
EXPOSEには公開するポート番号の明示のみのため80を記載します。
コンテナ名は設定できないためスキップします。

FROM httpd
#RUN 
#CMD [ "" ]
EXPOSE 80
#COPY
#ADD
#ENTRYPOINT
#WORKDIR

作成できたらDockerfileを元にイメージを作成します。ベースをカスタムし再作成する工程ですね。

docker build -t image-apache02 .

スクリーンショット 2024-02-18 18.01.40.png

イメージが出来上がったことを確認しましょう。

docker image ls

スクリーンショット 2024-02-18 18.00.18.png

イメージに書いてある情報を見ながら[REPOSITORY:TAG]を指定しコンテナを立ち上げます!

docker run --name apache02 -p 8080:80 -d image-apache02:latest

http://localhost:8080/にアクセスして立ち上がっていることも確認。

スクリーンショット 2024-02-18 16.51.02.png

docker psを打ち込んでコンテナ名が今回のものであることも確認します。

docker ps

スクリーンショット 2024-02-18 18.08.56.png

IMAGEやNAMESが今回のものになっていることを確認できたら、
次の検証に移るので停止させましょう。

docker stop apache02

docker ps -aで停止したコンテナを確認します。前回のとほぼ同様なものがあることを確認できました。

スクリーンショット 2024-02-18 18.10.59.png

compose.ymlでコンテナを立ち上げる

今までのhttpdサーバーの設定は単純だったのでコマンドが簡潔にすみましたが、DBのユーザー設定をしたいやPATH 環境変数の設定をしたいとか、なんやかんやあった場合、コマンドに入れると冗長になり間違いの温床になります。
compose.ymlはコンテナの立ち上げ時にコードベースで独自設定ができるので、一旦作成すればどこでも同じコンテナができるわけです。

Visual Studio Codeで検証用のプロジェクトを開いているかと思います。
compose.ymlを作成して、下記のように作成してください。
ymlファイル全体に言えることかもしれないですが、スペースや改行も処理の判定対象になっているので注意しましょう。

services:
 web:
  image: httpd
  container_name: apache03
  ports: 
    - "8080:80"

これで準備完了です。下記のコマンドを実行しコンテナを立ち上げます。

docker compose up -d

http://localhost:8080/にアクセスして〜以下略

docker psを打ち込んでコンテナ名が今回のものであることも確認。あっという間にできました。
スクリーンショット 2024-02-18 18.44.16.png

次の検証に移るので停止させましょう。

docker stop apache03

compose.ymlで複数台コンテナを立ち上げてみる

compose.ymlのいいところはイメージまたはDockerfileをビルドし複数コンテナを立ち上げられるところにあると思います。
コンテナ間のネットワークもcompose.ymlに書き込めばチャチャっとやってくれるので最高です。

※参考書籍のsection10に沿ってやっていきます。※

構築するものはPHP+Apache+MariaDBです。
PHPからコネクション要求して繋がれば連携できているっていう構成ですね!

今までに作ってきたものを修正して構築していきます。

⚫︎Dockerfile

RUNコマンドでは、
・パッケージリスト更新
・PHPの一部のライブラリが必要とするためOnigurumaの開発バージョンをインストール(ユーザー操作介入なし)
・PHP拡張機能をコンパイルしてインストールするコマンド
・PHPからMySQLデータベースへの接続を可能にするPDO(PHP Data Objects)ドライバのインストール
を行っています。

FROM php:8.0-apache
RUN apt-get update && apt-get install -y libonig-dev && docker-php-ext-install pdo_mysql

⚫︎Compose.yml

build: .
指定の位置にあるDockerfileをbuildしてコンテナのイメージとして使いますよって意味です。
depends_on
コンテナの依存先です。今回はdbコンテナが起動を開始した後にphpコンテナが起動を開始します。

volumesに二通りの書き方があってむむっとなりました。:frowning2:

コンテナ内に書いてあるVolumes
バインドマウント
最下部に書いてあるVolumes
名前付きボリュームといいDocker側でデータを永続的に保管できたり、コンテナ間で共有できる

内部で作られているデータを外に吐き出す場所という認識程度。
大事なデータとかは名前付きボリュームに出して、プロジェクト切り替えても同じデータを見ることができるとかが、ポイントなのかな??(なんとなくありがたみがわかる程度・・・)

services:
 db:
  image: mariadb:10.7
  environment:
   MARIADB_ROOT_PASSWORD: rootpass
   MARIADB_DATABASE: testdb
   MARIADB_USER: testuser
   MARIADB_PASSWORD: testpass
  volumes:
   - db-data:/var/lib/mysql
 php:
  build: .
  depends_on: 
    - db
  ports: 
    - "8080:80"
  volumes:
    - ./src:/var/www/html
volumes:
 db-data:

⚫︎dbsample.php

srcフォルダを作ってその配下に作成しましょう。

スクリーンショット 2024-02-18 21.07.15.png

脳死コピペになってしまいそうだったので公式ドキュメントを見て書き方を変えてみることに・・・。

DBコネクション閉じないのかな?と思ったけど参照元がなくなる(nullとか)か、スクリプトが終了する(exit)と勝手に閉じるらしい。POD使っとけ!って感じですね。多分。

<?php
  try {
    $dbh = new PDO('mysql:host=db;dbname=testdb','testuser','testpass');
    echo "OK";
    $dbh = null;
  }catch(PDOException $e){
    echo "NG";
    exit;
  }
?>

準備完了!実行します!

docker compose up -d

docker psを打ち込んでコンテナ名が今回のものであることも確認します。

docker ps

イメージ名はプロジェクト名-buildコマンドがあるコンテナ名って感じですね。
コンテナ名もそのままではなくてややこしい説明になってしまったかも。

スクリーンショット 2024-02-18 20.47.17.png

phpを開いて、レスポンスが返ってくるか確認しましょう。
http://localhost:8080/dbsample.phpにアクセスします。

OKが表示されたら完了です!

スクリーンショット 2024-02-18 20.51.35.png

複数コンテナを一回で停止させましょう。

docker compose stop

最後に

一つずづ見ていったらどんな役割があるか理解できました。Dockerfileがコンテナを立ち上げていると勘違いしていたのでいい勉強になりました。:sweat:

おまけ

より大きく実践してみました、

143
205
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
143
205