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]#