1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[初心者向け] Dockerで簡単なWebコンテナとDBコンテナを作ってみよう

Posted at

[初心者向け] Dockerで簡単なWebコンテナとDBコンテナを作ってみよう

前置き

最近Dockerに触れる機会があったので、復習がてら簡単なWebコンテナとDBコンテナを作成して
コンテナ間で通信するまでの手順をまとめたいと思います。初心者向けの内容となっています。
Dockerは知っている前提です。

環境

  • Windows10 Home
  • Docker Desktop

構成

  • docker-compose利用
  • DBコンテナ
    • OS:alpine
    • postgresql11
  • Webコンテナ
    • OS:centos7
    • apache2.4
    • php7.4

DBコンテナはDocker-hubに公開されているpostgres公式のイメージを使ってサクッと作ります。
一方Webコンテナは必要なパッケージを選んで作る形でやってみます。

docker-composeとは

docker-composeは、複数のDockerコンテナを操作するためのツール(コマンド)です。
docker-composeはDocker Desktopに含まれているため、別途インストールする必要はありません。
docker-composeはdocker-compose.ymlというファイルに複数のDockerコンテナの定義を記述しておき、
docker-compose build(Dockerイメージの作成)やdocker-compose up -d(Dockerコンテナの起動)
といったコマンドで複数のDockerイメージ・コンテナを操作することができます。

早速必要なファイルを作成していきます。

作業ディレクトリ
|docker-compose.yml
|-db
|   Dockerfile
|-web
    Dockerfile

DBコンテナ

Dockerfile作成

FROM postgres:11-alpine
ENV LANG ja_JP.utf8

DBコンテナ用のDockerfileはこれだけです。

Dockerfile内容

  • FROM: ベースとなるイメージを指定します。

Webコンテナ

Dockerfile作成

FROM centos:7

RUN yum update -y
RUN yum install -y httpd
RUN yum install -y vim
RUN yum install -y epel-release && \
    yum install -y http://rpms.remirepo.net/enterprise/remi-release-7.rpm && \
    yum install -y --enablerepo=remi,remi-php74 php php-pdo php-pgsql

RUN systemctl enable httpd

Dockerfile内容

docker-composeファイル作成

docker-compose.yml
version: "3"

services:
  web:
    build:
      context: ./web
      dockerfile: Dockerfile
    container_name: web
    volumes:
      - ./html:/var/www/html
    ports:
        - "80:80"
    privileged: true
    command: /sbin/init
    networks:
      app_net:
        ipv4_address: 172.30.0.2
  db:
    build:
      context: ./db
      dockerfile: Dockerfile
    container_name: db
    ports:
        - "5432:5432"
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
    networks:
      app_net:
        ipv4_address: 172.30.0.3
networks:
  app_net:
    name: app_net
    driver: bridge
    ipam:
     driver: default
     config:
       - subnet: 172.30.0.0/24

docker-composeファイル内容

主なものを記載します。

  • services
    • 起動するコンテナ群の定義。上記の例だと、webとdbという2つを定義していることになります。
  • build
    • そのコンテナを構築する際のオプション定義。
    • context
      • Dockerファイルのあるディレクトリパスを指定。
  • volumes
    • dockerを実行しているホストとコンテナをつなぐ設定。
      ここでは、ホスト上のhtmlディレクトリとコンテナ上の/var/www/htmlがリンクするイメージです。
      ちなみにディレクトリではなく、ファイルを指定することも可能。
  • ports
    • 公開するポートを指定。":"の左側がホスト上のポート、右側がコンテナ上のポートです。
      ここでは同じポート番号にしています。ホスト上からlocalhost:80でコンテナ上の80に接続できます。
  • privileged
    • これはdocker run時に指定するprivilegedオプションにあたります。privilegedオプションについては
      systemctlコマンドでFailed to get D-Bus connection: Operation not permittedが出てサービスを
      起動できないことへの対処で設定しており、説明は割愛します。
  • command
    • docker-compose upした時に実行したいコマンド

docker-composeコマンドでbuild~コンテナ起動

build

# build
$ docker-compose build
# コンテナ起動
$ docker-compose up -d

dbコンテナでテスト用テーブル作成

# dbコンテナに入る
$ docker-compose exec db /bin/bash

以下コンテナ内で作業

# テストテーブル作成
$ psql -U postgres -c 'create table test (name text)'
# テストデータ作成
$ psql -U postgres -c "insert into test (name) values ('hello'),('world')"
# 一旦コンテナから抜ける
$ exit

webコンテナでテスト用スクリプト作成

# webコンテナに入る
$ docker-compose exec web /bin/bash

以下コンテナ内で作業

$ cd /var/www/html
$ vi test.php
test.php
<?php

$dsn = 'pgsql:dbname=postgres host=172.30.0.3 port=5432';
$user = 'postgres';
$password = 'postgres';

try{
    $dbh = new PDO($dsn, $user, $password);
    $sql = 'select * from test';
    foreach ($dbh->query($sql) as $row) {
        echo $row['name'] . ' ';
    }
}catch (PDOException $e){
    echo $e->getMessage() . PHP_EOL;
    die();
}

動作確認

http://localhost/test.php へアクセスしてhello worldと表示されれば成功です。

dockerファイル共有

上記の環境を整え済みのdockerファイルを共有しておきますので、お試し下さい。
※dbコンテナのテストデータは入っていないため、上記参考にデータ作成して下さい。

$ git clone https://github.com/jcong7495/docker_simple_web_db.git
1
2
0

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
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?