人生苦短,请用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的前台运行模式

如何编写最佳的Dockerfile

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

一文掌握Docker Compose

0x03 nginx

nginx真是个好东西~~

基本知识

X-Forwarded-For的一些理解

http协议属性整理

nginx 403 Forbidden 排错记录

跨域

跨域情况如下表

CORS跨域与Nginx反向代理跨域优劣对比

CORS跨域

CORS是一个W3C标准,全称是跨域资源共享(Cross-origin resource sharing)。它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。

简单来说就是跨域的目标服务器要返回一系列的Headers,通过这些Headers来控制是否同意跨域。跨域资源共享(CORS)也是未来的跨域问题的标准解决方案。

Nginx 通过 CORS 实现跨域

nginx反向代理跨域

原理就是将两个跨域资源,通过反代,代到同一域下,就可以解决跨域问题。

但是对于我这次遇到的情况,这种方法不管用,因为是协议不同导致的跨域。

nginx反向代理跨域基本配置与常见误区

用 Nginx 反向代理机制解决前端跨域问题

使用Nginx反向代理处理前后端跨域访问

用 nginx proxy_pass 绕过跨域请求的问题

反向代理

Nginx基本功能极速入门

nginx反向代理相关配置(一)

Docker中配置Nginx多域名配置多个应用

轻松实现nginx代理https转http

反代后静态资源404:

解决Nginx反向代理后无法加载静态文件的问题

ngnix配置静态资源404问题

nginx 中配置多个location并解决js/css/jpg/等的加载问题

0x03 Summarization

渐渐的,发现自己爱上了docker!(逃

0x04 Good Materials

申请 Let’s Encrypt 泛域名证书 及 Nginx/Apache 证书配置