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 //查看错误日志

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,753评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,668评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,090评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,010评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,054评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,806评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,484评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,380评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,873评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,021评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,158评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,838评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,499评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,044评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,159评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,449评论 3 374
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,136评论 2 356

推荐阅读更多精彩内容

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