1. 程式人生 > >基於Docker的服務器搭建

基於Docker的服務器搭建

ima bubuko nod build protoc 去除 沒有權限 公司 安全

-----------基於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的服務器搭建