docker-compose部署LNMP環境
https://blog.csdn.net/xiazichenxi/article/details/95652457
版本信息
OS: Ubuntu 18.04.5 LTS on Windows 10 x86_64
Docker version 20.10.12, build e91ed57
docker-compose version 1.28.4, build cabd5cfb
MySQL 5.7.37
PHP 7.0.33 (cli)
PHP 7.0.33 (fpm-fcgi)
Git地址:https://gitee.com/luoxian1011/let/tree/master/lnmp
展示頁面:
開始部署
創建lnmp目錄
mkdir -p lnmp && cd lnmp
mkdir -p php
# 結構如下
❯ tree lnmp -L 2
lnmp
├── docker-compose.yml
└── php
└── Dockerfile
1 directory, 2 files
編輯 php/Dockerfile
- 由於官方php-fpm鏡像缺少一些擴展,所以要先用dockerfile構建新的鏡像
- 注意配置時區和mysql擴展
vi php/Dockerfile
FROM php:7.0-fpm
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo "Asia/Shanghai" > /etc/timezone
RUN apt-get update && apt-get install -y \
libfreetype6-dev \
libjpeg62-turbo-dev \
libmcrypt-dev \
libpng-dev \
libmemcached-dev \
zlib1g-dev \
libcurl4-openssl-dev \
libxml2-dev \
--no-install-recommends && rm -rf /var/lib/apt/lists/* \
&& docker-php-ext-install -j$(nproc) \
iconv mcrypt gettext curl mysqli pdo pdo_mysql zip \
mbstring bcmath opcache xml simplexml sockets hash soap \
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install -j$(nproc) gd
CMD ["php-fpm", "-F"]
編輯docker-compose.yml
- 官方推薦使用volume優於bind mount
- volume默認存放在/var/lib/docker/volumes
vi docker-compose.yml
version: "3"
services:
mysql:
hostname: mysql
restart: always
image: mysql:5.7
container_name: mysql
ports:
- "3306:3306"
volumes:
- mysql-config:/etc/mysql
- mysql-log:/var/log/mysql
- mysql-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_USER: user
MYSQL_PASSWORD: user123
TZ: Asia/Shanghai
php:
hostname: php
restart: always
container_name: php
build:
context: ./php
dockerfile: Dockerfile
ports:
- "9000:9000"
environment:
TZ: Asia/Shanghai
links:
- mysql:mysql
volumes:
- nginx-html:/var/www/html
- php-config:/usr/local/etc
nginx:
hostname: nginx
restart: always
container_name: nginx
image: nginx:1.17.0
ports:
- "80:80"
- "443:443"
environment:
TZ: Asia/Shanghai
links:
- "php:php"
volumes:
- nginx-config:/etc/nginx
- nginx-log:/var/log/nginx
- nginx-html:/usr/share/nginx/html
volumes:
mysql-config:
mysql-log:
mysql-data:
nginx-html:
php-config:
nginx-config:
nginx-log:
啟動服務
docker-compose up -d # 啟動
docker-compose restart # 重啟
數據持久化目錄
- /var/lib/docker/volumes
docker volume ls # 查看volume
lnmp_mysql-config # 數據庫配置文件
lnmp_mysql-data # 數據庫數據文件
lnmp_mysql-log # 數據庫日志
lnmp_php-config # PHP配置文件
lnmp_nginx-config # nginx 配置文件
lnmp_nginx-html # nginx web目錄
lnmp_nginx-log # nginx日志目錄
metadata.db # volumes元數據信息
php配置文件
- /var/lib/docker/volumes/lnmp_php-config/_data
- 默認的php.ini文件是沒有的,需要手動把模板配置文件復制為php.ini
- 同時修改時區
# 把模板配置文件復制為php.ini
cd /var/lib/docker/volumes/lnmp_php-config/_data/php
cp php.ini-production php.ini
# 修改php.ini
sed -i 's/;date.timezone =/date.timezone = PRC/' php.ini
nginx配置
vi /var/lib/docker/volumes/lnmp_nginx-config/_data/conf.d/default.conf
- nginx主頁根目錄 : root /usr/share/nginx/html;
- php 主頁根目錄 : root /var/www/html;
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm index.php;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ \.php$ {
root /var/www/html; # 在php服務器中/var/www/html目錄,存放php文件
fastcgi_pass php:9000; # 這里php就是php容器的名字
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
重啟加載配置
docker-compose restart # 重啟
異常處理記錄
mysql5.6 啟動失敗,報錯權限問題
容器 mysqld: Can't create/write to file '/tmp/iby6gPxz' (Errcode: 13 - Permission denied)
# 暫時將mysql版本改到5.7
mysql5.7 Warning: World-writable config file ‘/etc/my.cnf’ is ignored
ls -l /var/lib/docker/volumes/lnmp_mysql-config/_data/my.cnf
lrwxrwxrwx 1 root root 24 Jan 27 08:58 my.cnf -> /etc/alternatives/my.cnf
# 文件為軟連接,無法掛載到容器,此次暫時這樣解決一下
rm -f my.cnf && touch my.cnf
# 后續發現nginx的日志軟連接到/dev/stdout,可能是wsl的問題,暫時解決一下
rm -f access.log error.log && touch access.log error.log
# 重啟
docker-compose restart
mysql5.7 Table ‘performance_schema.session_variables’ doesn’t exist 問題
https://www.cnblogs.com/linux90/p/12166959.html
performance_schema在mysql5.5以上就有自帶
performance_schema(安裝數據庫時自帶的)如果裝數據庫或者使用數據時不小心刪除了,就會出現Table‘performance_schema.session_variables’ doesn’t exist的異常。
第一步:
# mysql_upgrade -uroot -p
第二步:
# docker-compose restart
mysql5.7 的docker logs時區問題
https://www.cnblogs.com/minseo/p/11364003.html
1、臨時修改
# mysql -uroot -p123456 -h 127.0.0.1
mysql> show variables like "log_timestamps";
mysql> set global log_timestamps="SYSTEM";
mysql> show variables like "log_timestamps";
+----------------+--------+
| Variable_name | Value |
+----------------+--------+
| log_timestamps | SYSTEM |
+----------------+--------+
1 row in set (0.00 sec)
# 使用錯誤的密碼登錄一次產生日志再次查看日志時間對了
2、設置永久生效,修改MySQL配置文件my.cnf
# 文件為軟連接,此次暫時這樣解決一下
# rm -f my.cnf && touch my.cnf
# vi /var/lib/docker/volumes/lnmp_mysql-config/_data/my.cnf
[mysqld]
log_timestamps=SYSTEM
# 重啟容器
docker-compose restart
# 查看日志
docker-compose logs -f
如果是使用docker-compose啟動則需要修改配置文件添加以下內容
volumes:
- ./mysql/conf:/etc/mysql/conf.d
- ./mysql/data:/var/lib/mysql
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
PS:如果docker-compose已經啟動則添加配置重啟無效需要刪除容器再重新up才能生效
docker-compose down
docker-compose up -d
測試驗證
查看容器狀態
docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b7531773beaa nginx:1.17.0 "nginx -g 'daemon of…" 14 minutes ago Up 7 minutes 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp nginx
aaebabd0a32a composelnmp_php "docker-php-entrypoi…" 14 minutes ago Up 7 minutes 0.0.0.0:9000->9000/tcp php
df7b8bd4975b mysql:5.6 "docker-entrypoint.s…" 14 minutes ago Up 7 minutes 0.0.0.0:3306->3306/tcp mysql
驗證nginx
# 改一下首頁index文件
echo " hello world! " > /var/lib/docker/volumes/lnmp_nginx-html/_data/index.html
瀏覽器訪問:http://localhost
驗證mysql
[root@localhost ~]# docker container exec -it mysql bash
root@mysql:/# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.44 MySQL Community Server (GPL)
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
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> select version();
+-----------+
| version() |
+-----------+
| 5.6.44 |
+-----------+
1 row in set (0.00 sec)
驗證php訪問
echo "<?php phpinfo();" > /var/lib/docker/volumes/lnmp_nginx-html/_data/test.php
瀏覽器訪問:http://localhost/test.php
驗證mysql訪問
# wsl - lnmp - 查看ip
docker network inspect lnmp_default | grep Gateway
"Gateway": "172.21.0.1"
vi /var/lib/docker/volumes/lnmp_nginx-html/_data/testdb.php
<?PHP
// 主機填寫主機ip,測試localhost和127.0.0.1都有報錯
$conn=mysqli_connect("172.21.0.1","user","user123");
if($conn){
echo"[ok] - mysqli_connect - ";
}else{
echo"[error] mysqli_connect - ";
}
?>