各端末にDockerソフトがインストールされている前提で進めます。
まだの方は公式ページからどうぞ
PHP環境構築
まずは試しに以下のDockerfileを作成してPHP環境を構築
# ベースイメージ
FROM centos:7
# CentOSのキー(各インストール時に必要)
RUN rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
# パッケージ管理コマンドのアップデート
RUN yum -y update
# apacheのインストール
RUN yum -y install httpd
# epelリポジトリをインストール
RUN yum -y install epel-release
# remiリポジトリのインストール
RUN yum -y install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
# PHPのインストール
RUN yum install --enablerepo=remi,remi-php70 -y php php-common php-mysqlnd php-mbstring php-intl php-mcrypt php-opcache php-xml
# ポート808080でアクセス可能な状態に設定
EXPOSE 8080
# apache起動
RUN systemctl enable http
以下のコマンドを実行します。
docker build -f ./Dockerfile -t centos-test .
以下のようにエラーになりました。
[+] Building 2.8s (4/4) FINISHED docker:desktop-linux
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 786B 0.0s
=> [internal] load metadata for docker.io/library/centos:7 2.6s
=> [auth] library/centos:pull token for registry-1.docker.io 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
Dockerfile:19
--------------------
17 | RUN yum install --enablerepo=remi,remi-php70 -y php php-common php-mysqlnd php-mbstring php-intl php-mcrypt php-opcache php-xml
18 | # ポート808080でアクセス可能な状態に設定
19 | >>> EXPOSE 808080
20 | # apache起動
21 | RUN systemctl enable http
--------------------
ERROR: failed to solve: invalid containerPort: 808080
tsunenori.henna@tsunenorihennas-MacBook-Pro docker % vim Dockerfile
tsunenori.henna@tsunenorihennas-MacBook-Pro docker % docker build -f ./Dockerfile -t centos-test .
[+] Building 20.1s (7/12) docker:desktop-linux
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 784B 0.0s
=> [internal] load metadata for docker.io/library/centos:7 2.2s
=> [auth] library/centos:pull token for registry-1.docker.io 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [1/8] FROM docker.io/library/centos:7@sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4 15.7s
=> => resolve docker.io/library/centos:7@sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4 0.0s
=> => sha256:2d473b07cdd5f0912cd6f1a703352c82b512407db6b05b43f2553732b55df3bc 76.10MB / 76.10MB 7.9s
=> => sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4 1.20kB / 1.20kB 0.0s
=> => sha256:dead07b4d8ed7e29e98de0f4504d87e8880d4347859d839686a31da35a3b532f 529B / 529B 0.0s
=> => sha256:eeb6ee3f44bd0b5103bb561b4c16bcb82328cfe5809ab675bb17ab3a16c517c9 2.75kB / 2.75kB 0.0s
=> => extracting sha256:2d473b07cdd5f0912cd6f1a703352c82b512407db6b05b43f2553732b55df3bc 7.0s
=> [2/8] RUN rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 1.2s
=> ERROR [3/8] RUN yum -y update 0.8s
------
> [3/8] RUN yum -y update:
0.311 Loaded plugins: fastestmirror, ovl
0.480 Determining fastest mirrors
0.740 Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=container error was
0.740 14: curl#6 - "Could not resolve host: mirrorlist.centos.org; Unknown error"
0.748
0.748
0.748 One of the configured repositories failed (Unknown),
0.748 and yum doesn't have enough cached data to continue. At this point the only
0.748 safe thing yum can do is fail. There are a few ways to work "fix" this:
0.748
0.748 1. Contact the upstream for the repository and get them to fix the problem.
0.748
0.748 2. Reconfigure the baseurl/etc. for the repository, to point to a working
0.748 upstream. This is most often useful if you are using a newer
0.748 distribution release than is supported by the repository (and the
0.748 packages for the previous distribution release still work).
0.748
0.748 3. Run the command with the repository temporarily disabled
0.748 yum --disablerepo=<repoid> ...
0.748
0.748 4. Disable the repository permanently, so yum won't use it by default. Yum
0.748 will then just ignore the repository until you permanently enable it
0.748 again or use --enablerepo for temporary usage:
0.748
0.748 yum-config-manager --disable <repoid>
0.748 or
0.748 subscription-manager repos --disable=<repoid>
0.748
0.748 5. Configure the failing repository to be skipped, if it is unavailable.
0.748 Note that yum will try to contact the repo. when it runs most commands,
0.748 so will have to try and fail each time (and thus. yum will be be much
0.748 slower). If it is a very temporary problem though, this is often a nice
0.748 compromise:
0.748
0.748 yum-config-manager --save --setopt=<repoid>.skip_if_unavailable=true
0.748
0.748 Cannot find a valid baseurl for repo: base/7/x86_64
------
Dockerfile:7
--------------------
5 |
6 | # パッケージ管理コマンドのアップデート
7 | >>> RUN yum -y update
8 |
9 | # apacheのインストール
--------------------
ERROR: failed to solve: process "/bin/sh -c yum -y update" did not complete successfully: exit code: 1
CentOS 7が2024年6月でサポート終了となってしまったことが原因みたい。(詳細はこちら)
rockylinuxってのが代替OSの1つとしてあるらしいのでPHP、apacheをインストール
PHP:https://docs.rockylinux.org/guides/web/php/
apache:https://docs.rockylinux.org/guides/web/apache-sites-enabled/
# ベースイメージ
FROM rockylinux:8.9
# Remiリポジトリのインストール
RUN dnf -y install https://rpms.remirepo.net/enterprise/remi-release-8.rpm
# Remiリポジトリの有効化
RUN dnf config-manager --set-enabled remi
# PHP7.0有効化
RUN dnf -y module enable php:remi-7.4
# PHPの必要なモジュール追加
RUN dnf -y install php php-curl php-zip php-mbstring php-mysqlnd php-mcrypt php-xml
# ポート808080でアクセス可能な状態に設定
EXPOSE 8080
# apacheインストール
RUN dnf -y install httpd
# apache起動
RUN systemctl enable --now httpd
こんな感じに書き直して再度buildコマンド実行
% docker build -f ./docker/Dockerfile -t cakephp-test .
[+] Building 2.7s (11/11) FINISHED docker:desktop-linux
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 625B 0.0s
=> [internal] load metadata for docker.io/library/rockylinux:8.9 2.2s
=> [auth] library/rockylinux:pull token for registry-1.docker.io 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [1/7] FROM docker.io/library/rockylinux:8.9@sha256:9794037624aaa6212aeada1d28861ef5e0a935adaf93e4ef79837119f2a2d04c 0.0s
=> CACHED [2/7] RUN dnf -y install https://rpms.remirepo.net/enterprise/remi-release-8.rpm 0.0s
=> CACHED [3/7] RUN dnf config-manager --set-enabled remi 0.0s
=> CACHED [4/7] RUN dnf -y module enable php:remi-7.4 0.0s
=> CACHED [5/7] RUN dnf -y install php php-curl php-zip php-mbstring php-mysqlnd php-mcrypt php-xml 0.0s
=> CACHED [6/7] RUN dnf -y install httpd 0.0s
=> ERROR [7/7] RUN systemctl enable --now httpd 0.4s
------
> [7/7] RUN systemctl enable --now httpd:
0.369 Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
0.369 System has not been booted with systemd as init system (PID 1). Can't operate.
0.369 Failed to connect to bus: Host is down
------
Dockerfile:16
--------------------
14 | RUN dnf -y install httpd
15 | # apache起動
16 | >>> RUN systemctl enable --now httpd
17 |
--------------------
ERROR: failed to solve: process "/bin/sh -c systemctl enable --now httpd" did not complete successfully: exit code: 1
エラーになりました。
調べてみるとdockerではsystemctlコマンドを使わないパターンも多いみたい。
docker起動時に「docker run –privileged」みたいなオプションをつけたらできるみたいな話もあるけど、
ホストマシンの全デバイスとかにアクセスできるようになっちゃってセキュリティ的にまずいらしい。
ってことで、以下のようなDockerfileでとりあえずビルド&起動
# ベースイメージ
FROM rockylinux:8.9
# 初期プロセス設定
# RUN ["/sbin/init"]
# Remiリポジトリのインストール
RUN dnf -y install https://rpms.remirepo.net/enterprise/remi-release-8.rpm
# Remiリポジトリの有効化
RUN dnf config-manager --set-enabled remi
# PHP7.0有効化
RUN dnf -y module enable php:remi-7.4
# PHPの拡張モジュール追加
RUN dnf -y install php php-curl php-zip php-mbstring php-mysqlnd php-mcrypt php-xml php-intl
# systemd
RUN dnf install -y systemd
# ポート8080でアクセス可能な状態に設定
EXPOSE 8080
# apacheインストール
RUN dnf -y install httpd
# apache設定ファイルをコンテナ上に格納
COPY ./docker/virtualhost.conf /etc/httpd/conf.d/
# apache起動
RUN ["/sbin/httpd", "-k", "start"]
ビルド
docker build -f docker/Dockerfile -t docker-test .
起動
docker run -it -p 8080:80 docker-test
ホストからDocker内部にコピーしている「./docker/virtualhost.conf」の中身はこんな感じです。
ServerName localhost
<VirtualHost *:80>
UseCanonicalName Off
ServerName any
VirtualDocumentRoot /var/www/html/webroot
DirectoryIndex index.php index.html
</VirtualHost>
これでとりあえず起動したDockerの中に入り、以下の操作をするとブラウザにテキストが表示できるところまではいけた。
apache起動(Dockerfileに同じ命令を入れてるけど、なぜか動作してないっぽいので中で直接実行)
httpd -k start
「/var/www/html/webroot/index.html」ファイルを以下の内容で作成
test test
ブラウザで表示(http://localhost:8080)
ここまでくれば、あとは「httpd -k start」が動かないところだけの修正とCakePHPの導入です。
CakePHP導入
今回は、既存のCakePHPソースをgitからダウンロードして、
そのファイルをDocker内にマウントして動かそうと思ってます。
ファイルのマウントはdocker-compose.ymlを使用します。
とりあえず以下のような内容でdocker-compose.ymlファイルを作成
version: '3.8'
webserver:
build: .
以下のコマンドを実行(同じディレクトリ内にDockerfileが存在すること)
docker compose up --build
はい、エラー出ました。
validating /Users/tsunenori.henna/Documents/cdp/00_source/03_cakephp/crmsystem/docker/docker-compose.yml: (root) Additional property webserver is not allowed
docker-compose.ymlの書き方間違ってたみたいです。
version: '3.8'
services:
webserver:
build: .
servicesを追加して再度実行
またまたエラー
[+] Running 0/0
[+] Running 0/1erver Building 0.1s
[+] Building 2.0s (13/15) docker:desktop-linux
=> [webserver internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 1.39kB 0.0s
=> [webserver internal] load metadata for docker.io/library/rockylinux:8.9 1.9s
=> [webserver auth] library/rockylinux:pull token for registry-1.docker.io 0.0s
=> [webserver internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [webserver 1/10] FROM docker.io/library/rockylinux:8.9@sha256:9794037624aaa6212aeada1d28861ef5e0a935adaf93e4ef79837119f 0.0s
=> [webserver internal] load build context 0.0s
=> => transferring context: 2B 0.0s
=> CACHED [webserver 2/10] RUN dnf -y install https://rpms.remirepo.net/enterprise/remi-release-8.rpm 0.0s
=> CACHED [webserver 3/10] RUN dnf config-manager --set-enabled remi 0.0s
=> CACHED [webserver 4/10] RUN dnf -y module enable php:remi-7.4 0.0s
=> CACHED [webserver 5/10] RUN dnf -y install php php-curl php-zip php-mbstring php-mysqlnd php-mcrypt php-xml php-intl 0.0s
=> CACHED [webserver 6/10] RUN dnf install -y systemd 0.0s
=> CACHED [webserver 7/10] RUN dnf -y install httpd 0.0s
=> ERROR [webserver 8/10] COPY ./docker/virtualhost.conf /etc/httpd/conf.d/ 0.0s
------
[+] Running 0/18/10] COPY ./docker/virtualhost.conf /etc/httpd/conf.d/:
⠹ Service webserver Building 2.2s
failed to solve: failed to compute cache key: failed to calculate checksum of ref af08e3c8-6c64-4285-acdf-8991b0c76b20::w174bl4n1hx6dw99bmq5xc58u: "/docker/virtualhost.conf": not found
Dockerfile内のパスの書き方がまずそうですね
以下のように修正します。
# ベースイメージ
FROM rockylinux:8.9
# 初期プロセス設定
# RUN ["/sbin/init"]
# Remiリポジトリのインストール
RUN dnf -y install https://rpms.remirepo.net/enterprise/remi-release-8.rpm
# Remiリポジトリの有効化
RUN dnf config-manager --set-enabled remi
# PHP7.0有効化
RUN dnf -y module enable php:remi-7.4
# PHPの拡張モジュール追加
RUN dnf -y install php php-curl php-zip php-mbstring php-mysqlnd php-mcrypt php-xml php-intl
# systemd
RUN dnf install -y systemd
# ポート8080でアクセス可能な状態に設定
EXPOSE 8080
# apacheインストール
RUN dnf -y install httpd
# apache設定ファイルをコンテナ上に格納
COPY ./virtualhost.conf /etc/httpd/conf.d/
# apache起動
RUN /sbin/httpd -k start
再度実行して成功しました。
[+] Running 0/0
[+] Running 0/1erver Building 0.1s
[+] Building 0.8s (16/16) FINISHED docker:desktop-linux
=> [webserver internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 1.38kB 0.0s
=> [webserver internal] load metadata for docker.io/library/rockylinux:8.9 0.7s
=> [webserver internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [webserver 1/10] FROM docker.io/library/rockylinux:8.9@sha256:9794037624aaa6212aeada1d28861ef5e0a935adaf93e4ef79837119f 0.0s
=> [webserver internal] load build context 0.0s
=> => transferring context: 235B 0.0s
=> CACHED [webserver 2/10] RUN dnf -y install https://rpms.remirepo.net/enterprise/remi-release-8.rpm 0.0s
=> CACHED [webserver 3/10] RUN dnf config-manager --set-enabled remi 0.0s
=> CACHED [webserver 4/10] RUN dnf -y module enable php:remi-7.4 0.0s
=> CACHED [webserver 5/10] RUN dnf -y install php php-curl php-zip php-mbstring php-mysqlnd php-mcrypt php-xml php-intl 0.0s
=> CACHED [webserver 6/10] RUN dnf install -y systemd 0.0s
=> CACHED [webserver 7/10] RUN dnf -y install httpd 0.0s
=> CACHED [webserver 8/10] COPY ./virtualhost.conf /etc/httpd/conf.d/ 0.0s
=> CACHED [webserver 9/10] RUN /sbin/httpd -k start 0.0s
=> CACHED [webserver 10/10] WORKDIR /var/www/html 0.0s
=> [webserver] exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:d2e5a895973af4c163cfdf91aedae0676fc890323d454e7d15d64e73def41a49 0.0s
[+] Running 3/3o docker.io/library/docker-webserver 0.0s
✔ Service webserver Built 1.0s
✔ Network docker_default Created 0.1s
✔ Container docker-webserver-1 Created 0.1s
Attaching to webserver-1
webserver-1 exited with code 0
ただ、動いてるけど処理が終わります。
stdin_open、ttyをtrueにすることでこれは回避できるみたいです。
docker-compose側に記載します。
version: '3.8'
services:
webserver:
build: .
volumes:
- ..:/var/www/html
ports:
- "8080:80"
tty: true
コマンドを維持し続けるみたいなオプションみたいです。
編集中なので、続けて更新します。