为什么要用docker,docker基本的一些命令不再本文章的讨论范围。docker部署web项目需要用到几个服务:php,nginx,redis等等,本篇文章讲一下PHP,nginx以及redis的使用,更多的服务流程跟启动这三个服务雷同。php使用5.6版本。当然也可以使用最新版,流程是一样的
1: 首先把先把用到的镜像拉到本地:
docker pull php:5.6-fpm
docker pull nginx
docker pull redis
2: 启动之前先创建一个docker网络,使用docker来连接多个容器。
docker network create -d bridge php-net
3: 因为代码我们都是在本地修改,然后做个映射到各个docker中去就可以了。首先启动redis,因为redis不需要做映射,启动最简单:
docker run --name redis -d --network php-net -p 6379:6379 redis
4: 下面开始启动php跟nginx容器,因为我们是在本地开发,所以需要挂载主机web目录到容器,假设我们本地web目录为/data/website,然后由容器服务来运行这个web项目
# -p 9001:9000 后面这个9000是php的端口, 目前发现改了php会运行不起来
docker run --name php -d --network php-net -p 9001:9000 -v /data/website:/data php:5.6-fpm
// 先运行容器
docker run --name nginx -d --network php-net -p 80:80 -v /data/website:/data nginx:latest
// 拷贝配置文件到宿主机
docker cp nginx:/etc/nginx/conf.d/default.conf /data/nginx/conf.d/default.conf
// 删除临时容器
docker rm -f nginx
// 再次运行容器
docker run --name nginx -d --network php-net -p 80:80 \
-v /data/website:/data \
-v /data/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf \
nginx:latest
5: 这样3个容器就启动了,他们在统一docker网络内,可以通过ip互相进行访问。
接下来划重点部分 配置nginx,以及安装php扩展。因为官方的php是一个纯净的php环境,需要我们一个个扩展去安装。
首先进入nginx容器找到nginx配置文件配置
docker exec -it nginx bash
cd /etc/nginx/conf.d
vim default.conf
在default.conf配置文件中填入以下内容
server{
listen 80;
server_name localhost;
location / {
root /data; #对应主机挂载到nginx容器中的/data代码目录
index index.php index.html index.htm;
}
location ~\.php(.*)$ {
root /data; #对应主机挂在到php容器中的/data代码目录
fastcgi_pass 172.19.0.3:9000; #此地址为php容器的内网ip
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data$fastcgi_script_name;
fastcgi_param PATH_INFO $1; #此行配置pathinfo,tp框架必须使用pathinfo
include fastcgi_params;
}
}
ps: docker容器内vim 无法使用
apt-get update
apt-get install vim
6: 编辑完配置文件之后进行重载配置
service nginx reload
7: 之后再进入到php-web容器里面开始安装用到的扩展,这里我们安装几个比较常用的扩展,流程基本都一样
docker exec -it php bash
cd /usr/local/bin
./docker-php-ext-install pdo_mysql
./docker-php-ext-install mysql
./docker-php-ext-install mysqli
docker-php-ext-install bcmath
docker-php-ext-install mbstring
apt-get update && apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng-dev
docker-php-ext-install -j$(nproc) iconv
docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/
docker-php-ext-install -j$(nproc) gd
pecl install redis-4.0.1 && pecl install xdebug-2.6.0 && docker-php-ext-enable redis xdebug
一口气安装了mysql,bcmath,gd,mbstring,redis等扩展
8: 重启php容器服务
docker restart php
这样一个完整的web项目就使用docker部署完成了,没有安装mysql容器,因为安装方式雷同,在连接的时候注意使用他们的内网ip去连接,如果想要连接宿主机,那么使用ifconfg命令找到docker0开头的那行,那个ip就是宿主机的ip,通过这个ip可以请求宿主机,比如我们在宿主机上又个mysql,那么可以使用ip:port来访问,容器之间也是使用内网ip来互相访问,进入每个容器然后cat /etc/hosts来获取ip
ps: mysql 配置远程访问
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root --name mysql -v /data/mysql5.5:/var/lib/mysql mysql:5.5.53
$ sudo docker exec -it mysql bash # 进入 MySQL 容器
$ mysql -uroot -p # 登录 MySQL,执行后输入密码进入 MySQL
$ use mysql; # 选择使用 mysql 数据库
MySQL 8 配置
CREATE USER 'james'@'%' IDENTIFIED BY '123456asd';
# 创建一个账号-james,用来进行远程访问;
# '%'代表的是所有IP,如果可以尽量设置指定 IP 或 IP 段
# CREATE USER 'james'@'192.168.%.%' IDENTIFIED BY '123456asd';
GRANT ALL ON *.* TO 'james'@'%';
# 赋予所有权限给之前创建的账号:james
ALTER USER 'james'@'%' IDENTIFIED WITH mysql_native_password BY '123456asd';
# 确认使用密码{123456asd}登录此账号{james}
# 密码尽量复杂,安全性更高。
FLUSH PRIVILEGES;
# 刷新权限
MySQL 5.7 配置
GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
# {usernama} 是远程访问登录的用户名,不建议用 root;
# {password} 是远程访问的登录密码;
# '%'代表的是所有IP,如果可以尽量设置指定 IP 或 IP 段
# GRANT ALL PRIVILEGES ON *.* TO 'username'@'111.198.227.%' IDENTIFIED BY 'password' WITH GRANT OPTION;
FLUSH PRIVILEGES;
# 刷新权限
nginx 配置
server {
listen 80;
listen [::]:80;
server_name localhost;
#access_log /var/log/nginx/host.access.log main;
location / {
root /data/app;
index index.php index.html index.htm;
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=$1 last;
break;
# break; 必须要加, 不加就有问题....
}
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /data/app;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
root /data/app;
fastcgi_pass 172.18.0.5:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data/app$fastcgi_script_name;
fastcgi_param PATH_INFO $1;
include fastcgi_params;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
nginx 配置负载均衡
// default.conf 文件内容
upstream myServer {
# ip_hash;
server 192.168.108.100:80;
server 192.168.108.101:80;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://myServer;
}
}
docker nginx 404 访问不了php程序
注意配置中的php IP地址: fastcgi_pass 172.18.0.5:9000;