使用 AlmaLinux 自己制作 LAMP 容器映像,以操作系统软件包为基础
首先
尝试从操作系统包中创建一个关于AlmaLinux LAMP容器镜像的文章。
环境
-
- VirtualBox 7.0 on MacOSX Sonoma
- AlmaLinux-9.2-x86_64-minimal.iso でデフォルトインストール
准备建设
安装 podman 和 perl。(perl不是必需的)
sudo dnf install podman perl -y
建立
创建 httpd + php 容器镜像。
创建用于创建容器的目录,并在其中安装软件包。
mkdir -p ~/wk/httpd-php
sudo dnf --installroot ~/wk/httpd-php/ --releasever=/ install httpd httpd-tools php php-mysqlnd php-gd php-curl php-ftp php-fpm -y
进行设置文件等的编辑,将其作为容器映像导入
禁用httpd的默认字符编码设置
启用mod_mpm_prefork.so
创建php-fpm启动所需的目录
※我使用Perl,但也可以在编辑器中进行编辑。
cd ~/wk/httpd-php
sudo perl -pi -e 's/^(AddDefaultCharset) .*$/$1 Off/' etc/httpd/conf/httpd.conf
sudo perl -pi -e 's/^(LoadModule .*)$/#$1/' etc/httpd/conf.modules.d/00-mpm.conf
sudo perl -pi -e 's/^#(LoadModule .*mod_mpm_prefork\.so)$/$1/' etc/httpd/conf.modules.d/00-mpm.conf
sudo mkdir -p run/php-fpm
sudo tar cf - . | podman import - httpd-php:v1
确认容器镜像
$ podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost/httpd-php v1 2fa2df17933f 38 seconds ago 268 MB
确认行动
mkdir -p ~/data/www/html
echo "<?php phpinfo() ?>" > ~/data/www/html/phpinfo.php
podman run -dt --rm --name ph2ttpd -p 1080:80 -v ~/data/www/html:/var/www/html:Z localhost/httpd-php:v1 /bin/bash -c "/usr/sbin/php-fpm ; /usr/sbin/httpd -D FOREGROUND"
如果防火墙启用,请执行以下命令。
sudo firewall-cmd --permanent --zone=public --add-port=1080/tcp
sudo firewall-cmd --reload
停止容器。
(Note: The given sentence is in Japanese, not in Chinese. The provided paraphrase is in Simplified Chinese. If you need a translation in Traditional Chinese, please let me know.)
podman kill ph2ttpd
创建mysql容器镜像
创建用于容器创建的目录并安装软件包。
mkdir -p ~/wk/mysql
sudo dnf --installroot ~/wk/mysql/ --releasever=/ install mysql-server -y
作为容器镜像进行导入。
cd ~/wk/mysql
sudo tar cf - . | podman import - mysql:v1
确认容器映像
$ podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost/mysql v1 34f4abe592c4 55 seconds ago 503 MB
localhost/httpd-php v1 2fa2df17933f 11 minutes ago 268 MB
确认操作
mkdir -p ~/data/mysql
podman run -it --rm -v ~/data/mysql:/var/lib/mysql:Z localhost/mysql:v1 mysqld --initialize-insecure --user=root
podman run -dt --rm --name mysqldb -v ~/data/mysql:/var/lib/mysql:Z localhost/mysql:v1 mysqld -u root
尝试使用 exec 执行 mysql 命令。
$ podman exec -it mysqldb mysql -u root --skip-password
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.32 Source distribution
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> quit
Bye
如果你担心没有密码的问题,可以设置一个密码。
podman exec -it mysqldb mysqladmin password rootpassword -u root -p
请输入密码(无密码则按回车键)
停止容器。
podman kill mysqldb
确认操作
协同启动容器
podman network create webdbnet
podman run -dt --rm --name ph2ttpd --network webdbnet -p 1080:80 -v ~/data/www/html:/var/www/html:Z localhost/httpd-php:v1 /bin/bash -c "/usr/sbin/php-fpm ; /usr/sbin/httpd -D FOREGROUND"
podman run -dt --rm --name mysqldb --network webdbnet -v ~/data/mysql:/var/lib/mysql:Z localhost/mysql:v1 mysqld -u root
使用 phpMyAdmin 进行操作确认
执行 PHPMyAdmin 的安装和配置。
cd ~/data/www/html
curl -sL -O https://files.phpmyadmin.net/phpMyAdmin/5.2.1/phpMyAdmin-5.2.1-all-languages.zip
unzip phpMyAdmin-5.2.1-all-languages.zip
rm phpMyAdmin-5.2.1-all-languages.zip
mv phpMyAdmin-5.2.1-all-languages phpMyAdmin
perl -p -e 's/localhost/mysqldb/' phpMyAdmin/config.sample.inc.php > phpMyAdmin/config.inc.php
创建一个名为“dbadmin”的连接用户。
$ podman exec -it mysqldb mysql -u root -p
Enter password: rootpassword
:(略)
mysql> CREATE USER 'dbadmin'@'%' IDENTIFIED BY 'dbpassword';
Query OK, 0 rows affected (0.02 sec)
mysql> GRANT ALL PRIVILEGES ON *.* TO 'dbadmin'@'%' WITH GRANT OPTION;
Query OK, 0 rows affected (0.01 sec)
mysql> quit
Bye
将DB容器替换为mariadb
由于需要将默认字符编码设置为utf8mb4,并且需要避免以下两个限制/问题,因此添加了该设置。
sudo dnf --installroot ~/wk/mariadb/ --releasever=/ install -y mariadb-server
cd ~/wk/mariadb
sudo sed -i '/^\[galera\]/a innodb_page_size=64k' etc/my.cnf.d/mariadb-server.cnf
sudo sed -i '/^\[mysqld\]/a character-set-server=utf8mb4' etc/my.cnf.d/mariadb-server.cnf
sudo sed -i '/^\[mysqld\]/a collation-server=utf8mb4_unicode_ci' etc/my.cnf.d/mariadb-server.cnf
sudo sed -i '/^\[mysqld\]/a character-set-client-handshake=FALSE' etc/my.cnf.d/mariadb-server.cnf
sudo sed -i '/^\[mariadb\]/a lc_messages_dir=/usr/share/mariadb/english' etc/my.cnf.d/mariadb-server.cnf
sudo sed -i '/^\[client\]/a default-character-set=utf8mb4' etc/my.cnf.d/client.cnf
sudo sed -i '/^\[mysql\]/a default-character-set=utf8mb4' etc/my.cnf.d/client.cnf
sudo tar cf - . | podman import - mariadb:v1
然后进行初始化,名称仍为“mysqldb”容器,将其替换为mysql并启动。
mkdir ~/data/mariadb
podman run -it --rm -v ~/data/mariadb:/var/lib/mysql:Z localhost/mariadb:v1 mariadb-install-db
podman run -dt --rm --name mysqldb --network webdbnet -v ~/data/mariadb:/var/lib/mysql:Z localhost/mariadb:v1 mariadbd -u root
最后
可以通过将chroot环境通过tar打包导入来自制容器镜像。
如果在操作系统的包管理器中可以指定安装目录的话,那么借助操作系统的包,可以相对容易地自制容器镜像。