《Docker基礎》- 構建 PHP 運行環境


《Docker基礎》- 構建 PHP 運行環境

1. 新建目錄

<code>mkdir -p /makeit/docker/nginx/conf.d \\
/makeit/logs/nginx \\
/makeit/web/homea \\
/home/src/<code>

2. 獲取鏡像

<code>docker pull php:7.3.7-fpm
docker pull nginx
docker pull mysql
docker pull redis/<code>

3. 下載應用

注:下載相關應用,解壓至 /home/src(可用於默認配置文件的獲取,有配置文件的可略過)

解壓相應文件,獲取默認配置 nginx.conf / php.ini 等

<code>wget http://nginx.org/download/nginx-1.14.0.tar.gz
wget https://files.phpmyadmin.net/phpMyAdmin/4.8.2/phpMyAdmin-4.8.2-all-languages.zip
wget http://101.96.10.64/jp2.php.net/distributions/php-7.3.0.tar.gz

# 複製文件
tar zxvf phpMyAdmin-4.8.2-all-languages.zip \\
tar zxvf php-7.2.8.tar.gz \\
tar zxvf nginx-1.14.0.tar.gz
cp /home/src/php-7.2.8/php.ini-production /home/docker/php/php.ini/<code>

4. 運行鏡像


《Docker基礎》- 構建 PHP 運行環境

4.1. MySQL

<code># 創建文件夾
mkdir -p /makeit/docker/mysql/data
cd /makeit/docker/mysql

# 5.5.61 版本
docker run -p 3306:3306 --name mysql \\
-v /makeit/docker/mysql/conf:/etc/mysql/conf.d \\
-v /makeit/docker/mysql/data:/etc/mysql/data \\
-v /makeit/logs/mysql:/var/log/mysql \\
-e MYSQL_ROOT_PASSWORD="123456" \\
--restart=always -d mysql:5.5.61

# 8.0.18 版本
# 啟動一個臨時 MySQL
docker run \\
-p 3306:3306 \\
--name mysql \\
-e MYSQL_ROOT_PASSWORD=123456 \\
--restart=always \\
-d mysql

# 創建文件夾並複製容器文件
cd /makeit/docker/mysql
mkdir plugin private
docker cp mysql:/usr/lib/mysql/plugin /makeit/docker/mysql
docker cp mysql:/usr/lib/mysql/private /makeit/docker/mysql
docker cp mysql:/etc/mysql/ /makeit/docker/mysql/conf

# 刪除臨時容器後, 重新啟動
# 密碼可以簡單些, 成功後進入容器修改密碼
docker stop mysql
docker rm mysql
docker run \\
-p 3306:3306 \\
--name mysql \\
-v /miit/docker/mysql/plugin:/usr/lib/mysql/plugin \\
-v /miit/docker/mysql/private:/usr/lib/mysql/private \\
-v /miit/docker/mysql/conf:/etc/mysql \\
-v /miit/docker/mysql/data:/var/lib/mysql \\

-e MYSQL_ROOT_PASSWORD=123456 \\
--restart=always \\
-d mysql

# 查看用戶
mysql> select user,host from mysql.user;
+------------------+-----------+
| user | host |
+------------------+-----------+
| root | % |
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+------------------+-----------+
5 rows in set (0.00 sec)

# 修改密碼
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '12345678';
Query OK, 0 rows affected (0.01 sec)

# 遠程登錄的帳戶密碼也需要修正
mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '12345678';
Query OK, 0 rows affected (0.01 sec)/<code>


《Docker基礎》- 構建 PHP 運行環境

4.2. PHP

<code># 啟動一臨時 php, 查看 php 配置文件及其擴展目錄
docker run --name php -p 9000:9000 \\
-d --restart=always php:7.3.7-fpm

# 進入容器查看信息
# 注意 Configuration File (php.ini) Path 及 extension_dir 兩個屬性值
docker exec -it php /bin/bash
php -r 'phpinfo();'

# 知道目錄後將內容複製到宿主機下(放置在 /makeit/docker/php 下,666f8de6d689 為容器 ID)
docker cp 666f8de6d689:/usr/local/lib/php/extensions/no-debug-non-zts-20180731/ /makeit/docker/php/ext
docker cp 666f8de6d689:/usr/local/etc/php/php.ini /makeit/docker/php/php.ini

# 刪除臨時後再重新啟動
# www 目錄需要與 nginx 保持一致
docker stop php
docker rm php
docker run --name php -p 9000:9000 \\
-v /makeit/web:/www:rw \\
-v /makeit/logs/php:/var/log/php \\
-v /makeit/docker/php/ext:/usr/local/lib/php/extensions/no-debug-non-zts-20180731 \\
-v /makeit/docker/php/php.ini:/usr/local/etc/php/php.ini \\
-d --restart=always --link mysql:mysql php:7.3.7-fpm

# 運行成功後,進入容器,可用 `docker-php-ext-install` 命令來安裝擴展;如 `docker-php-ext-install pdo_mysql`/<code>


《Docker基礎》- 構建 PHP 運行環境

4.3. Nginx

4.3.1 新建配置

<code># fastcgi_params
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;

fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REQUEST_SCHEME $scheme;
fastcgi_param HTTPS $https if_not_empty;

fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;

fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;

# nginx.conf
# user nginx;
worker_processes 1;

error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

daemon off;

events {
\tworker_connections 1024;
}

http {
\tinclude /etc/nginx/mime.types;
\tdefault_type application/octet-stream;

\tlog_format main '$remote_addr - $remote_user [$time_local] "$request" '
\t'$status $body_bytes_sent "$http_referer" '
\t'"$http_user_agent" "$http_x_forwarded_for"';

\taccess_log /var/log/nginx/access.log main;

\tsendfile on;
\t# tcp_nopush on;

\tkeepalive_timeout 65;

\tautoindex on;
\t
\t# gzip on;

\tinclude /etc/nginx/conf.d/*.conf;

\tclient_max_body_size 100M;

\tclient_header_buffer_size 128k;
\tlarge_client_header_buffers 4 128k;
}

# default.conf
server {
listen\t80;
listen\t443 ssl;
server_name\twildidea.cn www.wildidea.cn;

root /www/makeit;

access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log warn;

ssl_certificate cert/www.pem;
ssl_certificate_key cert/www.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_prefer_server_ciphers on;
ssl_session_timeout 5m;
ssl_session_tickets on;
ssl_dhparam ssl/private/dhparam.pem;

location / {
index index.html index.htm index.php index.jsp;
}

error_page 500 502 503 504 /50x.html;
location /50x.html {
root /www;

}

location ~ /\\. {
return 403;
}

location ~* ^.+\\.(jpg|jpeg|gif|png|bmp|css|js|swf)$ {
access_log off;
}

location ~ \\.php$ {
root /www/makeit;
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_split_path_info ^(.+\\.php)(.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

location ~ /\\.ht {
deny all;
}
}/<code>

4.3.2. 運行容器

<code>docker run -it \\
--name nginx \\
-d -p 80:80 -p 443:443 --restart=always \\
-v /makeit/web:/www \\
-v /makeit/logs/nginx:/var/log/nginx \\
-v /makeit/docker/nginx/nginx.conf:/etc/nginx/nginx.conf:ro \\
-v /makeit/docker/nginx/conf.d:/etc/nginx/conf.d \\
-v /makeit/docker/nginx/ssl:/etc/nginx/ssl \\
-v /makeit/docker/nginx/letsencrypt:/etc/nginx/letsencrypt \\
--link php:php nginx/<code>

4.3.3. 命令說明

<code>-p 80:80:將容器的80端口映射到主機的80端口
--name nginx:將容器命名為 nginx
-v /wildidea/web:/www:將宿主機中的目錄 web 掛載到容器的 www 目錄下,以下同理

--link php:關聯 php/<code>

注意 `nginx` 配置文件的路徑,所有路徑皆為 docker 容器路徑,非宿主機的本地路徑 ;

`nginx` 配置中的 fastcgi_pass,監聽的是 php-fpm ;


分享到:


相關文章: