一、项目背景
初衷
最近所做的一个项目用到了docker部署,首次在正式服务器使用docker搭建项目,遇到了很多坑,以此记录下来自己遇到的坑和最终的解决办法,如果你也遇到了同样的问题,希望这篇文章可以帮助更多的小伙伴们。
开发环境
php:7.2.4
mysql:5.7.29
node:10.15.3
redis:5.0.5
二、搭建流程
1、项目目标
在阿里云服务器搭建运行php项目
2、环境分析
登录到服务器后,发现给我的服务器上,安装了nginx、docker,docker运行了mysql8容器。然而,自己的项目是php项目,所要求的数据库是mysql5,为了避免与正式服务器原有业务冲突,选择docker下安装nginx容器、php容器、mysql容器、node容器、redis容器,并且版本也方便管理。
3、执行
确定好思路,下手干吧,进入最关键的环节:
a、docker安装信息确认
正式服务器已安装好了docker,执行命令:docker version
// 查看docker信息
# docker version
b、 安装docker-compose
(1)使用pip安装:
执行命令:pip install docker-compose
(2)执行结束后,查看安装信息
执行命令:docker-compose version
(3)进入到项目目录docker文件目录
安装启动容器
执行命令:docker-compose -p 【docker所在上级目录名】 down && docker-compose -p 【docker所在上级目录名】 up -d
注意:-d参数是让docker后台运行
问题一:容器安装失败,端口被占用
安装进行到这里,遇到了第一个坑。
nginx 443端口被占用;
mysql 3306端口被占用;
redis 6379端口被占用;
解决方式:
在docker-compose.yml文件修改对应容器端口号:
// docker-compose.yml文件内容
version: '3'
networks:
likeshop:
driver: bridge
services:
nginx:
container_name: likeshop-nginx
image: nginx:1.17.0
restart: always
depends_on:
- "php7.2.4"
volumes:
- ../server:/server
- ./config/nginx/conf.d:/etc/nginx/conf.d
- ./log/nginx/logs:/logs
networks:
- likeshop
ports:
# - "80:80"
# - "443:443"
# - "9001:9001"
- "9001:9001"
php7.2.4:
container_name: likeshop-php7.2.4-fpm
image: likeshop/php:7.2.4-fpm
restart: always
working_dir: /server
volumes:
- ../server:/server
- ./config/php/php.ini:/usr/local/etc/php/php.ini
networks:
- likeshop
ports:
- "9004:9000"
#user: "1000:1000"
mysql:
container_name: likeshop-mysql
image: mysql:5.7.29 #X86架构
#image: amd64/mysql:5.7.29 #arm架构
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
volumes:
- ./data/mysql5.7.29/lib:/var/lib/mysql5
- ./config/mysql/mysqld.cnf:/etc/mysql5/my.cnf
networks:
- likeshop
ports:
# - "3306:3306"
- "9002:9002"
redis:
container_name: likeshop-redis
image: redis:5.0.5
restart: always
volumes:
- ./data/redis:/data
networks:
- likeshop
ports:
# - "6379:6379"
- "9003:9003"
node:
container_name: likeshop-node
image: node:10.15.3
restart: always
volumes:
- ../web:/web
networks:
- likeshop
tty: true
working_dir: /web
ports:
- "8080:8080"
修改后,重新执行安装命令,成功了:
问题二:访问页面404
修改服务器nginx配置后,问题解决:
宿主主机nginx配置
//
server {
listen 443 ssl;
server_name 【阿里云配置的域名地址】;
charset 'utf-8';
ssl on;
ssl_certificate 【证书的地址】;
ssl_certificate_key 【证书key的地址】;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_prefer_server_ciphers on;
location / {
# proxy_set_header Host $proxy_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:9001/; // 重要:代理代理到 nginx容器
}
}
nginx容器配置
server {
listen 9001;
server_name 【阿里云配置的域名地址】;
access_log /logs/www.dev.buleroot_access_nginx.log;
error_log /logs/www.dev.buleroot_error_nginx.log;
client_max_body_size 5M;
location / {
root /server/public;
index index.html index.htm index.php;
if (!-e $request_filename)
{
rewrite ^/(.*)$ /index.php?s=$1 last;
break;
}
}
location ~ /.*\.php/ {
rewrite ^(.*?/?)(.*\.php)(.*)$ /$2?s=$3 last;
break;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /var/www/html;
}
location ~ \.php$ {
fastcgi_pass likeshop-php7.2.4-fpm:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /server/public$fastcgi_script_name;
include fastcgi_params;
}
location = /favicon.ico {
log_not_found off;
access_log off;
}
}
问题三:容器无法连接外网
页面能访问了,但是项目需要composer install来安装组件,提示联网超时,此时要解决容器内部连接外网的问题。
查看服务情况,执行命令:dockcer info
# dockcer info
// 发现如下预警信息:
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
// 查看 /etc/sysctl.conf配置是否包含:
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-arptables = 1
net.ipv4.ip_forward = 1
// 没有需要添加,添加完执行
sysctl -p
最后重启docker
重启docker,使容器不受影响
让容器自动启动
docker update --restart=always mysql8
docker update --restart=always likeshop-nginx
docker update --restart=always likeshop-php7.2.4-fpm
docker update --restart=always likeshop-mysql
docker update --restart=always likeshop-redis
docker update --restart=always likeshop-node
重启docker
docker restart likeshop-php7.2.4-fpm
docker restart likeshop-mysql
docker restart likeshop-nginx
docker restart likeshop-redis
docker restart likeshop-node
问题解决。