docker(20):docker-compose构建web服务和集群

docker(20):docker-compose构建web服务和集群

1  写在前面

我们常见的服务架构是lnmp或者Nginx—tomcat集群—MySQL这种。

我们用开源的WordPress博客项目作为样板

https://www.cnblogs.com/mushou/p/9537846.html

https://blog.csdn.net/qq_42036824/article/details/88785692

 

2  单实例的web服务—Wordpress

2.1  docker-compose.yml

version: '3'
services:
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress
   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     volumes:
       - web_data:/var/www/html
     ports:
       - "80:80"  #直接映射80
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
volumes:
    db_data:
    web_data:

 

 

2.2  编排启动

[root@docker-136 mywordpress]# docker-compose up -d                     
Creating network "mywordpress_default" with the default driver
Creating volume "mywordpress_web_data" with default driver
Creating volume "mywordpress_db_data" with default driver
Creating mywordpress_db_1 ... done
Creating mywordpress_wordpress_1 ... done
[root@docker-136 mywordpress]#
[root@docker-136 mywordpress]# docker ps -a                 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                 NAMES
daa818f0c35e        wordpress:latest    "docker-entrypoint.s…"   3 seconds ago       Up 2 seconds        0.0.0.0:80->80/tcp    mywordpress_wordpress_1
c507131b5799        mysql:5.7           "docker-entrypoint.s…"   4 seconds ago       Up 3 seconds        3306/tcp, 33060/tcp   mywordpress_db_1
[root@docker-136 mywordpress]# docker volume ls
DRIVER              VOLUME NAME
local               mywordpress_db_data
local               mywordpress_web_data
[root@docker-136 mywordpress]#

 

 

2.3  页面测试

 

 

 

3  负载均衡-宿主机Nginx

这种方式直接在宿主机安装Nginx,根据容器的映射端口手动添加端口

docker-compose up -d --scale wordpress=3 这种copy方式启动,docker-compose.yml 容器不能指定映射端口,端口都是随机的,需要不停的修改Nginx的配置。

4  负载均衡-容器Nginx

我们把Nginx反向代理负载均衡做成容器,一并启动,只需要把Nginx的配置文件写好,主要就是写web的数目和scale启动时保持一致就行。相对方便很多

[root@docker-136 mywordpress-lb]# pwd
/opt/mywordpress-lb
[root@docker-136 mywordpress-lb]# ls
docker-compose.yml  nginx
[root@docker-136 mywordpress-lb]# tree 
.
├── docker-compose.yml
└── nginx
    ├── conf
    │   └── nginx.conf
    └── logs
        ├── access.log
        └── error.log

3 directories, 4 files

 

4.1  docker-compose.yml

# cat docker-compose.yml 
version: '3'
services:
   wordpress_db:
     image: mysql:5.7
     volumes:
       - wordpress_db_data:/var/lib/mysql #射mysql的数据目录到容器,保存数据
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress:
     depends_on:
       - wordpress_db
     image: wordpress:latest
     volumes:
       - wordpress_web_data:/var/www/html  #映射WordPress数据目录到容器,保存数据
     ports:
       - "80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: wordpress_db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
   nginx:
    image: nginx:latest
    restart: always
    volumes:
        - ./nginx/conf/nginx.conf:/etc/nginx/nginx.conf     #映射nginx的配置文件到容器里,这个不写入容器主要是方便修改配置
        - ./nginx/logs/:/var/log/nginx/      
    depends_on:
       - wordpress_db
    links:
       - wordpress #连接 wordpress镜像
    ports: 
       - "80:80"

volumes:
    wordpress_db_data:
wordpress_web_data:

 

 

4.2  Nginx配置文件(3个web实例)

[root@docker-136 mywordpress-lb]# cat nginx/conf/nginx.conf 
user  nginx;
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
upstream wordpress{
    server wordpress_1:80;
    server wordpress_2:80;
    server wordpress_3:80;
}
    server{
    listen      80;
    server_name localhost;
    location / {
    proxy_pass  http://wordpress;
    proxy_set_header    Host $host;
    proxy_set_header        X-Real-IP $remote_addr;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    }
   }
}

 

 

4.3  启动(3个web实例)

[root@docker-136 mywordpress-lb]# docker-compose  up -d --scale wordpress=3
Creating network "mywordpress-lb_default" with the default driver
Creating volume "mywordpress-lb_wordpress_web_data" with default driver
Creating volume "mywordpress-lb_wordpress_db_data" with default driver
Creating mywordpress-lb_wordpress_db_1 ... done
Creating mywordpress-lb_wordpress_1    ... done
Creating mywordpress-lb_wordpress_2    ... done
Creating mywordpress-lb_wordpress_3    ... done
Creating mywordpress-lb_nginx_1        ... done
[root@docker-136 mywordpress-lb]# docker volume ls                  
DRIVER              VOLUME NAME
local               mywordpress-lb_wordpress_db_data
local               mywordpress-lb_wordpress_web_data
local               mywordpress_db_data
local               mywordpress_web_data
[root@docker-136 mywordpress-lb]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
62dbb465cad0        nginx:latest        "nginx -g 'daemon of…"   29 seconds ago      Up 24 seconds       0.0.0.0:80->80/tcp      mywordpress-lb_nginx_1
2c7e0a8713c0        wordpress:latest    "docker-entrypoint.s…"   34 seconds ago      Up 24 seconds       0.0.0.0:32795->80/tcp   mywordpress-lb_wordpress_2
d339c167d40d        wordpress:latest    "docker-entrypoint.s…"   34 seconds ago      Up 24 seconds       0.0.0.0:32796->80/tcp   mywordpress-lb_wordpress_3
8d99bb07d163        wordpress:latest    "docker-entrypoint.s…"   34 seconds ago      Up 29 seconds       0.0.0.0:32793->80/tcp   mywordpress-lb_wordpress_1
15cea24ce231        mysql:5.7           "docker-entrypoint.s…"   36 seconds ago      Up 33 seconds       3306/tcp, 33060/tcp     mywordpress-lb_wordpress_db_1
[root@docker-136 mywordpress-lb]# docker exec -it mywordpress-lb_nginx_1 /bin/bash
root@62dbb465cad0:/# cat /etc/nginx/nginx.conf  #容器的Nginx配置文件
user  nginx;
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
upstream wordpress{
    server wordpress_1:80;
    server wordpress_2:80;
    server wordpress_3:80;
}
    server{
    listen      80;
    server_name localhost;
    location / {
    proxy_pass  http://wordpress;
    proxy_set_header    Host $host;
    proxy_set_header        X-Real-IP $remote_addr;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    }
   }
}
root@62dbb465cad0:/#

 

 

4.4  页面测试

 

 

 

4.5 测试负载均衡功能

添加一个infi.php

[root@docker-136 mywordpress-lb]# docker volume ls
DRIVER              VOLUME NAME
local               mywordpress-lb_wordpress_db_data
local               mywordpress-lb_wordpress_web_data
[root@docker-136 mywordpress-lb]# docker volume inspect  mywordpress-lb_wordpress_web_data
[
    {
        "CreatedAt": "2019-08-16T14:01:44+08:00",
        "Driver": "local",
        "Labels": {
            "com.docker.compose.project": "mywordpress-lb",
            "com.docker.compose.version": "1.24.1",
            "com.docker.compose.volume": "wordpress_web_data"
        },
        "Mountpoint": "/var/lib/docker/volumes/mywordpress-lb_wordpress_web_data/_data",
        "Name": "mywordpress-lb_wordpress_web_data",
        "Options": null,
        "Scope": "local"
    }
]
[root@docker-136 mywordpress-lb]# cd /var/lib/docker/volumes/mywordpress-lb_wordpress_web_data/_data
[root@docker-136 _data]# ls
index.php    wp-activate.php     wp-comments-post.php  wp-content   wp-links-opml.php  wp-mail.php      wp-trackback.php
license.txt  wp-admin            wp-config.php         wp-cron.php  wp-load.php        wp-settings.php  xmlrpc.php
readme.html  wp-blog-header.php  wp-config-sample.php  wp-includes  wp-login.php       wp-signup.php
[root@docker-136 _data]# vim info.php
[root@docker-136 _data]# echo "<?php phpinfo(); ?> " >> info.php
[root@docker-136 _data]#

 

 

 

 

浏览器访问info.php

 

 

 

 

 

停掉两个web容器,也不影响访问

[root@docker-136 mywordpress-lb]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
62dbb465cad0        nginx:latest        "nginx -g 'daemon of…"   15 minutes ago      Up 23 seconds       0.0.0.0:80->80/tcp      mywordpress-lb_nginx_1
2c7e0a8713c0        wordpress:latest    "docker-entrypoint.s…"   16 minutes ago      Up 15 minutes       0.0.0.0:32795->80/tcp   mywordpress-lb_wordpress_2
d339c167d40d        wordpress:latest    "docker-entrypoint.s…"   16 minutes ago      Up 15 minutes       0.0.0.0:32796->80/tcp   mywordpress-lb_wordpress_3
8d99bb07d163        wordpress:latest    "docker-entrypoint.s…"   16 minutes ago      Up 15 minutes       0.0.0.0:32793->80/tcp   mywordpress-lb_wordpress_1
15cea24ce231        mysql:5.7           "docker-entrypoint.s…"   16 minutes ago      Up 15 minutes       3306/tcp, 33060/tcp     mywordpress-lb_wordpress_db_1
[root@docker-136 mywordpress-lb]# docker stop  mywordpress-lb_wordpress_1
mywordpress-lb_wordpress_1
[root@docker-136 mywordpress-lb]# docker stop  mywordpress-lb_wordpress_2
mywordpress-lb_wordpress_2
[root@docker-136 mywordpress-lb]# curl -I 192.168.0.136/info.php
HTTP/1.1 200 OK
Server: nginx/1.17.2
Date: Fri, 16 Aug 2019 06:18:02 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/7.3.8

[root@docker-136 mywordpress-lb]#

 

posted on 2019-08-16 16:07  光阴8023  阅读(1025)  评论(0编辑  收藏  举报