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. 【BZOJ 3681】Arietta

    传送门 题目描述 Arietta 的命运与她的妹妹不同,在她的妹妹已经走进学院的时候,她仍然留在山村中. 但是她从未停止过和恋人 Velding 的书信往来.一天,她准备去探访他. 对着窗外的阳光,临 ...

  2. 【转】Linux逻辑卷管理

    一. 前言 LVM是逻辑卷管理(Logical Volume Manager)的简称,它是建立在物理存储设备之上的一个抽象层,允许你生成逻辑存储卷,与直接使用物理存储在管理上相比,提供了更好灵活性.L ...

  3. docker-compose命令及yaml文件

    Docker-compose常用命令 docker-compose up -d nginx 构建建启动nignx容器 docker-compose exec nginx bash 登录到nginx容器 ...

  4. T3

    T3构造图

  5. input样式去掉苹果手机的默认样式

    /*<!---->去掉苹果短的样式*/ input[type="button"], input[type="submit"], input[type ...

  6. Tensorflow视频教程&Pytorch视频教程

    基于tensorflow做研究和基于pytorch做研究哪个好?哪个更容易复制代码,工业上更易用.Keras和tensorflow.pytorch的关系. Keras:Keras是一个由Python编 ...

  7. mini dc(选做)

    一.题目要求 提交测试截图和码云练习项目链接,实现Linux下dc的功能,计算后缀表达式的值 二.源代码 1.MyDC类 import java.util.StringTokenizer; impor ...

  8. java实现豆瓣回帖机器人

    最近一直帮老板写爬虫,写累了就寻思着找点乐子,碰巧平时喜欢逛豆瓣,就打算写一个自动回帖机器人,废话不多说我们进入正题: 主要用到2个开源工具:Jsoup和httpclient Step 1:模拟登陆 ...

  9. @清晰掉 swap函数

    swap函数估计是一个各种各样程序都会频繁用到的子程序,可是你知道它究竟有多少种不同的写法吗?下面我就列举我知道的几种swap函数来跟大家分享一下. (1)经典型---嫁衣法 无论是写程序还是干其他事 ...

  10. linux下插入U盘自动挂载后,用C获取其挂载点(cat /proc/mounts)

    现在已经能够通过libudev获取U盘插入时它的节点名(通过函数udev_device_get_devnode()),是/dev/sdb1 我现在的做法是读取/proc/mounts文件,找到有/de ...