24
Dockerfile 方式定制 lnmp 环境-张德Talk
source link: https://blog.51cto.com/11261718/2465502
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
现在容器化技术越来越成熟和流行,比传统的虚拟化技术确实是有很大的优势,所以流行是必然的。今天来实践一把,使用Docker的dockerfile方式定制lnmp环境。
操作系统:CentOS Linux release 7.6.1810
Docker 版本:19.03.5
Nginx 版本:1.15.5
PHP 版本:7.2.26
MySQL 版本:8.0.18
Redis 版本:5.0.5
创建目录结构
docker目录://docker相关配置
[root@zhangdeTalk data]# tree docker
docker
├── bin
│ └── docker-compose-linux.yml //dockerfile.yml
├── config
│ ├── mysql
│ │ └── mysqld.cnf //数据库配置文件
│ ├── nginx
│ │ ├── conf.d
│ │ │ └── default.conf //nginx主要配置文件
│ │ └── nginx.conf //nginx基础配置文件
│ ├── php
│ │ ├── php.ini //php基础配置文件
│ │ └── www.conf //php主要配置文件
│ └── redis
│ └── redis.conf //redis配置文件
├── dockerfile
│ ├── mysql-8.0.18
│ │ └── Dockerfile //mysql的dockerfile
│ ├── nginx-1.15.5
│ │ └── Dockerfile //nginx的dockerfile
│ ├── php-7.2-fpm
│ │ └── Dockerfile //php的dockerfile
│ └── redis-5.0.5
│ └── Dockerfile //redis的dockerfile
├── README.en.md
└── README.md
www目录://站点目录
[root@zhangdeTalk data]# tree www
www
└── zhangdetalk_blog_admin
├── 1.html
└── index.php
logs目录://日志目录
[root@zhangdeTalk data]# tree logs
logs
├── mysql
├── nginx
│ ├── access.log
│ └── error.log
├── php
└── redis
mysql目录://数据库数据目录
redis目录://数据库数据目录
Docker安装
先在CentOS安装Docker,可参考另外一篇文章:CentOS安装Docker
构建lnmp镜像Dockerfile
PHP Dockerfile
From php:7.2-fpm
#维护者信息
MAINTAINER zhangdeTalk [email protected]
#时区
ENV TZ Asia/Shanghai
RUN date -R
#RUN docker-php-ext-install bcmath dom fileinfo filter ftp gd gmp hash iconv imap json mbstring mysqli odbc opcache pdo pdo_mysql pdo_odbc phar reflection session snmp soap sockets zip
#RUN docker-php-ext-install mysqli opcache pdo_mysql
WORKDIR /working
RUN apt-get update --fix-missing && apt-get install -y libpng-dev libjpeg-dev libfreetype6-dev \
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include --with-jpeg-dir=/usr/include/jpeg \
&& docker-php-ext-install gd mysqli opcache pdo_mysql gd zip
ENV PHPREDIS_VERSION 4.0.1
ENV PHPXDEBUG_VERSION 2.6.0
ENV PHPSWOOLE_VERSION 4.2.13
ENV PHPMONGODB_VERSION 1.5.3
RUN pecl install redis-$PHPREDIS_VERSION \
&& pecl install xdebug-$PHPXDEBUG_VERSION \
&& pecl install swoole-$PHPSWOOLE_VERSION \
&& pecl install mongodb-$PHPMONGODB_VERSION \
&& docker-php-ext-enable redis xdebug swoole mongodb
# install composer new
# https://getcomposer.org/installer | https://install.phpcomposer.com/installer
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \
&& php composer-setup.php \
&& php -r "unlink('composer-setup.php');" \
&& mv composer.phar /usr/local/bin/composer \
&& composer config -g repo.packagist composer https://packagist.laravel-china.org
RUN apt-get install -y git
# clear
RUN rm -rf /var/cache/apt/* \
&& rm -rf /var/lib/apt/lists/*
RUN mkdir /var/lib/sessions \
&& chmod o=rwx -R /var/lib/sessions
#容器启动时执行指令
CMD ["php-fpm"]
Nginx Dockerfile
From nginx:1.15.5
#维护者信息
MAINTAINER zhangdeTalk [email protected]
#时区
ENV TZ Asia/Shanghai
RUN date -R
#容器启动时执行指令
CMD ["nginx", "-g", "daemon off;"]
Mysql Dockerfile
From mysql:8.0.18
#维护者信息
MAINTAINER zhangdeTalk [email protected]
#时区
ENV TZ Asia/Shanghai
RUN date -R
#容器启动时执行指令
CMD ["mysqld"]
Redis Dockerfile
From redis:5.0.5
#维护者信息
MAINTAINER zhangdeTalk [email protected]
#时区
ENV TZ Asia/Shanghai
RUN date -R
#容器启动时执行指令
CMD ["redis-server"]
dockerfile.yml配置
version: '3.3'
services:
nginx:
build: ../dockerfile/nginx-1.15.5
ports:
- "80:80" #nginx
restart: always
tty: true
container_name: nginx
volumes:
- /data/www:/var/www/html
- /data/logs/nginx:/var/log/nginx
- /data/docker/config/nginx/conf.d:/etc/nginx/conf.d
- /data/docker/config/nginx/nginx.conf:/etc/nginx/nginx.conf
- /etc/letsencrypt:/etc/letsencrypt
networks:
- lnmp-networks
php7:
build: ../dockerfile/php-7.2-fpm
tty: true
restart: always
container_name: php7
volumes:
- /data/www:/var/www/html
- /data/logs/php:/var/log/php
- /data/docker/config/php/php.ini:/usr/local/etc/php/php.ini
- /data/docker/config/php/www.conf:/usr/local/etc/php-fpm.d/www.conf
depends_on:
- nginx
networks:
- lnmp-networks
redis:
build: ../dockerfile/redis-5.0.5
container_name: redis
tty: true
restart: always
volumes:
- /data/docker/config/redis/redis.conf:/etc/redis/redis.conf
- /data/redis:/var/lib/redis
- /data/logs/redis:/var/log/redis
networks:
- lnmp-networks
mysql:
build: ../dockerfile/mysql-8.0.18
container_name: mysql
tty: true
restart: always
ports:
- "3306:3306" #mysql
volumes:
- /data/mysql:/var/lib/mysql
- /data/docker/config/mysql/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf
- /data/logs/mysql:/var/log/mysql
- /data/mysqlback:/data/mysqlback
environment:
MYSQL_ROOT_PASSWORD: root
networks:
- lnmp-networks
networks:
lnmp-networks:
Nginx配置文件
vim /data/docker/config/nginx/conf.d/default.conf
server {
listen 80;
listen [::]:80;
# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html index.php;
charset utf-8;
server_name zhangdetalk.com www.zhangdetalk.com;
location ~ \.md$ {
default_type 'text/plain';
}
root /var/www/html/zhangdetalk_blog_admin;//项目目录
location / {
#try_files $uri $uri/ =404;
index index.php index.htm index.html;
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=$1 last;
break;
}
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_index index.php;
fastcgi_pass php7:9000;//容器:端口号
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
docker-compose安装
1. curl -L https://get.daocloud.io/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
2. chmod +x /usr/local/bin/docker-compose //设置可执行权限
创建并启动容器
docker-compose -f docker-compose-linux.yml up -d --force-recreate --remove-orphans
docker ps
vim /data/www/zhangdetalk_blog_admin/index.php
<?php
echo "Hello World";
$conn = mysqli_connect('数据库容器名字','dbuser','dbpw');
if($conn){
echo '数据库连接成功!';
}else{
echo '数据库连接失败!';
}
phpinfo();
?>
通过访问站点:http://www.zhangdetalk.com/
可以看到显示数据库连接成功,并打印出PHP的相关信息
到此步,我们的lnmp环境搭建大功告成!
github源码
相关的源码下载地址:https://github.com/zhangdejian/docker_lnmp.git
遇到的问题
1、PHP代码连接数据库,host不能写成127.0.0.1或localhost,需要填写数据库容器名字
2、mysql8连接,连接失败,因为加密方式有变化
解决方式:主机登录mysql,修改成旧的加密方式(mysql_native_password),并重置密码
* mysql -uroot -p;
* use mysql;
* select host,user,plugin from user;
* alter user 'root'@'%' identified with mysql_native_password by '123456';
可参考这篇文章:Docker 安装 MySQL8.0
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK