人生苦短,请用docker。
小组的各个网站几乎都是我一个人在运维,迈阿密的Vultr,装了个宝塔面板,图形化界面的确很爽~~但是感觉搬起来太麻烦了~于是乎就有了这个”放弃“教程
0x01 preface
想着学校服务器网络一直没弄好,小组业务线可能还要搬家几次,而且前段时间不想在物理机搭php开发环境的时候,就是拿docker复现的开发环境,用起来很舒服,但是都是一个一个容器的玩,没有很深入的去了解。最近在本地搭php审计环境的时候,又没找到好的“phpstudy”,所以又去遨游了两天的docker海洋。
0x02 docker
再次验证一句话:学一样东西最快的方法,就是实战!!
项目目录结构如下(有删减)
KarmA ~/Downloads/docker-d0g3 # tree -d
.
├── d0g3-blog # 博客
│ ├── conf.d
│ └── copy
├── d0g3-home # 主页
│ ├── conf.d
│ └── copy
├── d0g3-major # nginx代理服务器
│ ├── conf.d
│ └── copy
├── d0g3-php # php环境
├── d0g3-skills # 技能树
│ ├── conf.d
│ └── copy
└── letsencrypt # ssl证书
dockerfile
几乎每个目录里面都有各自的dockerfile,用来定制每个container里面的一些不同的参数/变量……
FROM nginx # 引入那个镜像源
ENV WEB_SITE www.d0g3.cn # 定义环境变量
RUN mkdir -p /etc/nginx/${WEB_SITE} # 运行的命令
COPY ./nginx.conf /etc/nginx/nginx.conf
LABEL description="SSL & D0g3-Home" \ # 标签
maintainer="0aKarmA <karma@d0g3.cn>"
EXPOSE 80 #开放80端口
EXPOSE 443 # 开放443端口
CMD nginx -g 'daemon off;' # 使用nginx的前台运行模式
docker-compose
version: '2'
services:
# 基本环境
mysql:
container_name: "d0g3-mysql"
image: mysql:5.7
restart: always
volumes:
- "$PWD/20181001blog_d0g3_cn.sql:/docker-entrypoint-initdb.d/dump.sql" # 导入数据库文件
depends_on: # 依赖关系,先安装php环境,再到mysql
- php
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
networks:
- d0g3_net
# 主要容器
php:
container_name: "d0g3-php" # 自定义容器名
# build 该置顶目录下的dockerfile
build: ./d0g3-php
# image指定build Dockerfile生成镜像的名称
image: php:7.0-fpm-mysqli
expose:
- 9000 # expose的端口是不会映射到宿主机上的
environment: # 设定mysql的环境变量
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
volumes: # 挂载文件,类似于vmware上的共享文件夹
- "$PWD/d0g3-blog/copy:/var/www/html"
networks: # 容器间的网络设置
- d0g3_net
d0g3-blog:
container_name: "d0g3-blog"
image: nginx
build: ./d0g3-blog
command: nginx -g 'daemon off;'
restart: always
# 数据卷
volumes:
- "$PWD/letsencrypt:/etc/letsencrypt/live/0u0.ooo/"
- "$PWD/d0g3-blog/conf.d:/etc/nginx/conf.d"
- "$PWD/d0g3-blog/nginx.conf:/etc/nginx/nginx.conf"
- "$PWD/d0g3-blog/copy:/usr/share/nginx/html"
depends_on:
- mysql
- php
expose:
- 80
environment:
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
networks:
- d0g3_net
d0g3-major:
container_name: "d0g3-major"
image: nginx
build: ./d0g3-major
command: nginx -g 'daemon off;'
restart: always
# 数据卷
volumes:
- "$PWD/nginx.conf:/etc/nginx/nginx.conf"
- "$PWD/letsencrypt:/etc/letsencrypt/live/0u0.ooo/"
- "$PWD/d0g3-major/conf.d:/etc/nginx/conf.d"
- "$PWD/d0g3-major/copy:/usr/share/nginx/html"
links:
- d0g3-home
- d0g3-blog
- d0g3-skills
networks:
- d0g3_net
ports:
- "80:80" # ports的端口,会映射到宿主机上,如果没有指定映射到宿主机哪一个,就会随机分配
- "443:443"
networks:
- d0g3_net
networks:
# 配置docker network
d0g3_net:
driver: bridge
0x03 nginx
nginx真是个好东西~~
基本知识
跨域
跨域情况如下表
CORS跨域与Nginx反向代理跨域优劣对比
CORS跨域
CORS是一个W3C标准,全称是跨域资源共享(Cross-origin resource sharing)。它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。
简单来说就是跨域的目标服务器要返回一系列的Headers,通过这些Headers来控制是否同意跨域。跨域资源共享(CORS)也是未来的跨域问题的标准解决方案。
nginx反向代理跨域
原理就是将两个跨域资源,通过反代,代到同一域下,就可以解决跨域问题。
但是对于我这次遇到的情况,这种方法不管用,因为是协议不同导致的跨域。
反向代理
反代后静态资源404:
nginx 中配置多个location并解决js/css/jpg/等的加载问题
0x03 Summarization
渐渐的,发现自己爱上了docker!(逃