使用Nginx实现服务器中多容器共存的方法

背景

有一台腾讯的Linux云主机,在服务器上部署了一个docker(称为ServiceDocker,名称为sign,下同),ServiceDocker内部使用了80、443、3306端口,分别映射到宿主机(云主机)的相同端口(即80、443、3306)。

ServiceDocker中安装了XAMPP,在此基础上部署了扫码签到小程序的服务器。ServiceDocker的80和443端口分别提供http和https服务,3306为MySQL数据库的端口。

ServiceDocker绑定了域名sign.famend.cn。

目标

云主机中的一个ServiceDocker占用了80、443端口,如果想在主机中再部署一台服务器对外服务,就不能使用80和443端口了。

我们的目标是在主机中可以部署多个ServiceDocker,每个ServiceDocker绑定各自的域名,对外提供服务,保证80和443端口可用。

思路

修改ServiceDocker的端口映射,把ServiceDocker端口80、443分别映射到主机的89、449端口,这样主机的80、443端口释放出来了。

释放出来的80和443端口供Nginx使用。安装带Nginx的docker(称为NginxDocker,名称为mynginx,下同)。NginxDocker内部使用端口80、443,分别映射到主机的80和443端口。

NginxDocker用来做反向代理。当有访问请求时,读取Nginx配置后,不同的URL定向到各自对应的Docker。例如:访问http://sign.famend.cn:80,则自动映射到http://sign.famend.cn:89

实现步骤

1. 修改ServiceDocker的端口映射,释放80和443端口。

Docker没有提供命令修改端口,从网上我找到了2种方法。

方法1:先停止容器,再将容器打包成镜像,接着运行新的镜像。在运行新的镜像时指定新的端口。使用的命令如下:

#先停止容器
docker stop containerA
#将容器commit成为一个镜像
docker commit containerA newImageB
#运行容器
docker run -p 8080:8080 -p 8081:8081 -v /home/data/:/home/data/ -dt newImageB 

方法2:先停止容器,接着停止容器服务,然后修改容器配置文件,最后启动容器服务、启动容器。步骤如下:

①停止ServiceDocker(ServiceDocker的名称为sign),停止docker服务。

sudo docker stop sign
sudo service docker stop 

②使用 docker ps -a 命令找到要修改容器的 CONTAINER ID。

③运行 docker inspect 【CONTAINER ID】 | grep Id 命令。

④执行 cd /var/lib/docker/containers 命令令进入找到与 Id 相同的目录。

在执行cd 命令时如果提示permission denied,可以先执行 sudo -s。

进入id对应的目录后,打开文件hostconfig.json。

找到80端口的映射,如下:

"80/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "80"
}] 

把 "HostPort": "80" 修改成 "HostPort": "89" , 如下
"80/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "89"
}]

修改之前,ServiceDocker内部的80端口映射为主机的80端口;修改之后,ServiceDocker内部的80端口映射为主机的89端口。

稍加说明,有文章(参考资料中的2、3)提到还需要修改config.v2.json,亲测不需要。这个文件在启动ServiceDocker时会自动修改。

⑤启动docker服务,然后启动ServiceDocker(名称为sign)。

sudo service docker start
sudo docker start sign 

方法(1)和方法(2)都可以,我选用了方法(2)。

在执行完方法(2)之后,打开浏览器验证,提示“网站无法访问”。

初步估计docker中的服务器没有启动,运行命令:

sudo /opt/lampp/lampp stop
sudo /opt/lampp/lampp start 

运行stop的时候,发现apache 没有启动,可能是修改了80端口的缘故。

在执行start之后,打开浏览器验证http://sign.famend.cn:89https://sign.famend.cn:449,成功访问。

修改Docker端口的方法并不复杂,如果docker以后的版本能够提供相应命令,相信会方便很多。

顺便,运行 crontab -l 查看ServiceDocker中的定时任务是否启动,如果没启动,运行 service cron start 启动定时任务。

下一步,配置NginxDocker反向代理,让http://sign.famend.cn:80https://sign.famend.cn:443也能成功访问。

2. 配置NginxDocker反向代理。

①下载nginx,并运行它。

docker container run \
 -d \
 -p 80:80 \
 -p 443:443 \
 --rm \
 --name mynginx \
 nginx 

②配置nginx的配置文件。

mkdir nginx-files
docker container cp mynginx:/etc/nginx .
mv nginx conf
vi conf/nginx.conf 

在nginx.conf中,添加如下反向代理信息。

server{
 listen     443 ssl;
 server_name   sign.famend.cn;
 ssl_certificate /etc/nginx/ssl/sign.famend.cn/1_sign.famend.cn_bundle.crt;
 ssl_certificate_key /etc/nginx/ssl/sign.famend.cn/2_sign.famend.cn.key; 

 location / {
  proxy_set_header HOST $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header X-Forwarded-Proto $scheme;
  proxy_pass http://sign.famend.cn:89/;
 }
} 

server{
 listen     80;
 server_name   famend.cn sign.famend.cn;
 location / {
  proxy_set_header HOST $host;
  proxy_set_header X-Real-IP $remote_addr:89;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header X-Forwarded-Proto $scheme;
  proxy_pass http://sign.famend.cn:89/;
 }
} 

对于443端口,需要使用ssl_certificate和ssl_certificate_key。在ServiceDocker中证书使用的LetsEncrypt的SSL证书,每90天更新一次。

SSL证书的来源:一种方法,可以让它们共享LetsEncrypt的SSL证书。除此之外,在腾讯注册的域名,腾讯免费提供SSL证书,有效期为1年。

为了简便,我直接使用了腾讯的SSL证书,当然,一年之内,必须在过期之前更新证书。

③停止mynginx,然后重启它。

docker container run \
 --name mynginx \
 --volume "$PWD/conf":/etc/nginx \
 -p 80:80 \
 -p 443:443 \
 -d \
 nginx 

这次,去掉 --rm 参数,以便停止运行的时候保留容器。

至此,配置完成。

验证

浏览器中分别打开

sign.famend.cn:80
sign.famend.cn:89
sign.famend.cn:449
sign.famend.cn:443 

都能正常访问。当然,打开449和443时候,可以发现两个URL使用的证书不一样。449是LetsEncrypt提供的,有效期90天;443来自腾讯(颁发机构TrustAsia),有效期1年。

当然,ServiceDocker中的另外一个网站famend.cn,也可以访问:

famend.cn:80
famend.cn:89

总结

以上所述是小编给大家介绍的使用Nginx实现服务器中多容器共存的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • Docker容器配置Nginx实例分享

    作为目前最火的应用,Docker 确实存在着其独到之处,无论是程序猿还是运维都应该听说过 Docker 的大名,Docker 已经走过了许多的坑,目前最新版本是 v1.11.0 版本,应该说是完全能承载开发使用和运维监控,这款工具能帮助我们高效的打包.发布和运行承载着应用程序的容器系统.而且收集日志.帮助 App 的快速开发都有很大作用. 容器和虚拟机,经常是被拿出来对比的两款产品,实际上两者有着根本的差别,虚拟机是完全模拟了一台真实计算机,在上面运行的系统可能或者不可能知道自己运行在虚拟化环境

  • Docker容器中运行nginx

    nginx简介 Nginx是一款面向性能设计的HTTP服务器,相较于Apache.lighttpd具有占有内存少,稳定性高等优势.与旧版本(<=2.2)的Apache不同,nginx不采用每客户机一线程的设计模型,而是充分使用异步逻辑,削减了上下文调度开销,所以并发服务能力更强.整体采用模块化设计,有丰富的模块库和第三方模块库,配置灵活. 在Linux操作系统下,nginx使用epoll事件模型,得益于此,nginx在Linux操作系统下效率相当高.同时Nginx在OpenBSD或FreeBSD

  • 使用nginx搭建点播和直播流媒体服务器的方法步骤

    环境   centos7 nginx 1 安装nginx依赖包 yum install gcc gcc-c++ openssl-devel zlib-devel pcre pcre-devel yamdi 2.下载解压nginx_mod_h264_streaming,让nginx支持flv,mp4流播放   wget http://h264.code-shop.com/download/nginx_mod_h264_streaming-2.2.7.tar.gz 解压后需要修改src目录下的ngx

  • Nginx学习之静态文件服务器配置方法

    在Java开发以及生产环境中,最常用的web应用服务器当属Tomcat,尽管这只猫也能够处理一些静态请求,例如图片.html.样式文件等,但是效率并不是那么尽人意.在生产环境中,我们一般使用Nginx代理服务器来处理静态文件,来提升网站性能. 基本配置 server { listen 80; server_name file.52itstyle.com; charset utf-8; #root 指令用来指定文件在服务器上的基路径 root /data/statics; #location指令用

  • 用nginx搭建简单的文件下载服务器的方法

    1.修改nginx.conf配置文件,内容如下: server { listen 9000; #端口 server_name localhost; #服务名 charset utf-8; # 避免中文乱码 root E:\Download\java; #显示的根索引目录,注意这里要改成你自己的,目录要存在 location / { autoindex on; #开启索引功能 autoindex_exact_size off; # 关闭计算文件确切大小(单位bytes),只显示大概大小(单位kb.

  • 使用Nginx实现服务器中多容器共存的方法

    背景 有一台腾讯的Linux云主机,在服务器上部署了一个docker(称为ServiceDocker,名称为sign,下同),ServiceDocker内部使用了80.443.3306端口,分别映射到宿主机(云主机)的相同端口(即80.443.3306). ServiceDocker中安装了XAMPP,在此基础上部署了扫码签到小程序的服务器.ServiceDocker的80和443端口分别提供http和https服务,3306为MySQL数据库的端口. ServiceDocker绑定了域名sig

  • 在Nginx服务器中启用SSL的配置方法

    生成证书 可以通过以下步骤生成一个简单的证书: 首先,进入你想创建证书和私钥的目录,例如: $ cd /usr/local/nginx/conf 创建服务器私钥,命令会让你输入一个口令: $ openssl genrsa -des3 -out server.key 1024 创建签名请求的证书(CSR): $ openssl req -new -key server.key -out server.csr 在加载SSL支持的Nginx并使用上述私钥时除去必须的口令: $ cp server.ke

  • 详解Nginx服务器中配置超时时间的方法

    一.啥时候用到 用来设置请求资源和服务器返回的时间,保证一个请求占用固定时间,超出后报504超时!这样可以保证一个请求占用过长时间. 二.主要参数 使用nginx服务器如果遇到timeou情况时可以如下设置参数,使用fastcgi: fastcgi_connect_timeout 75;  链接 fastcgi_read_timeout 600;   读取 fastcgi_send_timeout 600;   发请求 这两个选项.          fastcgi_read_timeout是指

  • 使用nginx缓存服务器上静态文件的设置方法

    一.nginx缓存的优点 如图所示,nginx缓存,可以在一定程度上,减少源服务器的处理请求压力. 因为静态文件(比如css,js, 图片)中,很多都是不经常更新的.nginx使用proxy_cache将用户的请求缓存到本地一个目录.下一个相同请求可以直接调取缓存文件,就不用去请求服务器了. 毕竟,IO密集型服务的处理是nginx的强项. 二.如何进行设置 先上个栗子: http{ proxy_connect_timeout 10; proxy_read_timeout 180; proxy_s

  • 在Lighttpd服务器中运行Django应用的方法

    lighttpd (http://www.djangoproject.com/r/lighttpd/) 是一个轻量级的Web服务器,通常被用来提供静态页面的访问. 它天生支持FastCGI,因此除非你的站点需要一些Apache特有的特性,否则,lighttpd对于静态和动态页面来说都是理想的选择. 确保 mod_fastcgi 在模块列表中,它需要出现在 mod_rewrite 和 mod_access ,但是要在 mod_accesslog 之前. 将下面的内容添加到你的lighttpd的配置

  • 在Apache服务器中运行CGI程序的方法

    关于apache与CGI在这里就不解释了. 1.apache下载地址:http://www.apache.org,下面以2.0.63为例介绍运行CGI程序的配置. 2.下载Windows下的Perl解释器ActivePerl,官方网站:http://www.activestate.com/,最新版本ActivePerl-    5.10.0.1003,假设安装路径为c:\Perl. 3.修改apache的配置文件httpd.conf: <Directory "D:/Apache Group

  • Nginx服务器中强制使用缓存的配置及缓存优先级的讲解

    nginx代理做好了,缓存也配置好了,但是发现css.js.jpg这些静态文件统统都cached成功.但是偏偏页面文件依旧到源服务器取. 1. nginx不缓存原因 默认情况下,nginx是否缓存是由nginx缓存服务器与源服务器共同决定的, 缓存服务器需要严格遵守源服务器响应的header来决定是否缓存以及缓存的时常.header主要有如下: Cache-control:no-cache.no-store 如果出现这两值,nginx缓存服务器是绝对不会缓存的 Expires:1980-01-0

  • vscode 远程连接服务器docker容器的设置方法

    目录 拉取镜像 运行镜像(产生一个容器) 启动容器 进入容器 查看所有镜像 退出容器 重启容器 查看所有容器 删除容器 批量删除docker中已经停止的容器 vscode通过ssh远程连接服务器中的容器 拉取镜像 docker pull [options] name [:tag] 表示从仓库拉取镜像 options是参数 tag是版本 运行镜像(产生一个容器) docker run [options] image [:tag] [command] [arg-] 运行一个容器 以镜像为模版创建容器

  • 详解nginx服务器中的安全配置

    本篇文章详细的讲诉了nginx服务器中的安全配置,具体如下: 一.关闭SELinux 安全增强型Linux(SELinux)的是一个Linux内核的功能,它提供支持访问控制的安全政策保护机制. 但是,SELinux带来的附加安全性和使用复杂性上不成比例,性价比不高 sed -i /SELINUX=enforcing/SELINUX=disabled/ /etc/selinux/config /usr/sbin/sestatus -v #查看状态 二.通过分区挂载允许最少特权 服务器上 nginx

  • Nginx服务器中配置非80端口的端口转发方法详解

    nginx可以很方便的配置成反向代理服务器: server { listen 80; server_name localhost; location / { proxy_pass http://x.x.x.x:9500; proxy_set_header Host $host:80; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy

随机推荐