1. 程式人生 > >Docker安裝nginx以及負載均衡

Docker安裝nginx以及負載均衡

首先在linux系統中新建一個data資料夾進行nginx容器的建立--即為:mkdir data。

一:第一次

1 第一步:

使用 docker pull nginx將nginx的映象從倉庫下載下來。

2 第二步使用映象檔案建立nginx容器:

docker run -p 80:80 --name mynginx -v $PWD/www:/www -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf -v $PWD/logs:/wwwlogs  -d nginx

會出現錯誤:

複製程式碼
[[email protected] overlay2]# docker run -p 80:80 --name mynginx -v $PWD/www:/www -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf -v $PWD/logs:/wwwlogs  -d nginx  
13bdd883e2d3854231ea92aee362592d2b3cfefbd5b71b7001a4289ddeb57470
/usr/bin/docker-current: Error response from daemon: oci runtime error: container_linux.go:247: starting container process caused "process_linux.go:364: container init caused \"rootfs_linux.go:54: mounting \\\"/var/lib/docker/overlay2/conf/nginx.conf\\\" to rootfs \\\"/var/lib/docker/overlay2/e7f9d2c6c6b5ea9b3d494e2a4031218acd5c0ccce5225faab2b851d657eedfd6/merged\\\" at \\\"/var/lib/docker/overlay2/e7f9d2c6c6b5ea9b3d494e2a4031218acd5c0ccce5225faab2b851d657eedfd6/merged/etc/nginx/nginx.conf\\\" caused \\\"not a directory\\\"\"
" : Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type.
複製程式碼

使用 docker rm myginx刪除mynginx容器。換一種思路。

二:第二次

1 使用命令:

docker run -p 80:80 --name mynginx -v $PWD/www:/www  -v $PWD/logs:/wwwlogs  -d nginx

成功啟動這一次沒有掛載nginx.con配置檔案。

2 然後使用如下命令進入互動式終端:

1docker exec -it mynginx /bin/bash

3 然後使用如下命令找到nginx.conf 配置檔案。

[email protected]:/# cd /etc/nginx/ 
[email protected]:/etc/nginx# ls
conf.d    fastcgi_params    koi-utf  koi-win  mime.types  modules  nginx.conf  scgi_params    uwsgi_params  win-utf

4 最後使用exit命令退出互動式終端,使用如下命令進行配置檔案的拷貝,將其貼上到/root/conf/nginx.con.

注意:a )最後加/就是資料夾,不加/就是檔案如下命令所示,前面的nginx.conf 和後面的nginx.conf 都是檔案,所以沒有以/結尾。

   b ) 95e2b70fdf49與上面的[email protected]要對應。

docker cp 95e2b70fdf49:/etc/nginx/nginx.conf $PWD/conf/nginx.conf #使用id或names【mynginx】

此時已經成功配置使用ip+80埠即可訪問。但是在修改/root/conf/nginx.conf檔案實現負載均衡的時候不起作用。你就發現還沒完成任務需要使用docker rm mynginx重新刪除nginx容器,再次使用第一次使用的命令重新新建nginx容器:

docker run -p 80:80 --name mynginx -v $PWD/www:/www -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf -v $PWD/logs:/wwwlogs  -d nginx

成功開啟nginx服務。使用ip+80埠成功訪問,修改/root/conf/nginx.conf配置檔案即可生效。可以進行配置負載均衡。注意負載均衡的配置中容器中的ip地址。

 三 、負載均衡

注意:如果是在部署伺服器的時候在nginx.conf配置檔案直接配置內網ip+埠號即可,但是如果是在一個虛擬機器上安裝一個linux作業系統自行測試的時候,需要使用命令docker exec -it tomcat /bin/bash 進入tomcat容器互動式終端,使用ifconfig檢視ip埠,然後在配置檔案進行指定。

詳細解釋:

1)自己購買的雲伺服器端配置:

  首先有負載均衡伺服器、應用1伺服器、應用2伺服器三臺伺服器,因為三個伺服器在一個相同的區域網內直接在nginx配置檔案中使用內網ip+埠號即可指定,執行過程如下:

  負載均衡請求--》應用1或2伺服器主機ip+埠--》自動對映到docker裡面的tomcat容器的埠。

2)自己在虛擬機器建立一個linux主機。

  首先在一個主機上使用docker建立nginx和多個tomcat容器【不同埠號】,多個容器【tomcat、mysql、redis。nginx等】是在一個內部同一個區域網,

  在此時配置的時候需要指定的是tomcat容器內部的ip地址。使用docker exec -it tomcat /bin/bash 進入tomcat容器互動式終端,使用ifconfig檢視ip埠,但是會提示在此容器不能使用ifconfig命令,需要使用apt-get install net-tools 、apt-get update、apt-get install net-tools【依次使用】命令下載安裝。然後再是inconfig可以檢視到ip地址,最後直接在配置檔案直接指定即可。命令如下,我的ifconfig已經安裝過。

複製程式碼
[[email protected] conf]# docker exec -it mytomcat /bin/bash
[email protected]:/usr/local/tomcat# ls
LICENSE  NOTICE  RELEASE-NOTES    RUNNING.txt  bin  conf    include  lib  logs  native-jni-lib  temp  usr  webapps    work
[email protected]:/usr/local/tomcat# cd webapps/
[email protected]:/usr/local/tomcat/webapps# ls
ROOT  docs  examples  host-manager  manager  wlsweb
[email protected]:/usr/local/tomcat/webapps# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 0.0.0.0
        inet6 fe80::42:acff:fe11:2  prefixlen 64  scopeid 0x20<link>
        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)
        RX packets 8  bytes 648 (648.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 8  bytes 648 (648.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
複製程式碼

nginx.conf負載均衡配置如下:

複製程式碼
  upstream cetc{
    ip_hash;
      server  172.17.0.2:8080;
    }
    server {
        listen       80;
        server_name  10.23.57.129;
    location / {
        proxy_pass http://cetc;
        proxy_set_header        Host $host;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        client_max_body_size    10m;
        client_body_buffer_size 128k;
        proxy_connect_timeout   300;
        proxy_send_timeout      300;
        proxy_read_timeout      300;
        proxy_buffer_size       4k;
        proxy_buffers           4 32k;
        proxy_busy_buffers_size 64k;
        proxy_temp_file_write_size 64k;
        add_header Access-Control-Allow-Origin *;
        index index.jsp index.html index.htm;
        rewrite ^/$ /wlsweb;        
           }
     }
複製程式碼

上面兩個紅色標記處ip應該對應。使用docker restart nginx重啟nginx ,訪問測試成功。

最後注意:在自己的虛擬機器上玩,每次重新開啟linux執行docker各個容器的時候ip地址會隨機變化,所以很可能是你之前配置的ip沒有對應上,測試nginx會出現nginx 502 bad gateway,還沒有找到固定容器ip地址的方法。。。