-----------基于Docker的多种服务器搭建-----------

开发环境

本机上的虚拟机

Centos7.4

Docker1.13.1

Openssl1.1.1

1 Nginx

1.1 HTTP

1. 创建Dockerfile

2. 创建镜像

docker build -t nginx_http

3. 创建容器测试

(1) 不挂载:

docker run --name nginx81 -p 81:80 -d nginx_http

测试网页和容器下的html目录都能正常访问

(2) 挂载:

docker run --name nginx83 -p 83:80 -d -v $PWD/html:/usr/share/nginx/html nginx_http

挂载主机目录Docker访问出现Permission denied

网页访问出现403 Forbidden

原因是CentOS7中的安全模块selinux把权限禁掉了,至少有以下三种方式解决挂载的目录没有权限的问题:

1)  在运行容器的时候,给容器加特权,及加上 --privileged=true 参数

2)  临时关闭selinux:setenforce 0

3)  添加selinux规则,改变要挂载的目录的安全性文本

docker run --name nginx83 -p 83:80 -d -v $PWD/html:/usr/share/nginx/html --privileged=true nginx_http

添加权限后测试网页和容器目录能正常访问

1.2 HTTPS

1. 准备配置文件default.conf

直接从容器中拷贝default.conf

docker cp nginx81:/etc/nginx/conf.d/default.conf ./

2. 通过openssl生成证书和私钥

(1)生成21024位的加密私钥,这里需要设置两遍密码,生成server.key

openssl genrsa -des3 -out server.key 1024

(2)生成证书签名请求(CSR),需要填写许多信息,如国家,省市,公司等

openssl req -new -key server.key -out server.csr

(3)去除密码

1.    mv server.key server.key.org
2. openssl rsa -in server.key.org -out server.key

(4)生成类型为X509的自签名证书。有效期设置365天

openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

完成这一步之后就得到了我们需要的证书文件server.crt和私钥server.key

3. 配置nginx服务器,支持https访问

修改配置文件default.conf,添加ssl支持

4. 创建Dockerfile

5. 生成镜像

docker build -t nginx_https . 

6.生成容器测试

docker run --name nginx448 -p 448:443 -d nginx_https

访问测试网页

1.3 HTTP2

1. 准备配置文件default.conf

直接从容器中拷贝default.conf

docker cp nginx81:/etc/nginx/conf.d/default.conf ./

2. 通过openssl生成证书和私钥

使用1.2节中生成的证书和私钥,将生成的crt和key存入ssl目录中

3. 配置nginx服务器,支持https访问

修改配置文件default.conf,添加ssl支持、配置安全选项,具体配置如下

4. 创建Dockerfile

5. 生成镜像

docker build -t nginx_http2 .

6.生成容器测试

docker run --name nginx449 -p 449:443 -d nginx_http2 

访问测试网页

这里可以看到,协议已变成了HTTP/2.0

2 Apache

2.1 HTTP

1. 创建Dockerfile

2. 创建镜像

docker build -t apache_http . 

3. 创建容器测试

docker run --name apache85 -p 85:80 -d apache_http

访问测试网页

2.2 HTTPS

1. 准备配置文件httpd.confhttpd-ssl.conf

直接从容器中拷贝httpd.conf、httpd-ssl.conf

1.    docker cp apache85:/usr/local/apache2/conf/httpd.conf ./
2. docker cp apache85:/usr/local/apache2/conf/extra/httpd-ssl.conf ./

2. 通过openssl生成证书和私钥

同1.2节中证书和私钥生成步骤,将生成的crt和key存入ssl目录中

3. 修改httpd-ssl.conf文件指定相关秘钥和证书位置

修改

1.    ServerName www.server.com:443
2. SSLCertificateFile "/usr/local/apache2/conf/server.crt"
3. SSLCertificateKeyFile "/usr/local/apache2/conf/server.key"

4. 修改Apache主配置文件并开启相关模块

1.    // 打开相关的注释,启用需要的模块
2. LoadModule rewrite_module modules/mod_rewrite.so
3. LoadModule ssl_module modules/mod_ssl.so
4. LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
5. Include conf/extra/httpd-ssl.conf
6. // 修改主机名
7. ServerName www.server.com

5. 创建Dockerfile

6. 生成镜像

docker build -t apache_https . 

7.生成容器测试

docker run --name apache444 -p 444:443 -d apache_https 

访问测试网页

2.3 HTTP2

1. 准备配置文件httpd.confhttpd-ssl.conf

直接从容器中拷贝httpd.conf、httpd-ssl.conf

1.    docker cp apache85:/usr/local/apache2/conf/httpd.conf ./
2. docker cp apache85:/usr/local/apache2/conf/extra/httpd-ssl.conf ./

2. 通过openssl生成证书和私钥

使用1.2节中生成的证书和私钥,将生成的crt和key存入ssl目录中

3. 修改httpd-ssl.conf文件指定相关秘钥和证书位置

修改

1.    ServerName www.server.com:443
2. SSLCertificateFile "/usr/local/apache2/conf/server.crt"
3. SSLCertificateKeyFile "/usr/local/apache2/conf/server.key"

4. 修改Apache主配置文件httpd.conf,并开启httpshttp2相关模块

1.    //打开相关的注释,启用需要的模块
2. LoadModule rewrite_module modules/mod_rewrite.so
3. LoadModule ssl_module modules/mod_ssl.so
4. LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
5. Include conf/extra/httpd-ssl.conf
6. LoadModule http2_module modules/mod_http2.so
7. //修改主机名
8. ServerName www.server.com

5. 启用 HTTP2 协议

默认情况下,服务器并没有启动 HTTP/2 协议,用新的 Protocols 指令启用 HTTP/2 协议

Protocols h2 http/1.1

6. 创建Dockerfile

7. 生成镜像

docker build -t apache_http2 .  

6.生成容器测试

docker run --name apache446 -p 446:443 -d apache_http2 

访问测试网页

这里可以看到,协议已变成了HTTP/2.0

3 Tomcat

3.1 HTTP

1. 创建Dockerfile

这里需要在容器的/usr/local/tomcat/webapps下创建html目录,用来存放网页

2. 创建镜像

docker build -t tomcat_http . 

3. 创建容器测试

docker run --name tomcat8080 -p 8080:8080 -d tomcat_http

访问测试网页

3.2 HTTPS

1. 准备配置文件server.xml

直接从容器中拷贝server.xml

docker cp tomcat8080:/usr/local/tomcat/conf/server.xml ./ 

2. 通过openssl生成证书和私钥

同1.2节中证书和私钥生成步骤,将生成的crt和key存入ssl目录中

3. 修改server.xml配置文件,配置https服务

4. 创建Dockerfile

同样,需要在容器的/usr/local/tomcat/webapps下创建html目录,用来存放网页

5. 生成镜像

docker build -t tomcat_https . 

6.生成容器测试

docker run --name tomcat445 -p 445:443 -d tomcat_https

访问测试网页

3.3 HTTP2

1. 准备配置文件server.xml

直接从容器中拷贝server.xml

docker cp tomcat8080:/usr/local/tomcat/conf/server.xml ./ 

2. 通过openssl生成证书和私钥

使用1.2节中生成的证书和私钥,将生成的crt和key存入ssl目录中

3. 修改server.xml配置文件,配置https、启用http2

<UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />

4. 创建Dockerfile

同样,需要在容器的/usr/local/tomcat/webapps下创建html目录,用来存放网页

5. 生成镜像

docker build -t tomcat_http2 . 

6.生成容器测试

docker run --name tomcat447 -p 447:443 -d tomcat_http2 

访问测试网页

这里可以看到,协议已变成了HTTP/2.0

4 Lighttpd

4.1 HTTP

1. 创建Dockerfile

2. 创建镜像

docker build -t lighttpd_http . 

3. 创建容器测试

docker run -d -–name=lighttpd8081 -p 8081:80  lighttpd_http bash

测试网页和容器下的html目录都能正常访问

4.2 HTTPS

1. 通过openssl生成证书

生成类型为X509的自签名证书。有效期设置365天。需要填写许多信息,如国家,省市,公司等

openssl req -new -x509 -keyout server.pem -out server.pem -days 365 -nodes

2. 配置lighttpd服务器,支持https访问

修改配置文件lighttpd.conf,添加ssl支持

4. 创建Dockerfile

5. 生成镜像

docker build -t lighttpd_https .

6.生成容器测试

docker run -d -–name=lighttpd8082 -p 8082:443  lighttpd_https bash

访问测试网页

4.3 HTTP2

Lighttpd目前不支持HTTP/2

当前lighttpd版本是1.4.5

5 Caddy

5.1 HTTP

1. 创建Dockerfile

2. 创建镜像

docker build -t caddy_http . 

3. 创建容器测试

docker run -d -–name=caddy8084 -p 8084:80  caddy_http

测试网页和容器下的html目录都能正常访问

失败情况

5.2 HTTPS

5.3 HTTP2

5.4 QUIC

Quic在具有TSL基础上采用CMD命令

caddy -conf /etc/Caddyfile -quic

开启服务,所以首要条件就是要先搭建出HTTPS协议

试用了多种Caddyfile写法

有的无法启动容器,有的启动容器成功但无法连接服务器,还有可连接到服务器,但出现:No such site at:443

到目前为止,下面这种写法是最接近成功的,需要再实验

写在文末:

本文是18年暑期入组培训的时候跟师妹一起完成报告,其中大部分工作都是师妹完成的,在此感谢师妹zhanglei

基于Docker的服务器搭建的更多相关文章

  1. 基于CentOS7的服务器搭建(LAMP环境)

    基于CentOS7的服务器环境搭建(LAMP环境) 一.安装MySQL组件 1.由于在CentOS7中,默认yum安装库中不含有mysql,我们可以下载mysql的分支MariaDB,如果必须要下my ...

  2. 基于Docker和Golang搭建Web服务器

    1 场景描述 基于centos7的docker镜像搭建golang开发环境 在docker容器内,使用golang实现一个Web服务器 启动docker容器,并在容器内启动Web服务器 我购买了一个最 ...

  3. 基于docker+reveal.js搭建一个属于自己的在线ppt网站

    前言 最近热衷于Docker,由于这段时间使用Docker来折腾自己的服务器,越来越感觉这是一种及其被应该推广的技术,因此想在公司内部也做一次技术分享.当然,如果只是做的PPT,我就不写这文章了.既然 ...

  4. 金瓯无缺江河一统|Win10系统基于Docker和Python3搭建并维护统一认证系统OpenLdap

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_180 OpenLdap(Lightweight Directory Access Protocol)是什么?它其实是一个开源的.具 ...

  5. 基于Docker+Jenkins+Gitlab搭建持续集成环境

    随着DevOps理念和敏捷理念的发展,我们希望通过自动化技术,加快项目的迭代.尤其是当使用微服务方案后,面临在大量的项目构建和部署工作,借助于jenkins的持续集成,可以快速把应用打包成docker ...

  6. 基于Docker的GitLab搭建

    今天写一些Docker搭建GitLab,好久没有写博客园了,今天又回来了,为了学习技术? 建议使用Linux内核系统,或者虚拟机,首先安装docker环境(菜鸟教程) 一.下载镜像文件 如果慢的话,可 ...

  7. 基于docker的sqli-labs搭建

    一键代码: curl https://files-cdn.cnblogs.com/files/kagari/sqli-labs.sh|bash https://files-cdn.cnblogs.co ...

  8. 基于 Docker 的 DevOps 搭建

    一直对 DevOps 感兴趣,最近心血来潮,搭乘 Docker 搞一搞,Let‘s Go !!! 1.拉取 GitLab  docker pull gitlab/gitlab-ce 2.Run Git ...

  9. 基于docker环境,搭建 jetty环境, 部署java项目

    前提: 1.Ubuntu 系统. 2.docker环境已经安装好. 实现步骤: 1.上docker hub 下载jetty docker 镜像. 执行命令:$ sudo docker pull jet ...

随机推荐

  1. Java红黑树详谈

    定义 红黑树的主要是想对2-3查找树进行编码,尤其是对2-3查找树中的3-nodes节点添加额外的信息.红黑树中将节点之间的链接分为两种不同类型,红色链接,他用来链接两个2-nodes节点来表示一个3 ...

  2. Confluence 6 连接到 Jira 用户管理的限制

    当你在使用 JIRA 目录为用户目录的时候,请考虑下面的一些限制和建议. 不知道跨平台的多应用单点登录 当你使用 JIRA 为你的目录管理器的时候,系统将不能支持跨平台的单点登录.当 JIRA 用作目 ...

  3. yolov3 安装训练

    https://blog.csdn.net/helloworld1213800/article/details/79749359 https://blog.csdn.net/lilai619/arti ...

  4. kafka消息存储与partition副本原理

    消息的存储原理: 消息的文件存储机制: 前面我们知道了一个 topic 的多个 partition 在物理磁盘上的保存路径,那么我们再来分析日志的存储方式.通过 ll /tmp/kafka-logs/ ...

  5. ActiveMQ消息的消费原理

    消费端消费消息: 在 初识ActiveMQ 中我提到过,两种方法可以接收消息,一种是使用同步阻塞的ActiveMQMessageConsumer#receive方法.另一种是使用消息监听器Messag ...

  6. C++ Primer 笔记——迭代器

    iostream迭代器 1.虽然iostream类不是容器,但是标准库定义了可以用于IO的迭代器.创建一个流迭代器的时候必须指定要读写的类型.我们可以对任何具有输入运算符(>>)的类型定义 ...

  7. java & python猜数字游戏对比

    1.java版 package day03; import java.util.Random;import java.util.Scanner; /** * 猜数字游戏 * 随机生成一个1-100之间 ...

  8. VUE,页面跳转传多个参数

    <template> <a @click="goNext">Next</a> <input type="text" v ...

  9. Ubuntu点击dash home就崩溃

    很崩溃的一个问题,搞了好久.并没有很清楚的知道具体哪个细节导致的问题,只是大概知道了原因,以及搞出了一个解决方案. 问题描述 台式机,没有独立显卡,也就是只有一个intel CPU在一起的小破显卡(我 ...

  10. 一脸懵逼学习Linux的Shell编程

    1:什么是Shell??? (1)Shell是用户与内核进行交互操作的一种接口,目前最流行的Shell称为bash Shell(2)Shell也是一门编程语言<解释型的编程语言>,即she ...