使用docker安装nginx与php

0. 环境

系统:centos 7

1. 安装 docker

docker是一种容器引擎,是应用程序与系统之间的隔离层,可以理解为轻量级的虚拟机。但不同于虚拟机,一般一个docker容器跑一个服务,比如nginx一个容器,php另一个容器。

名词解释:

  • docker – 容器引擎
  • 镜像 – 应用程序及其环境,如nginx镜像
  • 容器 – 镜像的运行实例,与镜像的关系类似于可执行文件与进程,镜像是可执行文件,实例是容器

简单地类比一下,镜像类似于可执行文件,容器类似于进程,Docker后台/客户端相当于系统平台,管理镜像与容器。

$ yum install docker

2. 安装 dockers-compose

如果有很多个服务,用docker命令一个个去执行管理很麻烦,docker-compose是一个docker命令的批处理工具。可以把要执行的命令写在一个yml文件中,然后由docker-compose读取执行。

在centos系统下

  1. 下载docker-compose
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  1. 改变文件属性为可执行
$ sudo chmod +x /usr/local/bin/docker-compose

3. 宿主机的部署目录结构

我们会把项目文件及配置文件放在宿主机的部署目录(/deploy),然后再映射到容器中的目录。

  • /deploy – 根目录下创建一个deploy目录放置部署文件
    • docker-compose.yml – docker-compose配置文件
    • conf
    • conf.d – nginx server配置文件,映射到容器的nginx服务器配置目录
    • log – 日志,映射到容器中的日志目录
    • site – 项目目录
    • dockerfile – 放置各个镜像的dockerfile

4. 配置 dockers-compose.yml文件

/deploy目录下创建docker-compose.yml配置文件:

version: '3'
services:
 # nginx 服务
 nginx:
  # 推荐使用官方镜像
  image: nginx:latest
  # 映射端口,把容器端口映射到宿主机对外接口,格式:对外端口:容器端口
  ports:
  - "80:80"
  - "443:443"
  # 映射目录,把宿主机目录映射到容器目录,格式:宿主机目录:容器目录,z是selinux标志
  volumes:
  - ./conf/conf.d:/etc/nginx/conf.d:z
  - ./log:/var/log/nginx:z
  - ./site:/site:z
  - /etc/letsencrypt:/etc/letsencrypt:z
  # 所依赖的服务,php会先启动
  depends_on:
  - php

 # php 服务
 php:
  # 官方镜像
  image: php:7-fpm
  volumes:
  - ./site:/site:z

如有不清楚,请看注释。

此处php使用的是官方镜像,有些扩展模块没有添加(如mysqli),如需添加可参考后面内容。

docker-compose详情可参考:docker-compose官方文档

7. 配置nginx

/deploy/conf/conf.d下添加qikegu.confnginx配置文件,映射到容器的nginx服务器配置目录下


# http server { charset utf-8; client_max_body_size 200M; listen 80; ## listen for ipv4; this line is default and implied #listen [::]:80 default ipv6only=on; ## listen for ipv6 # Make site accessible from http://localhost/ server_name qikegu.com www.qikegu.com; root /site/qikegu; index index.html index.htm index.php; access_log /var/log/nginx/qikegu/access.log; error_log /var/log/nginx/qikegu/error.log; location / { # First attempt to serve request as file, then try_files $uri $uri/ /index.php$is_args$args; } # deny accessing php files for the /assets directory location ~ ^/assets/.*\.php$ { deny all; } location ~ \.php$ { try_files $uri =404; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_pass php:9000; #fastcgi_pass unix:/var/run/php5-fpm.sock; } location ~* /\. { deny all; } }

6. 运行

先确保docker服务已经运行:

$ sudo service docker start

运行docker-compose,切换到docker-compose.yml所在的目录(/deploy)执行

$ sudo docker-compose up -d

会自动下载镜像,然后运行服务实例。如果成功,就可以在浏览器中访问服务器。

* 要注意的地方

无法从外部访问

查看net.ipv4.ip_forward是否打开(net.ipv4.ip_forward = 1):

# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1

如果没打开,需要打开:

  1. 编辑配置文件vim /etc/sysctl.conf
  2. 增加net.ipv4.ip_forward=1
  3. 重启服务systemctl restart network

php 添加扩展模块

上面的docker-compose.yml文件中的php镜像是官方镜像,有些扩展模块没有添加(如mysqli),以mysqli为例,可以通过以下配置添加


... # php 服务 php: #image: php:7-fpm # 从dockerfile创建镜像 build: # 指定dockerfile所在目录 context: ./dockerfile # 指定php的dockerfile dockerfile: php volumes: - ./site:/site:z

/deploy/dockerfile/下添加php的dockerfile(名称:php),用于生成php镜像

# 基于官方镜像
FROM php:7-fpm
# 安装mysqli模块,并enable
RUN docker-php-ext-install mysqli && docker-php-ext-enable mysqli

运行 docker-compose 即可。

注意: wordpress的首页设置具有重定向作用


评论