CentOS下用docker生产环境

CentOS下用docker生产环境

Docker 是世界领先的软件容器平台。 开发者可以通过 Docker 解决协作时环境不一致的问题。 运维人员可以使用 Docker 在容器中运行和管理应用程序,以获得更好的计算密度。 企业可以使用 Docker 构建敏捷软件持续交付流程,更快,更安全,更可靠地为 Linux 和 Windows Server 上的应用程序提供新功能。本文总结了在CentOS环境下,如何通过docker搭建php开发环境。

生产环境要求

生产环境在腾讯云的云服务器CVM上,操作系统是CentOS 7.2
环境需求:

  • CentOS 7.2
  • php及相关扩展
  • nginx

服务器环境

项目 版本 说明
CentOS 7.2.1511 操作系统
docker 17.03.1-ce
yum-utils

容器环境

项目 版本 说明
CentOS 7.2.1511 操作系统
wget
gcc
gcc-c++
make
openssl-devel
zlib-devel
pcre-devel Perl库,包括 perl 兼容的正则表达式库
nginx rewrite伪静态匹配规则用到正则
curl
tar
passwd
php 7.0.19
php mcrypt扩展
php redis扩展
php thrift扩展 0.10.0 用于访问Thrift服务
nginx 1.10.2

docker安装

安装docker

1
$ yum install docker

安装完毕,查看当前的docker版本为1.12.6

1
2
$ docker -v
Docker version 1.12.6, build 3a094bd/1.12.6

目前最新的版本是17,通过yum安装的版本比较旧,下面先卸载老版本docker

1
$ yum remove docker docker-common container-selinux docker-selinux

安装新版本
安装yum-utils

1
$ yum install -y yum-utils

添加yum源

1
2
3
$ yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo

更新yum的包索引

1
$ yum makecache fast

安装docker

1
$ yum install -y docker-ce-17.03.1.ce*

可以看到当前的版本是17.03.1-ce

1
2
$ docker -v
Docker version 17.03.1-ce, build c6d412e

可以通过下面的命令列出可用的docker版本

1
$ yum list docker-ce.x86_64 --showduplicates |sort -r

启动docker服务,并将其设置为开机自动运行

1
2
$ service docker start
# chkconfig docker on

对于CentOS 7以上版本可以采用systemd语法

1
2
$ systemctl start docker
$ systemctl enable docker

可以通过如下命令查看docker运行状态和信息

1
2
$ docker info
$ service docker status

准备生产镜像

拉取CentOS镜像

centos

1
docker pull centos:7.2.1511

启动docker容器

1
docker run -i -t --name server centos:7.2.1511 /bin/bash

docker exec -i -t server /bin/bash

更新国内yum源(暂不执行)

更新前先备份原有CentOS-Base.repo文件

1
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak

阿里云的yum源

1
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

更新yum

1
yum makecache

安装epel-release扩展包更新包

1
yum install -y epel-release

安装常用命令

1
yum install -y gcc gcc-c++ make

passwd

1
yum install -y passwd

sshd

1
yum

wget

1
$ yum install -y wget

curl

1
$ yum install -y curl

tar

1
$ yum install -y tar

修改时区

1
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

PHP

计划安装php7.0.19版本

1
$ yum list php*

通过上面的命令,可以看到默认源上php的版本比较旧,需要添加新的源,这里添加webtatic的源
需要先安装epel-release

1
yum install -y epel-release

添加webtatic源

1
$ rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

安装php

1
$ yum install -y php70w

安装完成后查看php版本

1
2
3
4
$ php -v
PHP 7.0.19 (cli) (built: May 12 2017 21:01:27) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies

下载php源码

源代码方式安装php,源代码放在/usr/local/src

1
2
$ cd /usr/local/src
$ wget http://php.net/distributions/php-7.0.19.tar.gz

从php.net下载速度太慢,改为从国内镜像网站下载

1
wget http://cn2.php.net/distributions/php-7.0.19.tar.gz

解压缩源码

安装php的依赖包

1
2
3
4
5
6
7
8
yum install -y openssl-devel zlib-devel pcre-devel
yum install -y libxml2-devel
yum install -y libcurl-devel
yum install -y libpng-devel
yum install -y mcrypt
yum install -y libmcrypt-devel
yum install -y mhash
yum install -y mhash-devel

配置编译安装php

1
2
3
$ cd /usr/local/php-7.0.19
$ ./configure --prefix=/usr/local/php --enable-fpm --with-mysqli --with-openssl --with-pdo-mysql --enable-mbstring --with-curl --with-gd
$ make && make install

php配置文件初始化

初始化php.iniphp-fpm.confwww.conf文件

1
2
3
$ cp php.ini-production /usr/local/php/lib/php.ini
$ cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
$ cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf

修改php.ini

修改将php.ini文件中的配置项 cgi.fix_pathinfo 设置为 0

修改原因:如果文件不存在,则阻止 Nginx 将请求发送到后端的 PHP-FPM 模块,以避免遭受恶意脚本注入的攻击。

1
$ vi /usr/local/php/lib/php.ini

php.ini

1
cgi.fix_pathinfo=0

修改php-fpm.conf

设置/usr/local/php/etc/php-fpm.conf配置文件

1
$ vi /usr/local/php/etc/php-fpm.conf

php-fpm.conf

1
2
3
4
5
6
7
8
# 去掉分号,打开生成 pid 文件
pid = run/php-fpm.pid
# 去掉分号,打开记录错误日志文件
error_log = log/php-fpm.log
# 去掉分号,设置事件处理机制
events.mechanism = epoll

修改www.conf

设置连接池配置文件,设置/usr/local/etc/php-fpm.d/php-fpm.d目录下www.conf配置文件

1
vi /usr/local/php/etc/php-fpm.d/www.conf

www.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 设置运行的用户和组
user = php
group = php
# 修改listen = 127.0.0.1:9000
listen = 9000
# 设置允许访问的客户端IP
;listen.allowed_clients = 127.0.0.1
# 进程池设定,应该根据具体服务器软硬件环境,服务访问量,并结合压力测试得出合理值,一般PHP进程占内存20~30M,可结合剩余内存估算
pm = dynamic
# 初始值是5,改为50
pm.max_children = 50
# 2 -> 5
pm.start_servers = 5
# 1 -> 2
pm.min_spare_servers = 2
# 3 -> 8
pm.max_spare_servers = 8
# 打开访问日志
access.log = log/$pool.access.log

创建 fpm 运行用户

1
useradd -r -s /sbin/nologin php

创建 log 目录

如果未打开日志记录,则不需要

1
mkdir -p /usr/local/php/log

安装redis扩展

1
yum install -y autoconf
1
2
cd /usr/local/php/bin
./pecl install redis

执行成功后,会在扩展目录下生成redis.so,路径如下

1
/usr/local/php/lib/php/extensions/no-debug-non-zts-20151012/redis.so

在生效的 php.ini 文件中加入一行

1
2
vi /usr/local/php/lib/php.ini
extension=redis.so

安装thrift扩展

Thrift是Apache的一个开源的跨语言服务开发框架,它提供了一个代码生成引擎来构建服务,支持C++,Java,Python,PHP,Ruby,Erlang,Perl,Haskell,C#,Cocoa,JavaScript,Node.js,Smalltalk,OCaml,Delphi等多种编程语言。

下载Thrift的软件包,并解压缩

1
2
3
cd /usr/local/src
wget http://mirrors.cnnic.cn/apache/thrift/0.10.0/thrift-0.10.0.tar.gz
tar xvf thrift-0.10.0.tar.gz

配置、编译、安装Thrift

1
2
3
cd thrift-0.10.0
./configure
make && make install

报错:
Python.h: No such file or directory

yum install python-devel

安装thrift protocol
cd /usr/local/src/thrift-0.10.0/lib/php/src/ext/thrift_protocol
/usr/local/php/bin/phpize
./configure –with-php-config=/usr/local/php/bin/php-config –enable-thrift_protocol
make && make install

Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20151012/

修改php.ini,在最后添加一句extension=thrift_protocol.so

在生效的 php.ini 文件中加入一行

1
2
vi /usr/local/php/lib/php.ini
extension=thrift_protocol.so

重启php服务

安装mcrypt扩展

1
2
3
4
cd /usr/local/src/php-7.0.19/ext/mcrypt
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make && make install

修改php.ini,在最后添加一句extension=mcrypt.so

在生效的 php.ini 文件中加入一行

1
2
vi /usr/local/php/lib/php.ini
extension=mcrypt.so

重启php服务

php-fpm运行设置

1
cp /usr/local/src/php-7.0.19/sapi/fpm/init.d.php-fpm /usr/local/php/sbin

nginx

nginx

下载nginx源码

1
2
$ cd /usr/local/src
$ wget http://nginx.org/download/nginx-1.10.2.tar.gz

解压缩源码

tar xf nginx-1.10.2.tar.gz
rm -f nginx-1.10.2.tar.gz

编译安装nginx

创建nginx用户

1
2
$ groupadd -r nginx
$ useradd -r -s /sbin/nologin -g nginx nginx

-s /sbin/nologin不允许用户登录

编译安装nginx

1
2
3
$ cd /usr/local/src/nginx-1.10.2
$ ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-pcre --with-http_ssl_module --with-http_gzip_static_module
$ make && make install

提交镜像

提交容器

1
2
3
4
docker stop php-server
docker ps
docker commit 277757b6a7a1 10.135.44.207:5000/php-server:1.0.0
docker push 10.135.44.207:5000/php-server

其中277757b6a7a1容器id

Docker Compose

docker compose
Docker Compose是一个用来定义和运行复杂应用的Docker工具。使用Compose,你可以在一个文件中定义一个多容器应用,然后使用一条命令来启动你的应用,完成一切准备工作。

github.com/docker/compose

Docker Registry

docker registry
官方仓库(Public Repositories)
私有仓库(Private Repositories)
https://github.com/dotcloud/docker-registry

1
docker pull registry

latest的版本是2.6.1

启动registry

1
2
# docker run -d -p 5000:5000 registry
$ docker run --name "registry" -d -p 5000:5000 registry

查看仓库中的镜像
浏览器访问
http://localhost:5000/v2/_catalog

或者

1
2
3
$ curl http://localhost:5000/v2/_catalog
# curl -XGET http://registry:5000/v2/_catalog
# curl -XGET http://registry:5000/v2/image_name/tags/list

docker pull busybox

docker run -d busybox
docker ps

1
docker tag 镜像名 私有库ip:port/镜像名

例如

1
docker tag busybox localhost:5000/busybox

docker commit 容器id localhost:5000/busybox

docker push localhost:5000/busybox
从 docker v1.12 开始,docker 就不支持从 HTTP 仓库下载镜像,建立私有仓库必须走 HTTPs 加密协议
由于http改为https,push时提示如下内容

1
2
The push refers to a repository [10.135.44.207:5000/busybox]
Get https://10.135.44.207:5000/v1/_ping: http: server gave HTTP response to HTTPS client

需要修改,然后重启docker

1
$ vi /usr/lib/systemd/system/docker.service

/usr/lib/systemd/system/docker.service

1
2
3
...
ExecStart=/usr/bin/dockerd --insecure-registry 10.135.44.207:5000
...

重启docker服务

1
2
$ systemctl daemon-reload
$ systemctl restart docker

参考

坚持原创技术分享,您的支持将鼓励我继续创作!