Compose是用于定义和运行多容器Docker应用程序的工具。通过Compose,您可以使用YAML文件来配置应用程序的服务。然后,使用一个命令,就可以从配置中创建并启动所有服务。

Docker-Compose 安装:

sudo curl -L "https://github.com/docker/compose/releases/download/1.25.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

  下载极其的慢,请耐心等待。

  安装完成后测试安装:

$ docker-compose --version
docker-compose version 1.25., build 1110ad01

  根据官网的介绍,我们跟着官网的demo进行一个docker-compose的入门:

  确保已安装Docker Engine和Docker Compose。您无需安装Python或Redis,因为两者均由Docker映像提供。

1.为项目创建目录:

mkdir /composetest
cd composetest

2.新建app.py在项目目录中创建一个名为的文件,并将其粘贴到:

import time

import redis
from flask import Flask app = Flask(__name__)
cache = redis.Redis(host='redis', port=)
def get_hit_count():
retries =
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == :
raise exc
retries -=
time.sleep(0.5) @app.route('/')
def hello():
count = get_hit_count()
return 'Hello World! I have been seen {} times.\n'.format(count)

  在此示例中,redis是应用程序网络上的redis容器的主机名。我们为Redis使用默认端口6379

3.requirements.txt在项目目录中创建另一个名为的文件,并将其粘贴到:、

flask
redis

4.在您的项目目录中,创建一个名为的文件Dockerfile并粘贴以下内容:

FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP app.py
ENV FLASK_RUN_HOST 0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
CMD ["flask", "run"]

5.新建 docker-compose.yml在项目目录中创建一个名为的文件,然后粘贴以下内容:

version: '' #表示docker-compose的版本
services: #相当于原先的container ,一个service表示一个container
web: #container的名字
build: .
ports:
- "5000:5000" #映射端口
networks:
- app-net #网段
redis:
image: "redis:alpine"
networks:
- app-net networks: #相当于docker network create app-net
app-net:
driver: bridge

  该Compose文件定义了两个服务:webredis

6.执行 docker-compose up 运行来启动应用程序

7.在浏览器中输入ip:5000 /以查看应用程序正在运行。您应该在浏览器中看到一条消息,内容为:

Hello World! I have been seen  times.

  docker-compose常见操作:

docker-compose version   --查看版本

docker-compose up  --根据yml创建service
指定yaml:docker-compose up -f xxx.yaml
后台运行:docker-compose up -d
docker-compose ps --查看启动成功的service ,也可以使用docker ps docker-compose images --查看images docker-compose stop/start --停止/启动service docker-compose down --删除service[同时会删除掉network和volume] docker-compose exec redis sh --进入到某个service
  docker-compose up --scale web=5 -d --若要对python容器进行扩缩容
  docker-compose logs web  --日志

Docker Swarm:

  准备三台机器,都装上 Docker

  docker swarm是docker官方提供的一套容器编排系统。它的架构如下:

swarm是一系列节点的集合,而节点可以是一台裸机或者一台虚拟机。一个节点能扮演一个或者两个角色,manager或者worker。

  1. manager节点:Docker Swarm集群需要至少一个manager节点,节点之间使用Raft consensus protocol进行协同工作。通常,第一个启用docker swarm的节点将成为leader,后来加入的都是follower。当前的leader如果挂掉,剩余的节点将重新选举出一个新的leader。每一个manager都有一个完整的当前集群状态的副本,可以保证manager的高可用。
  2. worker节点:worker节点是运行实际应用服务的容器所在的地方。理论上,一个manager节点也能同时成为worker节点,但在生产环境中,我们不建议这样做。worker节点之间,通过control plane进行通信,这种通信使用gossip协议,并且是异步的。

搭建Swarm集群:

1.设置 manager

docker swarm init --advertise-addr=192.168.0.11

  这个时候需要注意观察日志。拿到worker node加入manager node的信息

docker swarm join --token SWMTKN--0a5ph4nehwdm9wzcmlbj2ckqqso38pkd238rprzwcoawabxtdq-arcpra6yzltedpafk3qyvv0y3 192.168.0.11:

2.切换机器,分别执行上面的命令加入 swarm 集群。

3.进入到manager node查看集群状态 docker node ls

4.node类型的转换:

#可以将worker提升成manager,从而保证manager的高可用
docker node promote worker01-node
docker node promote worker02-node #降级可以用demote
docker node demote worker01-node

   Swarm基本操作:

docker service create --name my-tomcat tomcat   --创建一个tomcat的service

docker service ls  --查看当前swarm的service

docker service logs my-tomcat  --查看service的启动日志

docker service inspect my-tomcat    --查看service的详情

docker service ps my-tomcat   --查看my-tomcat运行在哪个node上

docker service scale my-tomcat=    --水平扩展service 可以发现 其他node上都运行了一个my-tomcat的service
docker service ls
docker service ps my-tomcat docker service rm my-tomcat -- 删除service

  如果某个node上的my-tomcat挂掉了,这时候会自动扩展

多机通信overlay网络:

  业务场景:workpress+mysql实现个人博客搭建

传统手动方式实现:

01-创建mysql容器[创建完成等待一会,注意mysql的版本]

docker run -d --name mysql -v v1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=examplepass -e MYSQL_DATABASE=db_wordpress mysql:5.6

02-创建wordpress容器[将wordpress的80端口映射到centos的8080端口]

docker run -d --name wordpress --link mysql -e WORDPRESS_DB_HOST=mysql: -e WORDPRESS_DB_USER=root -e WORDPRESS_DB_PASSWORD=examplepass -e WORDPRESS_DB_NAME=db_wordpress -p : wordpress

03-查看默认bridge的网络,可以发现两个容器都在其中

docker network inspect bridge

04-访问测试:浏览器中输入:ip[centos]:8080,一直下一步

使用docker compose创建:

  docker-compose的方式还是在一台机器中,网络这块很清晰

01-创建wordpress-mysql文件夹

mkdir -p /tmp/wordpress-mysql
cd /tmp/wordpress-mysql

02-创建docker-compose.yml。文件内容 yml :

version: '3.1'

services:

  wordpress:
image: wordpress
restart: always
ports:
- :
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: exampleuser
WORDPRESS_DB_PASSWORD: examplepass
WORDPRESS_DB_NAME: exampledb
volumes:
- wordpress:/var/www/html db:
image: mysql:5.7
restart: always
environment:
MYSQL_DATABASE: exampledb
MYSQL_USER: exampleuser
MYSQL_PASSWORD: examplepass
MYSQL_RANDOM_ROOT_PASSWORD: ''
volumes:
- db:/var/lib/mysql volumes:
wordpress:
db:

03-根据docker-compose.yml文件创建service

docker-compose up -d

04-访问测试:win10浏览器ip[centos]:8080,一直下一步

05-值得关注的点是网络

docker network ls
docker network inspect wordpress-mysql_default

Swarm中实现:

  还是wordpress+mysql的案例,在docker swarm集群中怎么玩呢?

(1)创建一个overlay网络,用于docker swarm中多机通信 , 在 manager-node中执行:

docker network create -d overlay my-overlay-net
docker network ls[此时worker node查看不到]

(2)创建mysql的service,在manager-node节点上执行:

docker service create --name mysql --mount type=volume,source=v1,destination=/var/lib/mysql --env MYSQL_ROOT_PASSWORD=examplepass --env MYSQL_DATABASE=db_wordpress --network my-overlay-net mysql:5.6
#查看service
docker service ls
docker service ps mysql

(3)创建wordpress的service,在manager-node节点上执行:

#创建service  [注意之所以下面可以通过mysql名字访问,也是因为有DNS解析]
docker service create --name wordpress --env WORDPRESS_DB_USER=root --env WORDPRESS_DB_PASSWORD=examplepass --env WORDPRESS_DB_HOST=mysql: --env WORDPRESS_DB_NAME=db_wordpress -p : --network my-overlay-net wordpress
#查看service
docker service ls
docker service ps mysql
#此时mysql和wordpress的service运行在哪个node上,这时候就能看到my-overlay-net的网络

(4)测试 :浏览器访问ip[manager/worker01/worker02]:8080都能访问成功

(5)查看my-overlay-net

docker network inspect my-overlay-net

Routing Mesh:

  通过前面的案例我们发现,部署一个wordpress的service,映射到主机的8080端口,这时候通过swarm集群中的任意主机ip:8080都能成功访问,这是因为什么?docker swarm中有自己的分布式存储机制.把问题简化:

docker service create --name tomcat -p : --network my-overlay-net tomcat

(1)记得使用一个自定义的overlay类型的网络

network my-overlay-net

(2)查看service情况

docker service ls
docker service ps tomcat

(3)访问3台机器的ip:8080测试 :发现都能够访问到tomcat的欢迎页

Internal:

  在实战wordpress+mysql的时候,发现wordpress中可以直接通过mysql名称访问,这样可以说明两点,第一是其中一定有dns解析,第二是两个service的ip是能够ping通的,不妨再创建一个service,也同样使用上述tomcat的overlay网络,然后来实验

docker service create --name whoami -p : --network my-overlay-net -d  jwilder/whoami

(1)查看whoami的情况

docker service ps whoami

(2)在各自容器中互相ping一下彼此,也就是容器间的通信,tomcat容器中ping whoami

docker exec -it 9d7d4c2b1b80 ping whoami
bytes from bogon (10.0.0.8): icmp_seq= ttl= time=0.050 ms
bytes from bogon (10.0.0.8): icmp_seq= ttl= time=0.080 ms

whoami容器中ping tomcat

docker exec -it 5c4fe39e7f60 ping tomcat
bytes from bogon (10.0.0.18): icmp_seq= ttl= time=0.050 ms
bytes from bogon (10.0.0.18): icmp_seq= ttl= time=0.080 ms

(3)将whoami进行扩容

docker service scale whoami=
docker service ps whoami #manager,worker01,worker02

(4)此时再ping whoami service,并且访问whoami服务

#ping
docker exec -it 9d7d4c2b1b80 ping whoami
bytes from bogon (10.0.0.8): icmp_seq= ttl= time=0.055 ms
bytes from bogon (10.0.0.8): icmp_seq= ttl= time=0.084 ms #访问
docker exec -it 9d7d4c2b1b80 curl whoami: [多访问几次]
I'm 09f4158c81ae
I'm aebc574dc990
I'm 7755bc7da921

  通过上述的实验可以发现什么?whoami服务对其他服务暴露的ip是不变的,但是通过whoami名称访问8000端口,确实访问到的是不同的service,也就是说whoami service对其他服务提供了一个统一的VIP入口,别的服务访问时会做负载均衡。

Stack:

  有没有发现上述部署service很麻烦?要是能够类似于docker-compose.yml文件那种方式一起管理该多少?这就要涉及到docker swarm中的Stack,我们直接通过前面的wordpress+mysql案例看看怎么使用咯。

(1)新建service.yml文件

version: ''

services:

wordpress:
image: wordpress
ports:
- :
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: exampleuser
WORDPRESS_DB_PASSWORD: examplepass
WORDPRESS_DB_NAME: exampledb
networks:
- ol-net
volumes:
- wordpress:/var/www/html
deploy:
mode: replicated
replicas:
restart_policy:
condition: on-failure
delay: 5s
max_attempts:
update_config:
parallelism:
delay: 10s db:
image: mysql:5.7
environment:
MYSQL_DATABASE: exampledb
MYSQL_USER: exampleuser
MYSQL_PASSWORD: examplepass
MYSQL_RANDOM_ROOT_PASSWORD: ''
volumes:
- db:/var/lib/mysql
networks:
- ol-net
deploy:
mode: global
placement:
constraints:
- node.role == manager volumes:
wordpress:
db: networks:
ol-net:
driver: overlay

(2)根据service.yml创建service

docker statck deploy -c service.yml my-service

(3)常见操作

docker stack ls   --查看stack具体信息

docker stack services my-service  --查看具体的service

docker service inspect my-service-db   --查看某个service

(4)访问测试:浏览器ip[manager,worker01,worker02]:8080

Docker之单多/机容器管理的更多相关文章

  1. docker-swarm----多机容器管理

    Docker Swarm: 准备三台机器,都装上 Docker docker swarm是docker官方提供的一套容器编排系统.它的架构如下: swarm是一系列节点的集合,而节点可以是一台裸机或者 ...

  2. docker简单介绍----镜像和容器管理

    docker可以分为三部分:docker镜像   docker仓库  docker容器 docker镜像:一个image可以包含一个镜像,也可以理解为一个系统模板,里面安装了相关应用,也可以是纯净版的 ...

  3. Docker&K8S&持续集成与容器管理--系列教程

    前言 网络虚拟化 一 Docker简介 Docker介绍  → B站视频链接 Docker架构  → B站视频链接 二 Docker安装 Ubuntu Docker 安装 CentOS Docker ...

  4. Docker背后的容器管理——Libcontainer深度解析

    Libcontainer 是Docker中用于容器管理的包,它基于Go语言实现,通过管理namespaces.cgroups.capabilities以及文件系统来进行容器控制.你可以使用Libcon ...

  5. Docker进阶之五:容器管理

    容器管理 一.创建容器常用选项 docker container --help 指令 描述 资源限制指令 -i, --interactive 交互式 -m,--memory 容器可以使用的最大内存量 ...

  6. 003.Docker容器管理

    一 docer运行应用 1.1 常见容器运行 root@docker:~# docker #查看docker相关命令 root@docker:~# docker run -d -p 80:80 htt ...

  7. Docker学习笔记之运行和管理容器

    0x00 概述 容器是基于容器技术所建立和运行的轻量级应用运行环境,它是 Docker 封装和管理应用程序或微服务的“集装箱”.在 Docker 中,容器算是最核心的部分了,掌握容器的操作也是 Doc ...

  8. 3、Docker容器管理

    一.容器创建 1.创建命令 docker  container [root@localhost harbor]# docker container Usage: docker container CO ...

  9. docker容器管理及网络管理

    防火墙规则—— INPUT 主要用于主机防火墙,设置规则屏蔽处理进入本机的数据包示例:禁止10.180.100.141这个机器访问我本机的web服务iptables -t filter -A INPU ...

随机推荐

  1. JDBC与Hibernate的区别

    相同点: ◆两者都是JAVA的数据库操作中间件. ◆两者对于数据库进行直接操作的对象都不是线程安全的,都需要及时关闭. ◆两者都可以对数据库的更新操作进行显式的事务处理. 不同点: ◆使用的SQL语言 ...

  2. vue项目配置及项目初识

    目录 Vue项目环境搭建 Vue项目创建 重构项目依赖 1.需要转移的文件 2.重构依赖 pycharm配置并启动vue项目 vue项目目录结构分析 vue组件(.vue文件) 全局脚本文件main. ...

  3. 定时器的写法 winform

    private void timer1_Tick(object sender, EventArgs e) { if ( tttttflag) { Action action = SyncCompany ...

  4. ansible-乱

    工作机制:ssh 无客户端 工作方式: 1,CMDB 2,公有云私有云API 3,使用ad-hoc 4,ansible-playbook ansible 执行命令,底层调用传输连接模块,将命令或文件传 ...

  5. entry 遍历 Map 元素

    1.书写类 import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; public class test ...

  6. MySQL教程-MyISAM和InnoDB的区别

    MySQL的表类型MyISAM和InnoDB之间的最大区别是,InnoDB的支持事务.兄弟连教育( )来给大家做个对比: InnoDB支持一些新的功能:交易,行级锁,外键 InnoDB是高容量,高性能 ...

  7. CDOJ 1146 A - 秋实大哥与连锁快餐店 最小生成树 Prim算法 稠密图

    题目链接 A - 秋实大哥与连锁快餐店 Time Limit:3000MS     Memory Limit:65535KB     64bit IO Format:%lld & %llu S ...

  8. ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'ambari'

    配置Ambari远程maridb 报错: ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'ambari' ...

  9. for aws associate exam

    Topics which I read based on the previous forum discussions Amazon DynamoDB January 2016 Day at the ...

  10. Java第一次学习总结

    学习内容: 1.java是本学期刚刚接触新的一种编程语言,与大一C语言在语法上有很多相同之处,不同的是在很多问题上,更加简练,更加易于理解. 例如:输出水仙花数,从C语言近五十行代码缩短近十几行,数据 ...