Docker Php+Nginx+Mysql 安装部署

PHP容器

一、构建Dockerfile、配置php镜像
  • 也可以不使用,直接拉取官方php镜像
FROM php:7.3-fpm
MAINTAINER Qhs

ENV TZ=Asia/Shanghai

#更改国内镜像
RUN mv /etc/apt/sources.list /etc/apt/sources.list.bak \
    && echo 'deb http://mirrors.aliyun.com/debian/ buster main non-free contrib' > /etc/apt/sources.list \
    && echo 'deb http://mirrors.aliyun.com/debian-security buster/updates main' >> /etc/apt/sources.list \
    && echo 'deb http://mirrors.aliyun.com/debian/ buster-updates main non-free contrib' >> /etc/apt/sources.list \
    && echo 'deb http://mirrors.aliyun.com/debian/ buster-backports main non-free contrib' >> /etc/apt/sources.list \
    && echo "构建依赖" \
    && set -xe \
    && buildDeps=" \
        libmemcached-dev \
        zlib1g-dev \
        libfreetype6-dev \
        libjpeg62-turbo-dev \
        libmcrypt-dev \
        libpng-dev \
        libzip-dev \
    " \
    && echo "安装php以及编译构建组件所需包" \
    && DEBIAN_FRONTEND=noninteractive \
    && apt-get update \
    && apt-get install -y  --no-install-recommends ${buildDeps} \
    && docker-php-ext-install -j$(nproc) bcmath calendar exif gettext sockets dba mysqli pcntl pdo_mysql shmop sysvmsg sysvsem sysvshm zip\
    && docker-php-ext-configure gd \
        --with-freetype-dir=/usr/include/ \
        --with-jpeg-dir=/usr/include/ \ 
        --with-png-dir=/usr/include/ \
        --with-zlib-dir=/usr \
    && docker-php-ext-install gd \
    && echo "清理" \
    && rm -rf /var/lib/apt/lists/* 

# 镜像信息
LABEL Author="Qhs"
LABEL Version="v1.0.0"
LABEL Description="Qhs"

在Dockerfile文件所在的目录下,执行以下命令

sudo docker build -t qphp:v1.0.0 .

注意命令最后有一个点,代表当前目录
如果执行结果最后出现下列success提示,表示构建成功

Successfully built xxxxxxxxxx
Successfully tagged qphp:v1.0.0

使用docker images 查看镜像,查看是否名为qphp,tag为v1.0.0的镜像。
如果build不成功时,用RUN来分割,看下到底是哪个地方的命令出现错误。

二、创建PHP容器
  • 备份PHP配置文件。
    在宿主机 $PWD/work 目录下,建立www(php文件)、log(日志信息)、etc(配置文件) 目录。
#备份配置文件。备份后删除
docker run --name qphp -d qphp:v1.0.0
docker cp qphp:/usr/local/etc $PWD/work/etc/php
docker rm -f qphp
  • 正式创建PHP容器
#正式创建php容器
docker run --name qphp -p 9000:9000  --privileged  -v $PWD/work/www:/var/www/html -v $PWD/work/etc/php:/usr/local/etc  -v $PWD/work/log/php:/var/log/php -d qphp:v1.0.0

1、指定容器名为qphp
2、将9000端口转到宿主机9000端口
3、挂载www、etc、log 目录到宿主机的指定目录

通过docker-php-ext-install安装php拓展
以安装redis为例

1,进入容器
    $ docker exec -it qphp bash
2,下载拓展到指定目录
    $ curl -L -o /tmp/reids.tar.gz https://codeload.github.com/phpredis/phpredis/tar.gz/5.0.2
3,解压拓展
    $ cd /tmp
    $ tar -xzf reids.tar.gz
4, 运行docker-php-source ,创建并初始化 /usr/src/php目录
    $ docker-php-source extract 
5,将解压到文件转移到php目录中
    $ mv phpredis-5.0.2 /usr/src/php/ext/phpredis
6,检查文件是否存在
    $ ls -l /usr/src/php/ext | grep redis
7,运行docker-php-ext-install ,安装插件
    $ docker-php-ext-install phpredis
8,检查是否已经安装
    $ php -m | grep redis

卸载扩展,直接删除/usr/local/etc/php/conf.d 对应的配置文件即可

Nginx容器

  • 拉取nginx镜像
$ docker pull nginx
  • 备份 nginx 的配置文件
 //将文件copy到宿主机的工作目录中,再删除此容器
$ docker run --name  qnginx -d nginx
$ docker cp qnginx:/etc/nginx $PWD/work/etc/nginx
$ docker rm -f qnginx   
  • 启动nginx容器
docker run --name qnginx -p 80:80 --link qphp:qphp-fpm  -v $PWD/work/www:/usr/share/nginx/html -v $PWD/work/etc/nginx:/etc/nginx -v $PWD/work/log/nginx:/var/log/nginx  -d  nginx

1、指定容器名为qnginx
2、将容器80端口转到宿主机80端口
3、挂载www、etc、log 目录到宿主机的指定目录
4、--link A:B 用来连接两个容器,使两个容器之间可以互相通讯,接收容器可以使用源容器的环境变量等。其中A是源容器,B是别名,当前nginx容器为接收容器。

  • 配置文件
#修改nginx的配置文件
location ~ \.php(/|$) {
        fastcgi_pass   qphp-fpm:9000;//此处使用上面的别名。不建议使用ip,因为ip重启可能会变更
        fastcgi_index  index.php;
        fastcgi_split_path_info ^(.+\.php)(.*)$;
        fastcgi_param  SCRIPT_FILENAME  /var/www/html/xxxxxxxxx$fastcgi_script_name;
        fastcgi_param  SCRIPT_NAME      $fastcgi_script_name;
        
        fastcgi_param  PATH_INFO $fastcgi_path_info;
        fastcgi_param  PATH_TRANSLATED /var/www/html/xxxxxxxxx$fastcgi_path_info;
        include        fastcgi_params;
    }
#xxxxxxxxx为具体项目目录,使用时注意修改

Mysql容器

  • 拉取Mysql镜像
$ docker pull mysql
  • 创建启动Mysql容器
docker run  --name qmysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root   -di mysql

1、指定容器名为qmysql
2、将容器3306端口指到宿主机3306端口

  • 检查是否创建成功
    使用 docker ps 命令,如果有NAMES为qmysql的容器,表示已经启动。
    如果没有看到,可以使用 docker log qmysql 命令来查看错误日志。
    根据提示信息,修改后,docker rm qmysql 删除刚刚的容器,重新创建。

  • 配置Mysql

1,进入mysql容器
  $ docker exec -it qmysql bash
2,进入mysql中
  $ mysql -uroot -proot;
3,查看mysql版本
  $ status;
4,授权远程连接
  $ GRANT ALL ON *.* TO  'root'@'%';
5,刷新
  $ flush privileges;
6,更改加密规则
  $ ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;
7,修改root密码
  $ ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
8,刷新
  $ flush privileges;
9,至此,配置msyql完成。退出mysql,退出容器
  $ exit; 

补充:如果需要搭建指定版本的mysql,拉取的时候带上版本号,docker pull mysql:5.x ,并且使用该镜像启动容器,5.x在容器内只需要授权远程连接,不用修改加密规则就可以了。

与mysql通讯
  1. 使用link来通讯。在上面创建容器的命令中,加入 --link qmysql:qmysql
  2. 使用IP地址
    2.1、使用命令,docker exec qnginx env 来查看环境变量。此信息在源容器重启后不会自动更新。
    2.2、使用命令,docker exec -it qnginx cat /etc/hosts 获取接收容器/ect/hosts中的配置信息。此信息会自动更新。
    2.3、使用上面查询出来的mysql的ip地址,即可访问。
    例如:mysql容器IP为172.17.0.4,后续连接为172.17.0.4即可
  3. 访问宿主机,再通过端口进入mysql
    3.1、 mac for docker 18.03 版本后可以用 host.docker.internal 来访问。只能用于mac,不可用于开发环境。

应该还有其他方式,用到再说。

Docker 简单操作
docker start qphp qnginx //容器启动,注意顺序,如果有link,最后启动
docker restart qphp //容器重启
docker stop qphp //容器停止
docker ps -a //查看所有容器
docker images //查看所有镜像
docker rm qphp //删除容器
docker rmi php //删除镜像
docker exec -it qphp bash //进入容器
docker exec qnginx env //查看容器环境变量
docker log qmysql //查看错误日志

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • docker基本概念 1. Image Definition 镜像 Image 就是一堆只读层 read-only...
    慢清尘阅读 9,102评论 1赞 21
  • Docker 学习目标: 掌握Docker基础知识,能够理解Docker镜像与容器的概念 完成Docker安装与启...
    执笔梦一场阅读 3,551评论 2赞 10
  • 原文地址:https://github.com/KeKe-Li/docker-directive docker 存...
    萌面菠萝阅读 599评论 0赞 0
  • 最近6天,儿子迟到2次,有3次是踩着铃声进的教室。 每天早上,我都头疼。 6:50喊一次,7:0...
    海边的风铃2008阅读 686评论 1赞 8
  • 亲爱的宝贝儿: 你长这么大以来,妈妈第一次给你写信,也是你有生以来第一次离开家,离开学校,离开妈妈身边。参...
    一剪红梅阅读 31,245评论 6赞 14

友情链接更多精彩内容