使用docker虚拟化nginx服务
项目结构
首先需要编写Dockerfile文件,一般情况下有2种做法:
第一种基于liunx镜像镜像编写(自由度非常高)
第二种基于docker官方镜像仓库的镜像编写
如何选择用何种方式编写自己的Dockerfile呢?先去看你要虚拟化的组件 官方提供的镜像dockerfile源码,如果官方提供的非常累赘那就建议使用第一种方式编写自己的镜像
现在nginx使用官方docker镜像编写流程:
1、创建Dockerfile文件
FROM nginx:1.8 ##拉取官方镜像库nginx镜像 1.8版本
COPY nginx/cert /etc/nginx/cert ## 将本地的nginx文件夹下的cert文件夹复制nginx的cert目录(不存在会创建)
COPY nginx/nginx.conf /etc/nginx/nginx.conf ##将nginx的配置文件 复制到nginx配置文件所在位置(会覆盖原有的文件)
VOLUME ["/data"] ## 在镜像的根目录下创建一个data目录 也可以直接在这里指定所需要映射到宿主机上的文件目录
2、创建docker-compose.yml文件
nginx:
container_name: nginx ##容器名称为nginx
build: docker ## 指定编译文件dockerfile的位置
restart: always ##开机自动启动
ports: ##端口暴露
- "80:80" ##宿主机端口:容器内端口
- "443:443"
environment:
TZ : "Asia/Shanghai" ##指定容器时区
volumes:
- /root/data/nginx:/data ##将dockerfile第4步中创建的data文件夹映射到宿主机文件夹下(在这里映射是方便更改,如果在dockerfile中指定会导致当前yml文件依赖的镜像配置灵活度不够高)
这样配置完成 cd 到当前docker-compose.yml文件所在目录 执行 docker-compose up -d 就可以启动了
注意容器挂载卷千万不要删除宿主机上已经挂在在容器中的目录,否则容器会丢失资源。另外,在虚拟化某些服务的时候会因为文件系统权限不一致导致容器读写出现问题,这个后面再讲,nginx是不会有这个问题的
nginx.sh 是一个快速操作nginx重启及nginx配置、ssl证书等功能的脚本,这个随便写写就ok了,
附上nginx.sh脚本
#!/usr/bin/env bash
# !/bin/sh
set -m
DOCKER_NAME="nginx"
WAR_PATH="docker/nginx"
function cp_app() {
docker cp ${WAR_PATH}/nginx.conf ${DOCKER_NAME}:/etc/nginx/nginx.conf
docker cp ${WAR_PATH}/cert ${DOCKER_NAME}://etc/nginx
}
function restart_app() {
docker restart ${DOCKER_NAME}
}
function start_app() {
docker start ${DOCKER_NAME}
}
function stop_app() {
docker stop ${DOCKER_NAME}
}
case $1 in
start)
cp_app
start_app
;;
restart)
cp_app
restart_app
;;
stop)
stop_app
;;
*)
echo "Usage: $0 {start |restart |stop}" >&2
esac