天天看熱訊:容器指南之自定義LNMP容器鏡像

2022-12-08 10:10:58 來(lái)源:51CTO博客

1.簡(jiǎn)介

在Linux 環(huán)境中最常用的組件應(yīng)該屬于 LNMP 組合(Linux + Nginx + Mysql +PHP),當(dāng)然,隨著Go、Rust語(yǔ)言的普及,生產(chǎn)環(huán)境有更多的組合配置。但是 Nginx 的Web端和MySQL 的數(shù)據(jù)庫(kù)端還是主力配置。


(資料圖)

受 Nginx、MySQL 和 PHP 多版本和多配置文件的影響,在生產(chǎn)或測(cè)試環(huán)境要保持各組件版本和對(duì)應(yīng)的配置文件(特別是安全配置)統(tǒng)一需要花費(fèi)大量的時(shí)間和成本。

使用容器技術(shù)定制適合自己環(huán)境的組件鏡像,需要使用的時(shí)候無(wú)需復(fù)雜和長(zhǎng)時(shí)間的配置調(diào)整就能在1分鐘以內(nèi)提供標(biāo)準(zhǔn)的經(jīng)過驗(yàn)證的LNMP 環(huán)境。

Nginx 配置指南 ????https://blog.51cto.com/waringid/1438852??

容器指南之第一個(gè)容器 ??https://blog.51cto.com/waringid/5904849??

容器指南之容器架構(gòu)及常用指令 ??https://blog.51cto.com/waringid/5913145??

容器指南之日常運(yùn)維??https://blog.51cto.com/waringid/5914178??

Docker For Windows 安裝配置及常用維護(hù)??https://blog.51cto.com/waringid/5917666??

2.LNMP 環(huán)境介紹

1、基于 PHP7.4.28 版本,添加 PHP-GD 擴(kuò)展

2、Nginx 配置最新版本

3、Mysql 使用 Mariadb10版本

2.1.自定義 php 環(huán)境

sudo mkdir /opt/phpsudo chown docker /opt/phpcat > /opt/php/Dockfile << EOFFROM php:7.4.28-fpm-alpine3.15RUN set -x \        && echo "http://mirrors.huaweicloud.com/alpine/latest-stable/main/" > /etc/apk/repositories \        && echo "http://mirrors.huaweicloud.com/alpine/latest-stable/community/" >> /etc/apk/repositories \        && apk update \        && apk add --no-cache tzdata \        && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \        && echo "Asia/Shanghai" > /etc/timezone \        && apk del tzdata \        && apk add --no-cache graphviz zlib-dev libpng-dev libxml2-dev  zip libzip-dev \        && docker-php-ext-configure zip \         && docker-php-ext-install gd pdo_mysql soap mysqli zipEOFdocker build -t  php-fpm:7.4 .docker imagessudo docker save -o /opt/images/php-fpm-7.4.28.tar php-fpm:7.4

2.2.配置 LNMP 環(huán)境

sudo mkdir /opt/lnmpsudo chown docker /opt/lnmpcat > /opt/lnmp/docker-compose.yml << EOFversion: "2.1"services:  db:    image: mariadb:10.5    container_name: mysql    ports:      - "3306:3306"    environment:      - MYSQL_ROOT_PASSWORD=password                   # Root password of MySQL -- must be changed      - MYSQL_LOG_CONSOLE=true    volumes:      - /opt/lnmp/mysql-data:/var/lib/mysql         # Volume of MySQL (directory for persistent storage) and mount point in container -- can be changed (not advised)    networks:      lnmp-net:        ipv4_address: 172.18.0.3  nginx:    image: nginx    container_name: nginx    ports:      - "80:80"    volumes:      - /opt/lnmp/nginx/www:/usr/share/nginx/html      - /opt/lnmp/nginx/conf:/etc/nginx/conf      - /opt/lnmp/nginx/conf.d:/etc/nginx/conf.d      - /opt/lnmp/nginx/logs:/var/log/nginx    networks:       lnmp-net:        ipv4_address: 172.18.0.2   php:    image: php-fpm:7.4    container_name: php    volumes:      - /opt/lnmp/nginx/www:/www    networks:               lnmp-net:        ipv4_address: 172.18.0.3 networks:   ipam:     config:        - subnet: "172.18.0.0/24" EOFcat > /opt/lnmp/nginx/conf.d/php.conf << EOFserver {        listen  80;        server_name     localhost;    client_max_body_size 1000m;        location / {                root    /usr/share/nginx/html;                index   index.html index.htm index.php;                if ( !-f $request_filename  ) {                        rewrite ^/login$ /login.php last;                        rewrite ^/register$ /register.php last;                        rewrite ^/search$ /search.php last;                        rewrite ^/discount/student$ /discount.php?u=d last;                        rewrite ^/discount/teacher$ /discount.php?u=t last;                        # rewrite ^/admin.php$ /404.html break;                         rewrite ^/(.*)$ /index.php/$1 last;                }        }        error_page      500 502 503 504 /50x.html;        location = /50x.html {                root    /usr/share/nginx/html;        }        location ~ \.php(.*)$ {                root /www;                fastcgi_buffer_size 128k;                fastcgi_buffers 4 256k;                fastcgi_busy_buffers_size 256k;                fastcgi_pass    php:9000;                fastcgi_index   index.php;                fastcgi_split_path_info ^(.+\.php)(.*)$;                fastcgi_param   SCRIPT_FILENAME /www$fastcgi_script_name;                fastcgi_param   PATH_INFO       $fastcgi_path_info;                include         fastcgi_params;        }}EOFcat > /opt/lnmp/nginx/www/index.php << EOF歡迎使用DNMP!";echo "

版本信息

";echo "
    ";echo "
  • PHP版本:", PHP_VERSION, "
  • ";echo "
  • Nginx版本:", $_SERVER["SERVER_SOFTWARE"], "
  • ";echo "
  • MySQL服務(wù)器版本:", getMysqlVersion(), "
  • ";echo "
  • Redis服務(wù)器版本:", getRedisVersion(), "
  • ";echo "
  • MongoDB服務(wù)器版本:", getMongoVersion(), "
  • ";echo "
";echo "

已安裝擴(kuò)展

";printExtensions();/** * * 獲取MySQL版本 * */function getMysqlVersion(){ if (extension_loaded("PDO_MYSQL")) { try { $dbh = new PDO("mysql:host=mysql;dbname=mysql", "root", "123456"); $sth = $dbh->query("SELECT VERSION() as version"); $info = $sth->fetch(); } catch (PDOException $e) { return $e->getMessage(); } return $info["version"]; } else { return "PDO_MYSQL 擴(kuò)展未安裝 ×"; }}/** * * 獲取Redis版本 * */function getRedisVersion(){ if (extension_loaded("redis")) { try { $redis = new Redis(); $redis->connect("redis", 6379); $info = $redis->info(); return $info["redis_version"]; } catch (Exception $e) { return $e->getMessage(); } } else { return "Redis 擴(kuò)展未安裝 ×"; }}/** * * 獲取MongoDB版本 * */function getMongoVersion(){ if (extension_loaded("mongodb")) { try { $manager = new MongoDB\Driver\Manager("mongodb://root:123456@mongodb:27017"); $command = new MongoDB\Driver\Command(array("serverStatus"=>true)); $cursor = $manager->executeCommand("admin", $command); return $cursor->toArray()[0]->version; } catch (Exception $e) { return $e->getMessage(); } } else { return "MongoDB 擴(kuò)展未安裝 ×"; }}/** * * 獲取已安裝擴(kuò)展列表 * */function printExtensions(){ echo "
    "; foreach (get_loaded_extensions() as $i => $name) { echo "
  1. ", $name, "=", phpversion($name), "
  2. "; } } echo "
";}EOFcd /opt/lnmpdocker-compose up

2.3.安裝擴(kuò)展

默認(rèn)php鏡像中提供的擴(kuò)展比較少,缺少諸如mysql、gd2等常用的擴(kuò)展,這樣我們就需要自己安裝并啟用擴(kuò)展。

首先進(jìn)入到php容器,用php -m命令查看本地有什么擴(kuò)展。

可以使用docker-php-ext-install命令來(lái)安裝擴(kuò)展。

docker-php-ext-install mysql

擴(kuò)展安裝好之后就可以在php.ini中啟用。我們從phpinfo中可以看到,容器環(huán)境下默認(rèn)的php.ini沒有啟用,可以從/usr/local/etc/php下將php.ini-development拷貝為php.ini。通過修改php.ini中配置,啟用自己需要的擴(kuò)展。

下面是幾個(gè)擴(kuò)展安裝的命令,供參考。

docker-php-ext-source 在容器中創(chuàng)建一個(gè)/usr/src/php目錄docker-php-ext-enable啟用PHP擴(kuò)展,省去我們手工編輯php.ini的過程docker-php-ext-install安裝并啟用PHP擴(kuò)展docker-php-ext-configure經(jīng)常與docker-php-ext-install搭配,在需要自定義擴(kuò)展的配置時(shí)使用

2.4.單獨(dú)運(yùn)行命令行

如果僅需要在命令行下運(yùn)行 php 命令,可以使用如下方式

# 將當(dāng)前目錄掛載到 /tmp 目錄,執(zhí)行 php 命令,結(jié)束后退出

docker run -it --rm -v $PWD:/tmp -w /tmp php-fpm:7.4 php test.php

3.備份和恢復(fù)數(shù)據(jù)庫(kù)

docker exec -it seafile-mysql mysqldump  -uroot --opt ccnet_db > ccnet_db.sqldocker exec -it seafile-mysql mysqldump  -uroot --opt seafile_db > seafile_db.sqldocker exec -it seafile-mysql mysqldump  -uroot --opt seahub_db > seahub_db.sqldocker cp /opt/seafile-backup/databases/ccnet_db.sql seafile-mysql:/tmp/ccnet_db.sqldocker cp /opt/seafile-backup/databases/seafile_db.sql seafile-mysql:/tmp/seafile_db.sqldocker cp /opt/seafile-backup/databases/seahub_db.sql seafile-mysql:/tmp/seahub_db.sqldocker exec -it seafile-mysql /bin/sh -c "mysql -uroot ccnet_db < /tmp/ccnet_db.sql"docker exec -it seafile-mysql /bin/sh -c "mysql -uroot seafile_db < /tmp/seafile_db.sql"docker exec -it seafile-mysql /bin/sh -c "mysql -uroot seahub_db < /tmp/seahub_db.sql"

4.常見問題

mysql 容器

解決方法:

security_opt:  - seccomp:unconfined

標(biāo)簽: 配置文件 可以使用 當(dāng)前目錄

上一篇:全球觀速訊丨分布式實(shí)時(shí)日志:ELK 的部署架構(gòu)方案
下一篇:焦點(diǎn)日?qǐng)?bào):Promise異步請(qǐng)求變成同步