本篇概要:

  • 1. 搭建 CentOS + Nginx 容器、commit 提交、在容器主机文件互拷;
  • 2. Docker Compose 以及启动多个 Web 容器;
  • 3. Docker network、容器网络、容器间互相访问;
  • 4. (案例)Docker compose 创建网络、指定容器 IP、启动简单 Nginx 负载均衡;

1. 搭建 CentOS + Nginx 容器、commit 提交、在容器主机文件互拷;

搭建 Nginx 镜像

  • 用最早的镜像 CentOS,利用交互式方式进入后安装(使用 yum 或者编译安装都是可以的)
  • 提示:有些操作在 Dockerfile 里很难把它写出来(写完整或者写的完全没有问题),所以有时候需要进入容器对里面的内容进行操作。操作完成后,因为容器是不保存内容的,一旦容器被删除了,里面的内容就没有了。所以有时候会把代码文件放在主机里面,利用 -v 参数和容器进行映射,这时候要是容器宕掉了或者误删了,就没有关系,真实数据还是保留在主机里面的。
  • 那在容器里面如果做了改动,要进行保存,操作如下
# 打开终端 1,创建临时容器
# --privileged 启动管理员权限
docker run -it --privileged --name tmp centos /usr/sbin/init# 运行上面命令后,会卡住
# 打开终端 2,进入容器
docker exec -it tmp /bin/bash# 安装 Nginx
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
yum install nginx -y# 设置开机启动
systemctl enable nginx# 启动 Nginx
systemctl start nginx# yum 默认安装,配置文件会在 /etc/ 目录下
# 因为已经对这个容器做了一些操作,所以需要保存容器,下次就不需要重新安装一遍
# 所以把这个容器作为一个新的镜像保存起来,需要用到 docker commit
# 把修改好的容器,提交成一个新的镜像
# 文档:https://docs.docker.com/engine/reference/commandline/commit/#description
# 先退出镜像
exit# 这样就创建出一个新镜像
# 因为没有使用 Dockerfile,所以希望容器启动的时候执行一些命令,比如 usr/sbin/init 和暴露 80 端口
# 这些都是可以在 Dockerfile 里写的内容
# -c:应用 Dockfile 里的结构去创建一个 image,因为直接 commit 可能会出现问题,必须要用 Dockerfile 里的命令
# 如果有多个命令,就写多个 -c
docker commit -c 'CMD ["/usr/sbin/init"]' -c "EXPOSE 80" tmp centos:nginx# 接下去要基于新的镜像,创建一个新的容器,然后把容器里的文件映射到主机(比如配置文件)
# 配置文件肯定是需要持久化的,不能不做任何处理的存在容器里的,因此需要拷贝
# 首先把 Nginx 配置文件从容器里拷贝出来
# docker cp:容器里的文件拷贝到主机,也可以主机文件拷贝到容器
# 参考文档:https://docs.docker.com/engine/reference/commandline/cp/
# 现在执行从容器拷贝到主机
mkdir -p /home/[用户名]/nginx/conf
docker cp tmp:/etc/nginx/nginx.conf /home/[用户名]/nginx/conf/# 此时之前创建的 tmp 容器就可以删除了
# 创建一个新容器叫 mynginx
# 主机端口 9090 映射到 容器 80
# 主机的 nginx.conf 和容器里的对应
# 之后修改配置只需要改主机的 nginx.conf,不需要进入容器去改
# 实际操作中,尽量不要去反复操作容器,容器不是持久化的,也不可能每做一个改动就去 commit 一个新镜像
# centos:nginx 是刚才创建的镜像名
# 执行后 docker images 出现一个新镜像 mynginx
docker run --name mynginx --privileged \
-p 9090:80 -v /home/[用户名]/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-d centos:nginx

2. Docker Compose 以及启动多个 Web 容器;

# 准备工作
# 之前创建的 centos:jdk 容器,里面安装了apache 和 jdk,重复利用一下
mkdir -p /home/[用户名]/nginx/web1/
mkdir -p /home/[用户名]/nginx/web2/
docker run --name web1 -d -p 8080:80 --privileged -v /home/[用户名]/nginx/web1/:/var/www/html/ centos:jdk
docker run --name web2 -d -p 8081:80 --privileged -v /home/[用户名]/nginx/web2/:/var/www/html/ centos:jdk# 如果 web1 容器不想要了
docker stop web1 && docker stop web1# 总结,创建容器的话,会有很多复杂的参数,映射很多目录,很多端口,以及在实际开发中会有几十个容器
# 不可能每一个容器都去执行这么多命令(手工拷贝、一条条执行,删容器要一条条删)
# 所以需要用到编排工具 Docker Compose:https://docs.docker.com/compose/overview/
# Docker 构建工具、容器编排的工具,可以配置并启动多个容器,适合复杂业务场景(类似 js 工具 webpad)
# 需要创建一个配置文件,配置文件里写入一些相关配置和命令的参数
# 就可以一次性的把多个容器根据复杂的要求启动出来,也可以一次性的关闭和删除
# 比如现在只有一个 Dockerfile,镜像什么都没有,依然可以用 Docker Compose 来生成镜像并且启动容器
# 同时还能实现依赖管理
# 比如说之前创建的两个容器 web1 和 web2 做负载均衡用,所以创建容器之前必须有 Nginx 容器# Docker Compose 安装:https://docs.docker.com/compose/install/
# -L:有些网站有多次跳转,加入此参数随着网站跳转而跳转
# -o:把下载内容输出到指定路径的文件
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose# 对下载的文件赋予可执行权限
sudo chmod +x /usr/local/bin/docker-compose# 查看文件版本
docker-compose -v# 需要做一个配置,肯定要有配置文件叫 yaml
# yaml 类似于 json 或者 xml,但是格式更加简洁,使用一些缩进的方式编排
# 关于 yaml 检查的在线工具:http://www.yamllint.com
# 文档引导:https://docs.docker.com/compose/gettingstarted/#step-1-setup#step-3-define-services-in-a-compose-file
# 创建空文件夹
mkdir -p /home/[用户名]/mycompose
cd /home/[用户名]/mycompose
vim docker-compose.yml
# 写入如下内容
# services:服务,也可以认为是一些任务
# ports:如果是多个,就要写很多行
# volumes:代表映射
# version:支持的 compose 版本,最新的支持 version 3
# 还有一些参数,build(用于 Dockerfile)、command(Dockerfile 中的 CMD)
services: web1: container_name: web1image: "centos:jdk"ports: - "8080:80"privileged: truevolumes: - "/home/hua/nginx/web1/:/var/www/html/"web2: container_name: web2image: "centos:jdk"ports: - "8081:80"privileged: truevolumes: - "/home/hua/nginx/web2/:/var/www/html/"
version: "3"
# 写入内容结束
# 启动:https://docs.docker.com/compose/reference/up/
# up 命令可以对之前配置文件里是所写的内容进行启动
# 配置文件里创建的两个 service 全部启动,也可以指定单独的 service 启动
docker-compose up -d # 只停止一个容器
docker-compose stop web1# 删除容器
docker-compose rm web1

3. Docker network、容器网络、容器间互相访问;

目标:三个容器,一个 Nginx 两个 Web,通过容器和容器之间完成负载均衡

  • 如果把 Nginx 放到主机上,就非常简单了,主机和容器之间有端口映射,只要在 Nginx 里做一个配置,立马就可以完成
  • 如果 Nginx 本身也在一个容器里面,就涉及到容器和容器之间的访问(如何互相访问,IP 是什么)

一个 Nginx,两个 Web 启动的 Docker compose 配置文件

# 配置文件
services: nginx: container_name: mynginximage: "centos:nginx"ports: - "9090:80"privileged: truevolumes: - "/home/hua/nginx/conf/nginx.conf:/etc/nginx/nginx.conf"web1: container_name: web1image: "centos:jdk"ports: - "8080:80"privileged: truevolumes: - "/home/hua/nginx/web1/:/var/www/html/"web2: container_name: web2image: "centos:jdk"ports: - "8081:80"privileged: truevolumes: - "/home/hua/nginx/web2/:/var/www/html/"
version: "3"# 后台启动三个容器
docker-compose up -d

容器之间通过 IP 方式互相访问(docker network 网络设置)

  • 参考文档:https://docs.docker.com/engine/reference/commandline/network/#usage
# 查看网络
docker network ls
# 返回
NETWORK ID          NAME                DRIVER              SCOPE
ab368b5af331        bridge              bridge              local
1f23995f905a        host                host                local
5c34a7a8f019        none                null                local
# bridge:创建并启动一个容器,如果没有设置并且指定网络名称,则会自动加入 bridge(桥接模式)
# 一般会使用 bridge 模式做主机和容器之间的互通
# host:一般不会使用 host 模式,影响了 docker 的隔离机制,不是很安全
# none:就是没有网络
# * 如果不指定任何的网络,会创建以“文件夹名”加上“_default”的网络,是一个桥接网络# 检查 network
docker network inspect bridge
# IPAM.Config:包含子网和网关
# Containers.Name/EndpointID/MacAddress/IPv4Address/IPv6Address:当启动了容器之后
# 会有容器加入 Containers 里,配置文件就是这么写的
# 它自动分配了 IP 地址(IPv4)
# 找一个容器,交互式进入一下
docker exec -it mynginx /bin/bash
# 把容器里默认是没有 ifconfig 的,可以安装,也可以如下操作,查看 IP
cat /etc/hosts
# ping 其它容器的 IP
ping 172.17.0.4
# 访问其它容器(容器之间通过 IP 互通)
# IP 的分配依赖默认的桥接模式,创建一个虚拟的网络地址
curl http://172.19.0.4# 之前通过 docker-compose 启动了三个容器,如果没有做任何设置
# docker network ls 会自动出现 NAME 为 mycompose_default
# 这个部分也是可以自定义的,当创建并启动的时候,会自己创建一个网络
# 如果通过单独的命令,去启动创建一个网络,并且设置子网,产生一些 IP# 首先创建网络,参考:https://docs.docker.com/engine/reference/commandline/network_create/
docker network create -d bridge mynginx
# 再启动容器,这时创建的容器会加入“mynginx”这个网络
docker run -d --network=mynginx# docker network create 创建的网络由于没有加参数,所以没有什么意义
# 一般来说需要去指定,比如子网
# 子网掩码的计算地址:http://tool.chinaz.com/Tools/subnetmask
# 设置子网地址
docker network create -d bridge --subnet=192.128.0.0/16 mynginx
# 查看网络列表
docker network ls
# 列出刚才创建的网络
NETWORK ID          NAME                DRIVER              SCOPE
d9fc9ab2d628        mynginx             bridge              local
...
# 查看指定网络
docker network inspect mynginx
# 返回 IPAM.Config.Subnet 为 192.128.0.0/16
# Containers 为空,因为当前没有任何容器加入到这个网络# 修改 Compose 配置,让三个容器全部加入到新的网络中
# 参考链接:https://docs.docker.com/compose/compose-file/#network-configuration-reference
# 如何对 Compose 的配置文件设置基本网络
cd /home/[用户名]/mycompose
vim docker-compose.yml
# 修改配置文件(根部加入 networks,三个 service 分别加入 networks,一个容器可以加入若干网络)
# 注意 mynginx 和 mynginx 一致
# mynginx-net 和 mynginx-net 一致(外部网络名称)
networks: mynginx-net: external: name: mynginx
services: nginx: container_name: mynginximage: "centos:nginx"networks: - mynginx-netports: - "9090:80"privileged: truevolumes: - "/home/hua/nginx/conf/nginx.conf:/etc/nginx/nginx.conf"web1: container_name: web1image: "centos:jdk"networks: - mynginx-netports: - "8080:80"privileged: truevolumes: - "/home/hua/nginx/web1/:/var/www/html/"web2: container_name: web2image: "centos:jdk"networks: - mynginx-netports: - "8081:80"privileged: truevolumes: - "/home/hua/nginx/web2/:/var/www/html/"
version: "3"
# 保存
# 之前三个容器(mynginx、web1、web2)被停掉了
# 由于使用的是外部容器,不需要使用 up 命令重新删、创建、启动容器
# 直接使用 start
docker-compose start# 查看网络
# Ccontainers 会出现三个容器,IPv4Address 加入了之前创建的网络
docker network inspect mynginx# 进入容器(容器名称和网络名称一样)
docker exec -it mynginx /bin/bash
cat /etc/hosts

4. (案例)Docker compose 创建网络、指定容器 IP、启动简单 Nginx 负载均衡;

目标

  • 在 compose up 的时候或者启动容器的时候自动创建网络、而不需要在外部手动创建。在实战的时候、外部额外的操作越少越好。最好是一到两个文件、一条命令直接启动
  • 容器 IP:在容器创建好之后,指定 IP。因为在做负载均衡、或者做一些需要和 IP 地址有关系的程序的调用,一定需要 IP 的参照(随机创建 IP 不好控制)

Docker 实战2案列:Nginx 负载均衡相关推荐

  1. docker初体验:docker部署nginx负载均衡集群

    Docker 是一个用于开发,交付和运行应用程序的开放平台.Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件.今天来为大家演示一下docker部署nginx负载均衡集群 环境 ce ...

  2. 全力升级篇-基于Mongodb与Nginx负载均衡打造共享单车项目实战 最新完整项目升级版

    全力升级篇-基于Mongodb与Nginx负载均衡打造共享单车项目实战 最新完整项目升级版 课程作为全新的升级项目课程,基于Nginx负载均衡,Flume与Kafka,Mongodb和Redis等技术 ...

  3. 企业级Nginx负载均衡与keepalived高可用实战课-老男孩-专题视频课程

    企业级Nginx负载均衡与keepalived高可用实战课-2678人已学习 课程介绍         企业级Nginx负载均衡与keepalived高可用实战分享 课程收益     互联网环境最常用 ...

  4. Docker集群环境下安装Fastdfs集群+Nginx负载均衡

    一.环境配置 现有两台服务器10.168.103.110(旧服务器)和10.168.103.111(新服务器),其中110服务器上有swarm集群,一个tracker和一个storage,现在要做Fa ...

  5. 前端技术分享:Nginx负载均衡视频,基础的实战应用

    Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行.其特点是占有内存少,并发处理能力强,以高性能低资源消耗而闻名,国内 ...

  6. Nginx负载均衡原理与实战

    Nginx 负载均衡原理与实践 本篇摘自<亿级流量网站架构核心技术>第二章 Nginx 负载均衡与反向代理 部分内容. 当我们的应用单实例不能支撑用户请求时,此时就需要扩容,从一台服务器扩 ...

  7. Nginx负载均衡的详细配置及使用案例

    Nginx负载均衡的详细配置及使用案例详解 感谢看过这一些列博文和评论的小伙伴, 我把自己所看到的学到的拿到这里来分享是想和大家一起学习进步, 想听听园友给出的意见, 也是对自己学习过程的一个总结.  ...

  8. Nginx负载均衡集群介绍

    第1章 集群介绍 1.1 集群简介 1.1.1 什么是集群 简单说,集群就是一组(若干个)相互独立的计算机,利用高速通信网络组成的一个较大的计算机服务系统,每个集群节点(即集群中的每台计算机)都是运行 ...

  9. Nginx负载均衡常用配置

    搭建实验环境(使用docker部署两台nginx容器) 1)使用搭建第一台nginx服务 [root@linux-node4 ~]# docker container run -d --name we ...

最新文章

  1. [Math]理解卡尔曼滤波器 (Understanding Kalman Filter)
  2. docker-compose command 执行多条指令
  3. Python之 jinja2模板浅析
  4. Linux常用命令--文件(夹)查找之find命令
  5. Redis cluster集群扩容缩容原理
  6. 王力宏《十八般武艺》新碟 测评
  7. LeetCode之Palindrome Number(回文数)
  8. Nature子刊:是穷是富与基因有关?大数据分析发现149个与收入相关基因位点
  9. mysql delete 标记_MySQL删除操作其实是假删除
  10. 堆排序(heap sort)
  11. python定义函数的组成部分有_Python学习笔记之函数的定义和作用域实例详解
  12. 人工智能机器学习————MINST数据集的简单处理
  13. 重新学习FPGA(一):EDA技术
  14. 拳王虚拟项目公社:骚年,你想成为百年难遇的“地摊之王”吗?
  15. topcoder客户端
  16. iOS UI切图@1x、@2x、@3x的实际尺寸
  17. zstuoj 4246 萌新吃果果
  18. stm32 KEIL AC6 优化0程序不运行问题解决
  19. 【一周头条盘点】中国软件网(2018.4.9~2018.4.13)
  20. python汇率兑换_美元与人民币汇率 Python

热门文章

  1. 360安全卫士的云查杀原理介绍[转]
  2. 前端面试官问Promise,怎样回答拿高分
  3. 安卓盒子刷rec linux启动,常见电视或盒子进入Recovery模式的方法汇总
  4. C语言中sqrt怎么声明标识符,sqrt在c语言中怎么用?
  5. 倒计时软件下载,桌面倒计时便签软件推荐
  6. 201671010402-陈靖 实验三 作业互评与改进
  7. 岁月的剪影【八月硝烟四起】
  8. 自定制vs插件--LearnVSXNow!-#4 创建一个带有工具窗的Package
  9. stm32+手势识别模块+步进电机,模拟一种无接触式手势识别电梯
  10. onenote标注pdf笔记_GoodNotes 5 手写笔记和PDF标注必备工具