Docker之单多/机容器管理
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文件定义了两个服务:web
和redis
。
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 Swarm:
准备三台机器,都装上 Docker
docker swarm是docker官方提供的一套容器编排系统。它的架构如下:
swarm是一系列节点的集合,而节点可以是一台裸机或者一台虚拟机。一个节点能扮演一个或者两个角色,manager或者worker。
- manager节点:Docker Swarm集群需要至少一个manager节点,节点之间使用
Raft consensus protocol
进行协同工作。通常,第一个启用docker swarm的节点将成为leader,后来加入的都是follower。当前的leader如果挂掉,剩余的节点将重新选举出一个新的leader。每一个manager都有一个完整的当前集群状态的副本,可以保证manager的高可用。 - 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之单多/机容器管理的更多相关文章
- docker-swarm----多机容器管理
Docker Swarm: 准备三台机器,都装上 Docker docker swarm是docker官方提供的一套容器编排系统.它的架构如下: swarm是一系列节点的集合,而节点可以是一台裸机或者 ...
- docker简单介绍----镜像和容器管理
docker可以分为三部分:docker镜像 docker仓库 docker容器 docker镜像:一个image可以包含一个镜像,也可以理解为一个系统模板,里面安装了相关应用,也可以是纯净版的 ...
- Docker&K8S&持续集成与容器管理--系列教程
前言 网络虚拟化 一 Docker简介 Docker介绍 → B站视频链接 Docker架构 → B站视频链接 二 Docker安装 Ubuntu Docker 安装 CentOS Docker ...
- Docker背后的容器管理——Libcontainer深度解析
Libcontainer 是Docker中用于容器管理的包,它基于Go语言实现,通过管理namespaces.cgroups.capabilities以及文件系统来进行容器控制.你可以使用Libcon ...
- Docker进阶之五:容器管理
容器管理 一.创建容器常用选项 docker container --help 指令 描述 资源限制指令 -i, --interactive 交互式 -m,--memory 容器可以使用的最大内存量 ...
- 003.Docker容器管理
一 docer运行应用 1.1 常见容器运行 root@docker:~# docker #查看docker相关命令 root@docker:~# docker run -d -p 80:80 htt ...
- Docker学习笔记之运行和管理容器
0x00 概述 容器是基于容器技术所建立和运行的轻量级应用运行环境,它是 Docker 封装和管理应用程序或微服务的“集装箱”.在 Docker 中,容器算是最核心的部分了,掌握容器的操作也是 Doc ...
- 3、Docker容器管理
一.容器创建 1.创建命令 docker container [root@localhost harbor]# docker container Usage: docker container CO ...
- docker容器管理及网络管理
防火墙规则—— INPUT 主要用于主机防火墙,设置规则屏蔽处理进入本机的数据包示例:禁止10.180.100.141这个机器访问我本机的web服务iptables -t filter -A INPU ...
随机推荐
- JDBC与Hibernate的区别
相同点: ◆两者都是JAVA的数据库操作中间件. ◆两者对于数据库进行直接操作的对象都不是线程安全的,都需要及时关闭. ◆两者都可以对数据库的更新操作进行显式的事务处理. 不同点: ◆使用的SQL语言 ...
- vue项目配置及项目初识
目录 Vue项目环境搭建 Vue项目创建 重构项目依赖 1.需要转移的文件 2.重构依赖 pycharm配置并启动vue项目 vue项目目录结构分析 vue组件(.vue文件) 全局脚本文件main. ...
- 定时器的写法 winform
private void timer1_Tick(object sender, EventArgs e) { if ( tttttflag) { Action action = SyncCompany ...
- ansible-乱
工作机制:ssh 无客户端 工作方式: 1,CMDB 2,公有云私有云API 3,使用ad-hoc 4,ansible-playbook ansible 执行命令,底层调用传输连接模块,将命令或文件传 ...
- entry 遍历 Map 元素
1.书写类 import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; public class test ...
- MySQL教程-MyISAM和InnoDB的区别
MySQL的表类型MyISAM和InnoDB之间的最大区别是,InnoDB的支持事务.兄弟连教育( )来给大家做个对比: InnoDB支持一些新的功能:交易,行级锁,外键 InnoDB是高容量,高性能 ...
- CDOJ 1146 A - 秋实大哥与连锁快餐店 最小生成树 Prim算法 稠密图
题目链接 A - 秋实大哥与连锁快餐店 Time Limit:3000MS Memory Limit:65535KB 64bit IO Format:%lld & %llu S ...
- ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'ambari'
配置Ambari远程maridb 报错: ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'ambari' ...
- for aws associate exam
Topics which I read based on the previous forum discussions Amazon DynamoDB January 2016 Day at the ...
- Java第一次学习总结
学习内容: 1.java是本学期刚刚接触新的一种编程语言,与大一C语言在语法上有很多相同之处,不同的是在很多问题上,更加简练,更加易于理解. 例如:输出水仙花数,从C语言近五十行代码缩短近十几行,数据 ...