
网站架构
数据流向
网站架构
容器化简单步骤
直接启动NGINX容器
其他容器化方式
Dockerfile 封装镜像
简单容器编排工具-docker compose
查看状态和日志
我的个人博客 - https://www.EWhisper.cn 正式运行在docker里边了! 🎉🎉🎉
我把相关的源码, Docker镜像分别上传到了GitHub和Docker Hub. 地址如下:
我的博客网站的架构其实非常非常简单. 说白了, 就是NGINX + 静态页面. (对的, 你没有看错, 我的网站是个全静态网站, 没有动态页面).
之前的数据流向大概是:
用户 -> 域名 -> DNS -> 腾讯云主机外网IP -> 腾讯云主机内网IP -> NGINX 80和443端口 (NGINX作为Web Server, 后端没有App Server和DB)
现在加了一层Docker, 多了一层 主机 -> docker sdn的转发. 如下:
用户 -> 域名 -> DNS -> 腾讯云主机外网IP -> 腾讯云主机内网IP -> Docker SDN端口映射(443指向docker的443, 80之下那个docker的80) -> Docker的NGINX容器的 80和443端口
从头开始说起吧, 我的博客是一个静态站点.
/usr/share/nginx/html 目录下, 并启动NGINX, 配置80, 443端口监听并处理静态内容就可以了. systemctl 在云主机上启动的NGINX因为我这个只涉及NGINX的容器化, 而且NGINX有官方提供的标准镜像. 所以容器化非常简单, 最简单的方式, 就是直接启动NGINX容器, 如下:
其实, 直接启动NGINX容器就好了, 你只需要把以下内容挂载卷或者暴露出来:
/etc/nginx下面的nginx.conf文件, conf.d和default.d文件夹)/usr/share/nginx/html的文件)/etc/pki/nginx 文件夹)命令如下:
sudo docker run --name my-tencentyun-nginx -d \
-p 80:80 -p 443:443 \
-v /etc/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /etc/nginx/conf.d:/etc/nginx/conf.d \
-v /etc/nginx/default.d:/etc/nginx/default.d \
-v /usr/share/nginx/html:/usr/share/nginx/html \
-v /etc/pki/nginx:/etc/pki/nginx:ro \
nginx上面的命令就不细说了, 很容易理解的. -p是暴露端口, -v是把主机的磁盘挂载到容器里, -d是后台运行.
启动后, 你的NGINX docker容器就会自动下载并启动运行, 你的网站也可以正式对外服务啦. 🎉🎉🎉
自己本地或单机玩玩, 上边的容器化方式完全够用了. 但是如果我们有以下需求:
那么就需要其他的容器化方式.
适用场景
这种其实是团队, 公司, 或生产上推荐的一种方式. 开发负责写代码, 编译代码, 写Dockerfile, 构建镜像. 并把镜像上传到共有或私有的镜像仓库. 然后另外的团队角色, 如: 测试, 运维, 再从仓库中拉取镜像并启动, 测试, 上线.
这也实现了docker的最大优势, 他们的slogan: "build, share and run any application, anywhere".
能做到这一点, 也是因为OS+语言+组件+应用包, 整个打包成了一个镜像, 实现了环境的一致性.
还有一个优点, 因为有Dockerfile, 也方便进行追溯和理解镜像. (如果只是一个镜像的话, 很难知道镜像是怎么做出来的).
步骤
Dockerfilesudo docker build -t caseycui/my-tencentyun-nginx .sudo docker push caseycui/my-tencentyun-nginx (我这边是Docker Hub直接oauth连接到Github, 我的对应的Github仓库代码有更新, 就会自动构建)sudo docker run --name my-tencentyun-nginx -v /etc/pki/nginx:/etc/pki/nginx:ro -d -p 80:80 -p 443:443 caseycui/my-tencentyun-nginxDockerfile 如下:
最简单的Dockerfile, 就是在nginx镜像的基础上, 把我们自己的nginx配置文件和静态站点文件复制进去, 生成一个新镜像.
FROM nginx:latest
COPY pelican-output /usr/share/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf
COPY default.d /etc/nginx/default.d
#COPY conf.d /etc/nginx/conf.d # 这边注释掉, 是因为这个目录里还没有内容适用场景
docker compose是docker官方出品的容器编排工具, 简单易用. 小规模用用还是挺舒服的. 大规模, 企业级的现在都是使用Kubernetes.
我这里用docker compose其实是杀鸡用牛刀了, 没啥必要. 它适用于哪种场景呢?
比如, 我一个项目要上线, 包括: web server, app server, db. 那么这时候docker compose就很合适了. 通过它来编排这3类容器, 使它们相互协作和交互.
docker-compose是通过docker-compose.yaml来定义这些编排内容的. 示例如下:
一个web容器, 一个redis容器. 挂载哪些卷, 怎么编译...
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}步骤:
创建docker-compose.yaml:
web:
image: nginx
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./default.d:/etc/nginx/default.d
- ./conf.d:/etc/nginx/conf.d
- ./pelican-output:/usr/share/nginx/html
- /etc/pki/nginx:/etc/pki/nginx:ro
ports:
- "80:80"
- "443:443"
command: [nginx, '-g', 'daemon off;']运行: sudo nohup docker-compose up &
查看状态:
sudo docker ps <container name>
查看日志:
sudo docker logs <container name>