用docker构建nginx+php+mysql独立运行的容器

宿主机环境:Centos 7

1. 安装docker

移除旧版本

sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine

基础工具安装

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

添加docker源

sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

更新缓存

sudo yum makecache fast

安装docker-ce

sudo yum -y install docker-ce

启动docker

sudo systemctl start docker

2. 安装Mysql

从官方拉取Mysql 5.6镜像

docker pull mysql:5.6

下载完成之后,使用docker images查看下镜像

运行容器

mkdir -p /www/server/mysql/conf /www/server/mysql/logs /www/server/mysql/data

cd /www/server/mysql

docker run -p 3306:3306 --name vilay-mysql -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6

说明:

1. 首先在宿主机创建对应的mysql的映射目录
2. -p 3306:3306  宿主机上的3306端口映射到容器上的3306端口,前面的3306表示宿主机端口
3. --name vilay-mysql   指定容器名称
4. -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql   $PWD表示宿主机当前目录,宿主机mysql的相关目录映射到容器mysql的目录
5. -d mysql:5.6  以后台运行的方式,运行mysql:5.6镜像

3. 安装PHP

安装php镜像

docker pull php:7.1-fpm

运行php容器

docker run --name  vilay-fpm-mysql -v /home/docker/server/nginx/www:/www --link vilay-mysql:mysql  -d php:7.1-fpm

说明

1. --name  vilay-fpm-mysql指定名称
2. -v /www/web:/www  假设我们以/www/web作为服务器目录,映射到容器的/www目录
3. --link vilay-mysql:mysql  把 vilay-mysql 的网络并入 php容器,并通过修改 php容器 的 /etc/hosts,把域名 host 映射成 127.0.0.1,让 php 通过 以mysql作为host 访问 mysql  例如:$dsn = 'mysql:dbname=vilay;host=mysql';
4. -d php:7.1-fpm 以后台方式运行php镜像

默认安装的php是没有数据库扩展的,所以我们还需要安装pdo_mysql扩展

扩展安装方法:

1. docker exec -it vilay-fpm-mysql bash  #启动容器的bash,类似于通过ssh连接到服务器
2. docker-php-ext-install  pdo_mysql   #安装扩展
3. exit  #退出
4. docker restart vilay-fpm-mysql  #重启容器

4.安装Nginx

从官方拉取镜像

docker pull nginx

先运行个nginx的容器

docker run --name vilay-nginx-test -p 8081:80 -d nginx

创建宿主机上相关目录文件

mkdir -p /www/server/nginx/conf /www/server/nginx/logs

复制docker中的nginx.conf文件

docker cp 9b771a85cbfd:/etc/nginx/nginx.conf /www/server/nginx/conf/

9b771a85cbfd这个参数是容器的ID,可以使用命令docker ps查看,示例

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9b771a85cbfd nginx "nginx -g 'daemon of…" 7 minutes ago Up 7 minutes 0.0.0.0:8081->80/tcp vilay-nginx-test

创建虚拟主机文件 vi /www/server/nginx/conf/conf.d/vilay.conf

server {
		listen       80;
		server_name  localhost;

		location / {
				root   /usr/share/nginx/html;
				index  index.html index.htm index.php;
		}

		error_page   500 502 503 504  /50x.html;
		location = /50x.html {
				root   /usr/share/nginx/html;
		}

		location ~ \.php$ {
				fastcgi_pass   php:9000;
				fastcgi_index  index.php;
				fastcgi_param  SCRIPT_FILENAME  /www/$fastcgi_script_name;
				include        fastcgi_params;
		}
}

运行容器

docker run --name vilay-lnmp -p 8080:80 -v /www/web:/usr/share/nginx/html -v /www/server/nginx/conf/conf.d:/etc/nginx/conf.d --link vilay-fpm-mysql:php -d nginx

/www/web创建index.php

<?php phpinfo();

访问:http://111.11.11.11:8080/index.php就可以查看到php相关的信息了。

独立运行的容器到这步就安装完成了。

5.遇到的问题

主要遇到了几个问题

1. pdo_mysql 扩展缺失的问题,上面已经记录了解决方法了
2. 三个独立容器,网络互通的问题,我最开始是在运行nginx容器的时候,通过--link连接php容器,连接mysql容器,跑php可以,但是无法连接到mysql,后面以在运行php容器的时候,连接mysql容器,然后运行nginx容器的时候,再连接php+mysql容器解决。
3. mysql容器运行了,怎么创建数据库  通过docker exec -it vilay-mysql bash  进入mysql容器,然后mysql -u root -p 进行连接
4. mysql创建了数据库,怎么导入数据库文件  参考:https://www.nuxtv.com/article/463
5. 配置虚拟主机的时候,注意location 部分的root还有php部分/www/都要更换

多个虚拟主机配置示例

server {
		listen       80;
		server_name  localhost;
     root   /usr/share/nginx/html/vilay;  #目录修改
	  index  index.html index.htm index.php;
		location / {
				if (!-f $request_filename){
            rewrite ^/(.*)$ /index.php?s=$1 last;
            break;
        }
		}

		error_page   500 502 503 504  /50x.html;
		location = /50x.html {
				root   /usr/share/nginx/html;
		}

		location ~ \.php$ {
				fastcgi_pass   php:9000;
				fastcgi_index  index.php;
				fastcgi_param  SCRIPT_FILENAME  /www/vilay/$fastcgi_script_name;#目录修改
				include        fastcgi_params;
		}
}