docker-compose使用nginx+php+mysql+redis部署fastadmin
有错误请指出,相互沟通学习
零、说明
1、个人理解
docker以images镜像和containers容器两个模块为主。容器就像镜像的孩子,父节点镜像可以生成多个不同的容器,分别用于不同的项目容器间互不影响。可以将自己配置好的容器打包成镜像,推送的docker Hub,随时随地可用。
数据持久化问题,通过卷Volumes(参数-v)实现,可以映射到本地自定义路径。
容器互联问题,通过network网络组实现,每个容器选择自己要联通的网络。
2、安装docker Desktop 桌面应用挺方便的,方便查看,一键启动,自带docker-compose,不用单独安装了
官方地址: https://www.docker.com/products/docker-desktop
一、环境配置
1.大概目录结构
2.docker-compose.yml文件内容
version: '3.8' #指定本yml的compose架构版本 #参考: compose搭建lnmp环境 https://blog.csdn.net/csdn_yasin/article/details/123084702 #参考: compose项目 http://t.zoukankan.com/JetpropelledSnake-p-10405114.html #启动: $ docker-compose -p fastadmin up -d # -p指定项目名称 -d表示后台启动 #php配置及扩展官方说明: https://hub.docker.com/_/php?tab=description networks: #网络组,允许相同组内的每个容器之间相互请求联通 frontend: backend: services: #定义服务的入口和镜像 nginx1_20: #image镜像服务的自定义别名 container_name: nginx1_20 #自定义容器名 #image: nginx:latest #使用本地的指定镜像构建,如果本地没有就从docker官方下载远程镜像 build: #指定使用Dockerfile文件构建镜像 context: ./nginx #可以是dockerfile的路径,或者是指向git仓库的url地址 dockerfile: Dockerfile #构建镜像上下文路径 #target: dev #多层构建,可以指定构建哪一层,指定dev层构建 #args: #添加构建参数,只能在构建过程中访问的环境变量 # buildno: 1 #labels: 设置构建镜像的标签 # - "com.example.description=Accounting webapp" # - "com.example.department=Finance" # - "com.example.label-with-empty-value" #command: sh -c "yarn install && yarn run dev" #执行命令,覆盖容器启动后默认执行的命令 #working_dir: /app #工作目录 ports: #指定运行端口 - "8000:80" volumes: #将本地主机的文件或目录挂载到容器需要的位置,建立映射关系,ro只读,rw可读写 #- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro - ./nginx/conf:/etc/nginx/conf.d - ./code:/var/www # ./code为本地代码路径,/var/www为docker中的项目根目录 - ./nginx/log/:/var/log/nginx/:rw depends_on: #依赖项,必须先加载的容器 - "php7_1" networks: # 定义当前容器所属网络组 - frontend #volumes_from: 从另一个服务或容器挂载卷,可选参数:ro和:rw #hostname 容器主机名 php7_1: container_name: php7_1 # image: php:7.4.30-fpm build: ./php71 #fastadmin目前只支持7.1版本 ports: - "8001:9000" volumes: - ./code:/var/www # 项目根目录 - ./php71/etc/:/usr/local/etc/:rw #必须加上rw参数,否则docker没有写权限,配置文件不会自动创建。 #- ./php74/php-fpm.conf:/usr/local/etc/php-fpm.conf #- ./php74/php.ini:/usr/local/etc/php/php.ini #- ./php74/php-fpm.d:/usr/local/etc/php-fpm.d #- ./php74/crontab:/etc/crontab #扩展目录 /usr/local/lib/php/extensions/no-debug-non-zts-20160303 # 初始化扩展列表 /usr/src/php/ext 必须执行“docker-php-source extract”后才有 #- /Users/wyb/Sites/docker/php1/php74/php-fpm.conf:/usr/local/etc/php-fpm.conf networks: - frontend - backend depends_on: - "mysql5_7" - "redis6_2" mysql5_7: container_name: mysql5_7 #image: mysql:5.7.38 build: ./mysql57 ports: - "8002:3306" volumes: - ./mysql57/data/:/var/lib/mysql/:rw #- ./mysql/my.cnf:/etc/mysql/my.cnf:ro environment: #环境变量定义 MYSQL_ROOT_PASSWORD: root networks: - backend redis6_2: container_name: redis6_2 build: ./redis ports: - "8003:6379" volumes: #- ./redis/redis.conf:/etc/redis/redis.conf:ro - ./redis/conf:/usr/local/etc/redis - ./redis/data:/data networks: - backend
3.相关Dockerfile文件
除了php需要安装响应的扩展,其它dockerfile都比较简单(没必要非用dockerfile,直接compose中用images参数就行)。
./redis/Dockerfile ⬇️
FROM redis:6.2.6 MAINTAINER wyb<2216244671@qq.com>
./php71/Dockerfile ⬇️
1 FROM php:7.1.33-fpm 2 3 #MAINTAINER wyb<2216244671@qq.com> 这里定义作者信息,此将被废弃,使用label替换 4 LABEL org.opencontainers.image.authors="2216244671@qq.com" 5 6 RUN apt-get update && apt-get install -y --no-install-recommends libpng-dev \ 7 libjpeg62-turbo-dev \ 8 libfreetype6-dev \ 9 libmcrypt-dev \ 10 #freetype-dev \ 11 #postgresql-dev \ 12 #cron \ 13 # memcached 14 # libmemcached-dev \ 15 # zlib-dev \ 16 # curl-dev \ 17 && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ -with-jpeg-dir=/usr/include/ \ 18 && docker-php-ext-install -j$(nproc) iconv mcrypt gd pdo pdo_mysql zip \ 19 && pecl install redis-5.1.1 \ 20 && pecl install xdebug-2.8.1 \ 21 && docker-php-ext-enable redis xdebug \ 22 && docker-php-source extract 23 # && pecl install memcached-"$PHPMECCACHED_VERSION" \ 24 # && docker-php-ext-enable memcached 25 26 # 修改php.ini配置, 将当前目录下的./conf.d/error.ini文件,复制到docker容器中的/usr...目录下 27 COPY ./conf.d/error.ini /usr/local/etc/php/conf.d 28 29 30 # 其它扩展安装示例 31 #RUN curl -fsSL 'https://xcache.lighttpd.net/pub/Releases/3.2.0/xcache-3.2.0.tar.gz' -O xcache.tar.gz \ 32 # && mkdir -p xcache \ 33 # && tar -xf xcache.tar.gz -C xcache --strip-components=1 \ 34 # && rm xcache.tar.gz \ 35 # && ( \ 36 # cd xcache \ 37 # && phpize \ 38 # && ./configure --enable-xcache \ 39 # && make -j$(nproc) \ 40 # && make install \ 41 # ) \ 42 # && rm -r xcache \ 43 # && docker-php-ext-enable xcache 44 45 #RUN cd /usr/local/etc/php/conf.d vi upload.ini 46 #upload_max_filesize=100M
./nginx/Dockerfile ⬇️
FROM nginx:1.20.2 MAINTAINER wyb<2216244671@qq.com>
./mysql57/Dockerfile ⬇️
FROM mysql:5.7.38 MAINTAINER wyb<2216244671@qq.com>
4.其它配置文件
PHP自定义配置文件 ./php71/conf.d/error.ini
log_errors = On error_log = /usr/local/etc/php/log/php_error.log error_reporting=E_ALL&~E_NOTICE error_reporting=E_ALL & ~E_DEPRECATED & ~E_STRICT
redis配置文件 .redis/conf/redis.conf
port 6379 bind 0.0.0.0
nginx虚拟主机域名配置文件 ./nginx/conf/default.conf
1 server { 2 listen 80; 3 server_name test.fastadmin.org; 4 index index.php index.html index.htm default.php default.htm default.html; 5 root /var/www/fastadmin/public; 6 7 location / { 8 index index.html index.htm index.php; 9 if (!-e $request_filename) { 10 rewrite ^(.*)$ /index.php?s=/$1 last; 11 break; 12 } 13 #autoindex on; 14 } 15 location ~ \.php(.*)$ { 16 fastcgi_pass php7_1:9000; #注意这里不是127.0.0.1之类的ip了,因为是docker容器之间互联,所以compose中定义了networks,这里直接使用容器名即可。 17 fastcgi_index index.php; 18 fastcgi_split_path_info ^((?U).+\.php)(/?.+)$; 19 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 20 fastcgi_param PATH_INFO $fastcgi_path_info; 21 fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; 22 include fastcgi_params; 23 } 24 25 26 location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md) 27 { 28 return 404; 29 } 30 31 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ 32 { 33 expires 30d; 34 error_log off; 35 access_log off; 36 } 37 38 location ~ .*\.(js|css)?$ 39 { 40 expires 12h; 41 error_log off; 42 access_log off; 43 } 44 45 }
二、fastadmin项目部署
1、构建并启动
第一步完成后,进入的docker-compose.yml文件所在目录下,终端执行下面命令,即可构建images,并启动对应的四个容器。
# 运行当前yml配置 -p fastadmin指定项目名称; -d表示后台启动 $ docker-compose -p fastadmin up -d
2、测试代码
按照nginx配置文件中的路径,以及docker-compose中的映射地址,将代码包放在对应目录下即可。
本项目中nginx配置访问root是:/var/www/fastadmin/public
docker-compose中的映射地址是:./code:/var/www
即代码入口文件在本机docker-compose.yml同级目录 ./code/fastadmin/public/ 中
增加测试PHP代码:./code/fastadmin/public/test.php
<?php // redis 测试 $redis = new Redis(); $redis->connect('redis6_2',6379); echo "redis is running: ".$redis->ping(); echo '-------------------<br>'; // mysql测试 docker新键的数据库中,需要自行新建数据库和表,这里已创建fastadmin库 // 连接的host要注意,与./nginx/default.conf中的php连接一样,不是ip,是docker-compose中配置的容器名,container_name try { $conn = new PDO('mysql:host=mysql5_7;dbname=fastadmin;port=3306', 'user', 'password'); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);// 设置 PDO // $conn->exec("CREATE TABLE if not exists author (id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,name VARCHAR(30) NOT NULL,lastname VARCHAR(30) NOT NULL,email VARCHAR(50))"); // 创建表 // $ret = $conn->exec("insert into author (name,lastname,email) values ('亚历山大','a','123@123.com')"); // foreach($conn->query('SELECT * from book',PDO::FETCH_ASSOC) as $row) { // print_r($row); // } $sth = $conn->prepare("SELECT * FROM author limit 0,2"); $sth->execute(); $result = $sth->fetchAll(PDO::FETCH_ASSOC); print_r($result); $conn = null;//关闭连接 } catch (PDOException $e) { print "Error!: " . $e->getMessage() . "<br/>"; die(); }
3、访问,
按照docker-compose.yml中的配置,nginx配置了端口映射 8000:80,本机的8000端口映射到docker中的80端口,所以本机访问地址为:http://localhost:8000/test.php
访问成功则说明配置没有问题了,将fastadmin项目代码放在 ./code/fastadmin/ 目录中即可
自定义域名的话,同时修改本机hosts文件即可。