”今”から始めるdocker入門 Linux編 

全開である程度実用性のあるコンテナ構成を組めたということで、
そうなると実行環境も実用向けにしたいところ、、、

そう!

恐らく実務だったらLinuxサーバー使うのでは・・・?
というのは最初から思ってたんですが、Windowsの方がとっつきやすいだろうということで後回しにしてました。

なので今回はLinux上で動作させる手順を記載していきます。
dockerを導入するLinux環境はAlmalinux9.5を使ってます。

スポンサーリンク

dockerのインストール~Hello Worldまで

必要なパッケージのインストール

dnf install yum-utils device-mapper-persistent-data lvm2

dockerのインストール

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

dockerの起動

systemctl start docker
systemctl enable docker

※一応自動起動も有効にしときます。

dockerの起動hello-worldコンテナの実行

docker run hello-world

「Hello from Docker!~~~」と表示ができればOK。

コンテナの起動

過去やったのと同じようにDockerfileやdocker-compose.ymlを使ってコンテナを作成してみようと思います。
※作業ディレクトリは適当に/home以下でやっていきます。

Dockerfileを使ってコンテナ作成

過去記事の内容と全く同じものを再現していきます。※補足は割愛

ディレクトリ構成

/home/docker/lv1
└── Dockerfile

Dockerfileの中身

FROM almalinux:latest
CMD ["sh"]

※almalinuxのサーバにalmalinuxのコンテナを立てるという謎行動に。。。

イメージの作成

cd /home/docker/lv1

#docker build -t [イメージ名] [ディレクトリ]
docker build -t lv1-image .

コンテナの起動

#docker run -dit --name [コンテナ名] [イメージ名]
docker run -dit --name lv1-container lv1-image

コンテナの確認

[root@vbox lv1]# docker ps
CONTAINER ID   IMAGE       COMMAND   CREATED          STATUS          PORTS     NAMES
6ec127c89c68   lv1-image   "sh"      36 seconds ago   Up 36 seconds             lv1-container

docker psコマンドでコンテナが起動していることを確認します。

一応コンテナに入れるか確認↓

[root@vbox lv1]# docker exec -it lv1-container bash
[root@6ec127c89c68 /]# ls

無事コンテナが起動、使えることが確認できました!

Composeで複数コンテナを制御

こっちも過去記事の内容と全く同じものを再現していきます。※補足は割愛

ディレクトリ構成

/home/docker/lv2
└── docker-compose.yml

docker-compose.ymlの中身

services:
  web:
    image: nginx:latest
  db:
    image: postgres:latest

※almalinuxのサーバにalmalinuxのコンテナを立てるという謎行動に。。。

コンテナの起動

cd /home/docker/lv2

docker compose up -d

※珍しく申し訳程度にグラフィカルに表示されていたのでついキャプチャ

コンテナの確認

[root@vbox lv2]# docker ps
CONTAINER ID   IMAGE             COMMAND                  CREATED         STATUS         PORTS      NAMES
155d63e3812f   nginx:latest      "/docker-entrypoint.…"   3 minutes ago   Up 3 minutes   80/tcp     lv2-web-1
c4c8f29d485e   postgres:latest   "docker-entrypoint.s…"   3 minutes ago   Up 3 minutes   5432/tcp   lv2-db-1

docker psコマンドでコンテナが起動していることを確認します。

一応コンテナに入れるか確認↓

psql (17.5 (Debian 17.5-1.pgdg120+1))
Type "help" for help.

postgres=#

無事コンテナが起動、使えることが確認できました!

Composeで複数コンテナを制御

これも過去記事で行ったものを抜粋。

ディレクトリ構成

/home/docker/lv3
├── docker-compose.yml
├── web/
│   ├── Dockerfile
│   └── source/var/www/html/
│       └── index.php
├── db/
│   ├── Dockerfile
│   └── initdb/
│       └── init.sql

docker-compose.ymlの中身

services:
  web:
    build:
      context: ./web
      dockerfile: Dockerfile
    container_name: php8-202506
    ports:
      - "8080:80"
    networks:
      - php-postgres-network

  db:
    build:
      context: ./db
      dockerfile: Dockerfile
    container_name: postgres16-202506

    # 接続情報
    environment:
      POSTGRES_USER: testuser
      POSTGRES_PASSWORD: test
      POSTGRES_DB: pref

    ports:
      - "5432:5432"  # ホストの5432 → コンテナの5432

    networks:
      - php-postgres-network

    # データの初期化(SQLファイル実行)
    volumes:
      - ./db/initdb:/docker-entrypoint-initdb.d

    command:
    - "postgres"
    - "-c"
    - "log_min_duration_statement=0"


networks:
  php-postgres-network:

各種Dockerfileの中身

FROM php:8.3-apache

RUN apt-get update && apt-get install -y \
    libpq-dev \
    && docker-php-ext-install pdo_pgsql pgsql

COPY ./source/var/www/html/ /var/www/html/
FROM postgres:16

webコンテナのindex.php(DB接続用テストファイル)の中身

<?php
$host = 'db'; // コンテナ名(=ホスト名)
$dbname = 'pref';
$user = 'testuser';
$pass = 'test';

$dsn = "pgsql:host=$host;dbname=$dbname";

try {
    $pdo = new PDO($dsn, $user, $pass);

    $stmt = $pdo->query('SELECT * FROM pref');

    echo "<h1>都道府県リスト</h1>";
    echo "<table border='1' cellpadding='8'>";
    echo "<tr>";

    // カラム名の表示
    $columnCount = $stmt->columnCount();
    for ($i = 0; $i < $columnCount; $i++) {
        $col = $stmt->getColumnMeta($i);
        echo "<th>" . htmlspecialchars($col['name']) . "</th>";
    }
    echo "</tr>";

    // データの表示
    foreach ($stmt as $row) {
        echo "<tr>";
        foreach ($row as $value) {
            echo "<td>" . htmlspecialchars($value) . "</td>";
        }
        echo "</tr>";
    }

    echo "</table>";
} catch (PDOException $e) {
    echo "❌ DB接続またはクエリ失敗: " . $e->getMessage();
}
?>

init.sqlの中身

--都道府県テーブル
CREATE TABLE prefectures(
	 prefectures_id varchar(2) PRIMARY KEY
	,prefectures_name varchar(50)
	,regist_date timestamp DEFAULT now()
	,update_date timestamp DEFAULT now()
	,del_flg smallint DEFAULT 0
);

--市区町村テーブル
CREATE TABLE municipalities(
	 prefectures_id varchar(2)
	,municipalities_id varchar(4)
	,municipalities_name varchar(50)
	,regist_date timestamp DEFAULT now()
	,update_date timestamp DEFAULT now()
	,del_flg smallint DEFAULT 0
	,FOREIGN KEY(prefectures_id) REFERENCES prefectures(prefectures_id)
	,PRIMARY KEY(prefectures_id,municipalities_id)
);

--都道府県
INSERT INTO prefectures(prefectures_id,prefectures_name) VALUES('01','北海道');
...

--市区町村
INSERT INTO municipalities(prefectures_id,municipalities_id,municipalities_name) VALUES('01','1002','札幌市');
...

コンテナの構築

/home/docker/lv3

docker compose up -d

動作の検証

前回はlocalhost:8080でアクセスしたんですが、今回はlocalhost上のdockerではないので使えません。

なのでコンテナを起動しているLinuxサーバーのIPを指定し、「192.168.0.xxx:8080」という形でアクセスします。

下記のように表示されればOK

まとめ

Linux環境特有のつまずきがあるかと思いきや限りなく”ゼロ”で、Windowsのやり方がそのまんま転用できました。

Dockerfileやコマンドもほぼ使いまわしできたので、WindowsでできたらLinuxでも問題なく操作できそうです。

最後のapache+PHP+PostgreSQLのコンテナが動いたときは改めてコンテナの良さを実感。
dockerを動かしているサーバー側はapacheが入っていないのにブラウザアクセスを受付し、問題なくDBの情報を表示できたところで、うまく使うことができればサービスごとの独立性が高まって、メンテやリプレイスもしやすそう。

これが10年前にあるんだもんな、、自分の仕事で直近使えるかどうかは微妙ですが、やはり学びは大事ということで。。。

スポンサーリンク
おすすめの記事