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系统下
- 下载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
- 改变文件属性为可执行
$ 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.conf
nginx配置文件,映射到容器的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
如果没打开,需要打开:
- 编辑配置文件
vim /etc/sysctl.conf
- 增加
net.ipv4.ip_forward=1
- 重启服务
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的首页设置具有重定向作用