Docker的安装请阅读上一篇 Docker 简介及安装。如今的nginx可以说是一个web服务中的一个标配,网上已经有很多很多成熟的教程和案例. 本篇不对nginx的搭建和配置做详细介绍。
题外话:提到Nginx, 有一段很艰辛的经历,时至今日,回想起来像是发生在昨天, 感谢当时自己的奋斗和学习。 2010年我做广告联盟时, 一开始采用的Win+IIS+做了简单的MySql读写分离,后来IIS换为Apache, 悲剧的是连续半个月我解决不了高并发高负载的问题, 为此我研究了一个月,每天加班只睡3个小时,期间骑摩托车回家,骑着骑着就睡着了,一次撞到大树,一次撞到电线杆,一次撞到石墩上,想来自己命大。最后在网上看到张宴的博客详细阐述了LNMP性能是Apache的十倍,当时对Linux命令根本是从零开始,当我用Nginx成功解决当时的问题后, 自此我就很开心的用上了Nginx.
直接利用官方(Docker Hub)的Nginx镜像
- 拉取镜像
1 | docker pull nginx |
docker pull: 从Docker Hub中拉取或者更新指定镜。(是不是有点像git pull命令)
docker images: 列出本地所有docker镜像。(是不是有点像git branch)
- 基于镜像创建新的容器
1 | docker run --name mynginx -p 80:80 nginx // 见注释1 |
注释1:使用docker镜像nginx启动一个容器,将这个容器命名为mynginx, 同时将容器的80端口映射到宿主机的80端口上。
docker ps: 列出所有在运行中的容器。
这个时候,我们在浏览器中输入IP地址即可访问到nginx的默认的欢迎页面。OK, 到这里如果你觉得已经完成了本篇的主题, 那么如此简单的操作步骤其实也不值得我花精力去写这个的。
- 来一个复杂一点的: 自定义配置
Nginx的配置项很多, 从而满足我们各种需求,上一步 基于镜像创建新的容器中,当访问宿主机的80端口, docker会自动将访问引入mynginx容器中,利用容器中的nginx配置进行相关的服务。可是现在的需求是这样的:
- 定义自己的配置文件nginx.conf及用于include的vhost文件夹方便管理,放置于宿主机目录下/home/nginx下
- 定义自己的WEB根目录www, 放置于宿主机目录下/home/nginx下。
- 创建自己的两个日志追踪文件nginx_error.log和access.log,放置于宿主机目录下/home/nginx/logs下
于是我们得研究一下docker run 命令了
docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
-d: 后台运行容器,并返回容器UUID;
-i: 以交互模式运行容器,通常与 -t 同时使用;
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-v, –volume=[] 给容器挂载存储卷,挂载到容器的某个目录
–privileged=false 指定容器是否为特权容器,特权容器拥有所有的capabilities
–name=”” 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字
根据docker run的语法,我们得到如下命令写法即可满足需求。我们可以将这些写入到一个shell脚本里。
1 | docker run --name nginx-atlascca3 --privileged=true -p 80:80 -v /home/nginx/nginx.conf:/etc/nginx/nginx.conf -v /home/nginx/vhost:/home/nginx/vhost -v /home/nginx/logs/nginx_error.log:/home/nginx/logs/nginx_error -v /home/nginx/www:/home/nginx/www -d nginx |
注意,在调试过程中,利用docker ps查看容器是否创建, 利用docker rm containerid删除一个容器,
若没有创建说明命令执行不成功,可以把命令行中的 -d 选项去掉即将显示出相关错误信息。
另外一个方法利用Dockerfile搭建Nginx服务器将来单独开个主题再写。