docker build run 手动操作单个容器
微服务,100个微服务,依赖关系
docker compose 来轻松高效的管理容器。定义运行多个容器。
官方
定义、运行多个容器。
YAML file 配置文件。
single command。 命令有哪些?
Compose is a tool for defining and running multi-container Docker applications. With Compose,
you use a YAML file to configure your application’s services. Then, with a single command, you
create and start all the services from your configuration. To learn more about all the features of
Compose, see the list of features.
所有的环境都可以使用 Compose。
Compose works in all environments: production, staging, development, testing, as well as CI
workflows. You can learn more about each case in Common Use Cases.
三步骤:
Using Compose is basically a three-step process:
Run docker-compose up and Compose starts and runs your entire app.
启动项目
作用:批量容器编排。
理解
管理多个容器的一个工具,通过编写dockerfile文件来实现。
version: '2.0'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
docker-compose up 100 个服务。
Compose :重要的概念。
服务services, 容器。应用。(web、redis、mysql…)
项目project。 一组关联的容器。 博客。web、mysql。
1,下载docker-compose
视频中的方法目前无法下载,我这里使用的是直接下载并复制的方式
下载网址
选择和视频中一样的版本。
mv docker-compose-Linux-x86_64 docker-compose #修改下名字吧!
2,授权
[root@docker bin]#chomd +x docker-compose
3,检测一下,使用下命令查看您下载的版本信息。如果出现版本信息就是安装成功了,如果没有出现任何反应,或者出现报错就是安装的问题,按照上面的方法重新操作下即可。
相关网址:https://docs.docker.com/compose/gettingstarted/
这个实验失败了,但是以了解具体的过程为重要的。原因没有找到
Python应用,计数器应用
1,定义应用程序依赖关系
[root@docker bin]#cd /home #习惯切换到这个目录下
[root@docker home]#ls
lighthouse
[root@docker home]#mkdir composetest
[root@docker home]#cd composetest
[root@docker composetest]#vim app.py
[root@docker composetest]#cat app.py
import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5)
@app.route('/')
def hello():
count = get_hit_count()
return 'Hello World! I have been seen {} times.\n'.format(count)
[root@docker composetest]#vim requirements.txt #添加一个依赖
[root@docker composetest]#cat requirements.txt
flask
redis
[root@docker composetest]#
2,创建一个dockerfile 文件(单机玩具)
[root@docker composetest]#vim requirements.txt
[root@docker composetest]#cat requirements.txt
flask
redis
[root@docker composetest]#vim Dockerfile
[root@docker composetest]#cat Dockerfile #官方文档需要去远程下载东西,所以比较慢
,这里使用自己找的一个文件。
[root@docker composetest]#vim Dockerfile
[root@docker composetest]#cat Dockerfile
FROM python:3.6-alpine
ADD . /code
WORKDIR /code
RUN pip tall -r requirements.txt
CMD ["python","app.py"]
[root@docker composetest]#
3,在Compose文件中定义服务(定义整个服务,需要的环境,web,redis),完整的上线服务。
[root@docker composetest]#vim docker-compose.yml
[root@docker composetest]#cat docker-compose.yml #这个文件是需要放通服务器的5000端口,这里去放通下
cat docker-compose.yml
services:
web:
build: .
ports:
- "8000:5000"
redis:
image: "redis:alpine"
[root@docker composetest]#ll
total 16
-rw-r--r-- 1 root root 514 Jul 21 21:39 app.py
-rw-r--r-- 1 root root 96 Jul 21 21:47 docker-compose.yml
-rw-r--r-- 1 root root 281 Jul 21 21:45 Dockerfile
-rw-r--r-- 1 root root 12 Jul 21 21:41 requirements.txt
4,使用Compose构建并运行应用
docker compose up
流程:
1,创建网络
2,执行dockerfile-compose yaml
3,启动服务。
文件名;composetest
服务
[root@docker composetest]#docker imags
docker: 'imags' is not a docker command.
See 'docker --help'
[root@docker composetest]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
composetest-web latest d316c0bb24d0 12 minutes ago 55.1MB
redis alpine 3900abf41552 19 months ago 32.4MB
[root@docker composetest]#
网络
[root@docker composetest]#docker network ls
NETWORK ID NAME DRIVER SCOPE
96ddab4a050f bridge bridge local
087576a77faa composetest_default bridge local
312b9f23579b host host local
a29b5c6e783f none null local
10个服务 => 项目 (项目中的内容都在同个网络下。域名访问)
如果在同一个网络下,我们可以直接通过域名访问。没有把IP写死,之后方便做高可用的功能。
停止服务
docker compose stop
快捷键 crtl+c
docker-compose
以前都是单个 docker run 启动容器。
docker-compose。 通过 docker-compose 编写 yaml配置文件、可以通过 compose 一键启动所有服务,停止。!
docker compose 核心
#三层
version: '' #版本
services: 服务
服务1: web
#服务配置
images
build
network
.....
服务2:redis
......
服务3:redis
#其他配置 网络/卷,全局规则
volume:
networks:
configs:
学习要掌握规律。多写,多看,compose.yaml配置!
1,官方文档:https://docs.docker.com/compose/compose-file/#specifying-durations
2、开源项目 compose.yaml redis、mysql、mq!
下载程序,安装数据库,配置,,,,
compose应用。==> 一键启动
参考文档:https://github.com/docker/awesome-compose/tree/master/official-documentation-samples/wordpress/
1,创建一个文件夹
mkdir docker-compose.yml
2,进入目录
cd my_wordpress/
3,编写一个docker-compose.yml 文件
services:
db:
# We use a mariadb image which supports both amd64 & arm64 architecture
image: mariadb:10.6.4-focal
# If you really want to use MySQL, uncomment the following line
#image: mysql:8.0.27
command: '--default-authentication-plugin=mysql_native_password'
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
- MYSQL_ROOT_PASSWORD=somewordpress
- MYSQL_DATABASE=wordpress
- MYSQL_USER=wordpress
- MYSQL_PASSWORD=wordpress
expose:
- 3306
- 33060
wordpress:
image: wordpress:latest
volumes:
- wp_data:/var/www/html
ports:
- 80:80
restart: always
environment:
- WORDPRESS_DB_HOST=db
- WORDPRESS_DB_USER=wordpress
- WORDPRESS_DB_PASSWORD=wordpress
- WORDPRESS_DB_NAME=wordpress
volumes:
db_data:
wp_data:
4,运行这个项目
docker compose up -d
#使用docker ps 查看下具体的信息
查看是容器的80端口映射到主机的80端口的,因此直接访问该端口就可以访问wordpress网站了。这里端口是上面的文件写到的,可以在之前的文件位置修改端口
访问测试
首次加载可能是需要几分钟的时间的,这里查看已经是可以访问到的就可以了,不继续等待了
和博主一样购买阿里云的服务器吧,因为创建集群最少需要4台,我这里没有服务器了,买4台吧
密码:hR2>fR9#dZ2
要求这几个服务同一个网段,同一个vpc内,
使用xshell连接下四台服务器,并且命名。
小技巧
安装成功了,这里的安装步骤参考之前安装的步骤即可。
参考文档: https://docs.docker.com/engine/swarm/how-swarm-mode-works/nodes/
1,启动docker
systemctl start docker
2,查看下网络配置
[root@docker1 ~]#docker network ls
NETWORK ID NAME DRIVER SCOPE
37f1b6becdf0 bridge bridge local
ccb7d9cab91b host host local
06fd5ac4016e none null local
3,查看下docker swarm 如何使用
docker swarm --help
重点关注红色方格内就可
a,
docker swarm init --help
地址,可以是公网,也可以是私网
3,使docker1成为管理节点
查看下服务器的网络
ip addr
使
docker1
成为管理节点
docker swarm init --advertise-addr 172.16.0.54 # 地址为服务器的内网地址,不走公网速度更快,同时也省钱。
使
docker2
加入这个集群里面
docker swarm join-token manager #获取主节点令牌
docker swarm join-token worker #获取worker节点令牌
docker swarm join --token SWMTKN-1-13dmi1tciqy8xw0otkcw8ldqsrnfi4hywl0541tqw8dd9temlb-clygsoiqz5m9r4jluwzmghie0 172.16.0.54:2377 #这个命令就是docker1中提到的让其他节点加入该管理节点成为worker
现在docker2
成为docker1
的worker节点
让docker3也加入该节点
方法有两种,
直接继续在docker3中执行添加节点的命令
在
docker1
管理节点生成一个新的命令
docker swarm join-token worker
docker swarm join --token SWMTKN-1-263ji3tea4uijblme9g3d1l0yk8qhgizatt2zadvxrfcx0aka6-5ndtaln8my2lesiiugkbo9kp4 172.16.0.54:2377 #新生成了命令
在docker3
中执行下
将
docker4
作为一个主(manger)节点
在docker1
中执行生成主节点的令牌docker swarm join-token manager
docker4
中执行下
成为了主节点
此时再
docker1
中查看节点的信息docker node ls
集群搭通成功了!目前是双主双从
总结
1,生成主机点
2,加入(管理者,worker)
实验:
1,将docker1机器停止。宕机的效果,
目前是双主(docker4也是主节点),结果发现docker4也使用不了
重启docker1机器的docker服务
主节点管理者变成docker4了。
此时docker4 可以使用docker node ls
命令了
2,使docker3机器离开该集群
docker swarm leave
[root@docker3 ~]#docker swarm leave
Node left the swarm.
离开时需要时间的,等待一会管理节点查看下集群的节点信息
发现docker3机器应down掉了。
此时让docker3机器也成为一个主节点,同样的步骤是,在docker1 中指定生成主节点的指令,然后将结果在docker3机器中运行。
#docker1 中
[root@docker1 ~]#docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join --token SWMTKN-1-263ji3tea4uijblme9g3d1l0yk8qhgizatt2zadvxrfcx0aka6-3s4eqdlel0v53vqh3v2jq1u79 172.16.0.54:2377
[root@docker1 ~]#
#docker3 中
[root@docker3 ~]# docker swarm join --token SWMTKN-1-263ji3tea4uijblme9g3d1l0yk8qhgizatt2zadvxrfcx0aka6-3s4eqdlel0v53vqh3v2jq1u79 172.16.0.54:2377
This node joined a swarm as a manager.
此时docker3中也可以使用管理命令了
[root@docker3 ~]#docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
sfwh5us3amnkc3cr3ntyc01ru docker1 Ready Active Reachable 19.03.8
v0joyuir5n5o9y30uqh72fign docker2 Ready Active 19.03.8
37m06a9a34aoq1bdokujbylgi docker3 Down Active 19.03.8
k4s3bu56i6v8kw7v9xgg0jo9w * docker3 Ready Active Reachable 19.03.8
jxmgfiwevpddztjleqpwbj012 docker4 Ready Active Leader 19.03.8
3,worker 就是工作的,管理节点来操作,三台机器设置为了管理节点
现在将docker1机器的docker服务停止,会发现其他两个管理节点还是可以使用的。
#docker1 中
[root@docker1 ~]#systemctl stop docker
#docker3中
[root@docker3 ~]#docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
sfwh5us3amnkc3cr3ntyc01ru docker1 Ready Active Unreachable 19.03.8
v0joyuir5n5o9y30uqh72fign docker2 Ready Active 19.03.8
37m06a9a34aoq1bdokujbylgi docker3 Down Active 19.03.8
k4s3bu56i6v8kw7v9xgg0jo9w * docker3 Ready Active Reachable 19.03.8
jxmgfiwevpddztjleqpwbj012 docker4 Ready Active Leader 19.03.8
#docker4中
[root@docker4 ~]#docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
sfwh5us3amnkc3cr3ntyc01ru docker1 Down Active Unreachable 19.03.8
v0joyuir5n5o9y30uqh72fign docker2 Ready Active 19.03.8
37m06a9a34aoq1bdokujbylgi docker3 Down Active 19.03.8
k4s3bu56i6v8kw7v9xgg0jo9w docker3 Ready Active Reachable 19.03.8
jxmgfiwevpddztjleqpwbj012 * docker4 Ready Active Leader 19.03.8
再停止一个管理节点
#docker3 中
[root@docker3 ~]#systemctl stop docker
#docker4 中
[root@docker4 ~]#docker node ls #因为停止是需要一段时间的,所以等待一会再操作就会发现执行不了管理员命令了。
Error response from daemon: rpc error: code = Unknown desc = The swarm does not have a leader. It's possible that too few managers are online. Make sure more than half of the managers are online.
这个实验就再次证明,集群要是可用,就至少有3个主节点。>1台管理节点存活
实验做完就把docker3 和1 的docker服务启动起来吧systemctl start docker
弹性扩缩容,集群
以后告别docker run
docker-compose up ! 启动一个项目。单机
容器=>服务!
redis! 3份,容器!、
集群:高可用,web-> redis(3台,不同的机器上)
容器=>服务!==>10个副本(同时开启10个redis容器)
灰度发布,金丝雀发布
把之前down掉的机器在集群管理这里删除掉吧 docker node rm 集群id
查看下docker service
命令的帮助吧
启动一个NGINX服务,容器内8888端口映射主机80端口
再此执之前去服务器控制台放通了服务器的80和8888 端口
docker run #容器启动,不具有扩缩容容器
docker server #服务 ,具有扩缩容,滚动更新
查看服务的replicas
服务随机分布到docker1上了,说明下,这个是随分布的,尽管这里没有反馈到。之后会遇到是随机平均分配到其他的节点中。
其他的节点都没有启动服务
升级创建副本
创建副本docker service update --replicas 1 my-nginx
此时查看三台服务器上都运行了my-nginx服务
此时再有运行服务上的服务器IP都可以通过浏览器访问IP+端口,访问到nginx服务
但是没有运行容易服务的服务器也可以访问到nginx页面
同时运行10个副本也是可以的,随时动态扩缩容。
此时就发现每个机器都将这10个服务分了下来
也可以回滚到最初的一个节点
此时整个集群就只有一个服务在运行了
动态扩缩容
docker service scale my-nginx=5 #以扩容5个副本为例
移除 docker service rm 容器id
只要会搭建集群,会启动服务,动态管理容器就可以了!
swarm
集群的管理和编排,docker可以初始化集群,其他节点可以加入(管理,工作者)
node
就是一个docker节点,多个节点就组成了一个网络集群(管理,工作者)
service
任务,可以在管理节点或者工作节点来运行。核心,用户访问。
task
容器内的命令,细节任务
命令->管理-> api->调度->工作节点(创建task容器维护创建!)
服务副本与全局服务
调整service以什么方式运行:
--mode string
Service mode (replicated or global) (default "replicated")
docker service create --mode replicated --name mytom tomcat:7 默认的
docker service create --mode global --name haha alpine ping baidu.com
#场景?日志收集
每一个节点有自己的日志收集器,过滤。把所有日志最终再传给日志中心
服务监控,状态性能。
docker compress 网络
[root@docker1 ~]#yum -y install bridge-utils #安装一个网络工具
拓展:网络模式: “PublishMode”: “ingress”
Swarm:
Overlay:
ingress : 特殊的 Overlay 网络! 负载均衡的功能! IPVS VIP!
虽然docker在4台机器上,实际网络是同一个! ingress 网络 ,是一个特殊的 Overlay 网络,将各个集群的网络映射到overlay网络上,这样于外部而言就是一个整体的网络。
docker-compose 单据部署项目
docker stack部署,集群部署
#单机
docker compose up -d wordpress.yaml
#集群
docker stack deploy wordpress.yaml
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bP8tqR6c-1690020237896)(C:/Users/%E5%88%9D%E7%8E%96/AppData/Roaming/Typora/typora-user-images/image-20230722174647838.png)]**
网上找案例跑起来——>学习方法
实验做完及时把实例删除掉,都是按量付费的。
go 语言 必须掌握,Java,go!
Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译型语言。Go 语言语法与 C 相近,但功能上有:内存安全,GC(垃圾回收),结构形态及 CSP-style 并发计算。
Go(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。
罗伯特·格瑞史莫(Robert Griesemer),罗布·派克(Rob Pike)及肯·汤普逊(Ken Thompson)于2007年9月开始设计Go,稍后Ian Lance Taylor、Russ Cox加入项目。Go是基于Inferno操作系统所开发的。Go于2009年11月正式宣布推出,成为开放源代码项目,并在Linux及[Mac OS X](https://baike.baidu.com/item/Mac OS X?fromModule=lemma_inlink)平台上进行了实现,后来追加了Windows系统下的实现。在2016年,Go被软件评价公司TIOBE 选为“TIOBE 2016 年最佳语言”。 目前,Go每半年发布一个二级版本(即从a.x升级到a.y)。
com/item/静态?fromModule=lemma_inlink)强类型、编译型、并发型,并具有垃圾回收功能的编程语言。
罗伯特·格瑞史莫(Robert Griesemer),罗布·派克(Rob Pike)及肯·汤普逊(Ken Thompson)于2007年9月开始设计Go,稍后Ian Lance Taylor、Russ Cox加入项目。Go是基于Inferno操作系统所开发的。Go于2009年11月正式宣布推出,成为开放源代码项目,并在Linux及[Mac OS X](https://baike.baidu.com/item/Mac OS X?fromModule=lemma_inlink)平台上进行了实现,后来追加了Windows系统下的实现。在2016年,Go被软件评价公司TIOBE 选为“TIOBE 2016 年最佳语言”。 目前,Go每半年发布一个二级版本(即从a.x升级到a.y)。