
「dockerから逃げるな!」
全開である程度実用性のあるコンテナ構成を組めたということで、
そうなると実行環境も実用向けにしたいところ、、、
そう!
Linuxサーバー上でdockerを動かす時が来た!
恐らく実務だったらLinuxサーバー使うのでは・・・?
というのは最初から思ってたんですが、Windowsの方がとっつきやすいだろうということで後回しにしてました。
なので今回はLinux上で動作させる手順を記載していきます。
dockerを導入するLinux環境はAlmalinux9.5を使ってます。
dockerのインストール~Hello Worldまで
必要なパッケージのインストール
dnf install yum-utils device-mapper-persistent-data lvm2dockerのインストール
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-plugindockerの起動
systemctl start docker
systemctl enable docker※一応自動起動も有効にしときます。
dockerの起動hello-worldコンテナの実行
docker run hello-world「Hello from Docker!~~~」と表示ができればOK。
う~ん、Windows環境を用意するより圧倒的に速い気がする。
コマンドで全部やってしまっているからかも。。。
コンテナの起動
過去やったのと同じようにDockerfileやdocker-compose.ymlを使ってコンテナを作成してみようと思います。
※作業ディレクトリは適当に/home以下でやっていきます。
Dockerfileを使ってコンテナ作成
過去記事の内容と全く同じものを再現していきます。※補足は割愛
ディレクトリ構成
/home/docker/lv1
└── DockerfileDockerfileの中身
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-containerdocker psコマンドでコンテナが起動していることを確認します。
一応コンテナに入れるか確認↓
[root@vbox lv1]# docker exec -it lv1-container bash
[root@6ec127c89c68 /]# ls無事コンテナが起動、使えることが確認できました!
Composeで複数コンテナを制御
こっちも過去記事の内容と全く同じものを再現していきます。※補足は割愛
ディレクトリ構成
/home/docker/lv2
└── docker-compose.ymldocker-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-1docker 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.sqldocker-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:16webコンテナの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年前にあるんだもんな、、自分の仕事で直近使えるかどうかは微妙ですが、やはり学びは大事ということで。。。
![【フィギュアレビュー】A-Z:[B]-full dress- シンプルに、、カッコ良く!](http://holiday-programmer.net/wordpress/wp-content/uploads/2025/11/title-1-300x169.png)









