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通讯
- 使用link来通讯。在上面创建容器的命令中,加入 --link qmysql:qmysql
- 使用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即可 - 访问宿主机,再通过端口进入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 //查看错误日志