现在容器化技术越来越成熟和流行,相对于传统的虚拟化技术确实有很大的优势,流行是必然的。今天来实践一下,使用Docker的dockerfile方式自定义lnmp环境。环境配置操作系统:CentOSLinuxrelease7.6.1810Docker版本:19.03.5Nginx版本:1.15.5PHP版本:7.2.26MySQL版本:8.0.18Redis版本:5.0.5创建目录结构docker目录://docker相关配置[root@zhangdeTalkdata]#treedockerdocker├──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//phpdockerfile│└──redis-5.0.5│└──Dockerfile//redisdockerfile├──README.en.md└──README.mdwwwdirectory://sitedirectory[root@zhangdeTalkdata]#treewwwwww└──zhangdetalk_blog_admin├──1.html└──index.phplogs目录://日志目录[root@zhangdeTalkdata]#treelogslogs├──mysql├──nginx│├──access.log│└──error.log├──php└──redismysql目录://数据库数据目录redis目录://数据库数据目录Docker安装先在CentOS上安装Docker,参考另一篇文章:在CentOS上安装Docker构建lnmp镜像DockerfilePHPDockerfileFromphp:7.2-fpm#MaintainerinformationMAINTAINERzhangdeTalk2393222021@qq.com#TimezoneENVTZAsia/ShanghaiRUNdate-R#RUNdocker-php-ext-installbcmathdomfileinfofilterftpgdgmphashiconvimapjsonmbstringmysqliodbcopcachepdopdo_mysqlpdo_odbcphar反射会话snmpsoapsocketszip#RUNdocker-php-ext-installmysqliopcachepdo_mysqlWORKDIR/workingRUNapt-getupdate--fix-missinginst&&aptylibpng-开发libjpeg-devlibfreetype6-dev\&&docker-php-ext-configuregd--with-freetype-dir=/usr/include--with-jpeg-dir=/usr/include/jpeg\&&docker-php-ext-安装gdmysqliopcachepdo_mysqlgdzipENVPHPREDIS_VERSION4.0.1ENVPHPXDEBUG_VERSION2.6.0ENVPHPSWOOLE_VERSION4.2.13ENVPHPMONGODB_VERSION1.5.3RUNpeclinstallredis-$PHPREDIS_VERSION\&&pecl安装xdebug-$PHPXDEBUG_VERSION\&&pecl安装swoole-$PHPSWOOLE_VERSION\&&pecl安装mongodb-$PHPMONGODB_VERSION\&&docker-php-ext-enableredisxdebugswoolemongodb#installcomposernew#https://getcomposer.org/installer|https://install.phpcomposer.com/installerRUNphp-r"copy('https://getcomposer.org/installer','composer-setup.php');"\&&phpcomposer-setup.php\&&php-r"unlink('composer-setup.php');"\&&mvcomposer.phar/usr/local/bin/composer\&&composerconfig-grepo.packagistcomposerhttps://packagist.laravel-china.orgRUNapt-getinstall-ygit#clearRUNrm-rf/var/cache/apt/*\&&rm-rf/var/lib/apt/lists/*RUNmkdir/var/lib/sessions\&&chmodo=rwx-R/var/lib/sessions#容器启动时间执行命令CMD["php-fpm"]NginxDockerfileFromnginx:1.15.5#维护者信息MAINTAINERzhangdeTalk2393222021@qq.com#时区ENVTZAsia/ShanghaiRUNdate-R#容器启动时执行命令CMD["nginx","-g","daemonoff;"]MysqlDockerfileFrommysql:8.0.18#MaintainerinformationMAINTAINERzhangdeTalk2393222021@qq.com#TimezoneENVTZAsia/ShanghaiRUNdate-R#容器启动时执行命令CMD["mysqld"]RedisDockerfileFromredis:5.0.5#MaintainerinformationMAINTAINERzhangdeTalk2393222021@qq.com#TimezoneENVTZAsia/ShanghaiRUNdate-R#容器启动时执行命令CMD["redis-server"]dockerfile.yml配置version:'3.3'services:nginx:build:../dockerfile/nginx-1.15.5ports:-"80:80"#nginxrestart:始终tty:truecontainer_name:nginxvolumes:-/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/letsencryptnetworks:-lnmp-networksphp7:build:../dockerfile/php-7.2-fpmtty:truerestart:alwayscontainer_name:php7volumes:-/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.confdepends_on:-nginxnetworks:-lnmp-networksredis:build:../dockerfile/redis-5.0.5container_name:redistty:truerestart:alwaysvolumes:-/data/docker/config/redis/redis.conf:/etc/redis/redis.conf-/data/redis:/var/lib/redis-/data/logs/redis:/var/log/redisnetworks:-lnmp-networksmysql:build:../dockerfile/mysql-8.0.18container_name:mysqltty:truerestart:alwaysports:-"3306:3306"#mysqlvolumes:-/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环境:MYSQL_ROOT_PASSWORD:rootnetworks:-lnmp-networksnetworks:lnmp-networks:Nginx配置文件vim/data/docker/config/nginx/conf.d/default.confserver{听80;听[::]:80;#如果您使用的是PHP索引,请将index.php添加到列表中index.htmlindex.htmindex.nginx-debian.htmlindex.php;字符集utf-8;server_namezhangdetalk.comwww.zhangdetalk.com;位置~\.md${default_type'text/plain';}root/var/www/html/zhangdetalk_blog_admin;//项目目录location/{#try_files$uri$uri/=404;indexindex.phpindex.htmindex.html;if(!-e$request_filename){重写^(.*)$/index.php?s=$1最后;休息;}}location~\.php${包括fastcgi_params;fastcgi_indexindex.php;fastcgi_passphp7:9000;//容器:端口号fastcgi_paramSCRIPT_FILENAME$document_root$fastcgi_script_name;}}docker-compose安装1.curl-Lhttps://get.daocloud.io/docker/compose/releases/download/1.22.0/docker-compose-`uname-s`-`uname-m`>/usr/local/bin/docker-compose2.chmod+x/usr/local/bin/docker-compose//设置可执行权限创建并启动容器docker-compose-fdocker-compose-linux.ymlup-d--force-recreate--remove-orphans容器视图dockerpstestvim/data/www/zhangdetalk_blog_admin/index.php访问站点:http://www.zhangdetalk.com/,可以看到数据库连接成功,并打印出PHP的相关信息。至此,我们的lnmp环境搭建完成!github源码相关的源码下载地址:https://github.com/zhangdejian/docker_lnmp.git遇到的问题1.PHP代码连接数据库。host不能写成127.0.0.1或者localhost,需要填写数据库容器的名字。2.mysql8连接,连接失败,因为加密方式改变了解决方法:host登录mysql,改为旧的加密方法(mysql_native_password),并重置密码*mysql-uroot-p;*使用mysql;*selecthost,user,pluginfromuser;*alteruser'root'@'%'identifiedwithmysql_native_passwordby'123456';请参考这篇文章:Docker安装MySQL8.0
