一、Docker Compose
1、概述(为什么使用docker compose)
- 对于单个容器可以通过DockerFile然后 build、run 手动操作;对于成百上千个依赖关系的微服务。 Docker Compose 来轻松定义和运行多个容器即高效的管理容器
- compose是docker官网开源的项目 需要安装
- docker compose通过编写一个docker-compose.yml配置文件,如下
version: '2.0' services: web: build: . ports: - "5000:5000" volumes: - .:/code - logvolume01:/var/log links: - redis redis: image: redis volumes: logvolume01: {}
通过docker-compose启动进行编排容器
地址
Overview of Docker Compose | Docker Documentation
2、安装
官网给的安装地址
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
但是安装速度很慢 可以使用下面这个
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
查看
[root@izj6c22bffydfp7tlrbx7fz ~]# cd /usr/local/bin/ [root@izj6c22bffydfp7tlrbx7fz bin]# ll 总用量 4 -rw-r--r-- 1 root root 0 7月 20 08:09 docker-compose -rw-r--r-- 1 root root 9 7月 20 08:12 docker-composer
授权和版本查看
[root@izj6c22bffydfp7tlrbx7fz bin]# sudo chmod +x /usr/local/bin/docker-compose [root@izj6c22bffydfp7tlrbx7fz bin]# docker-compose version docker-compose version 1.25.5, build 8a1c60f6 docker-py version: 4.1.0 CPython version: 3.7.5 OpenSSL version: OpenSSL 1.1.0l 10 Sep 2019 [root@izj6c22bffydfp7tlrbx7fz bin]#
3、体验(官网案例:python计数器应用)
创建文件夹 ,这里在/home目录下
mkdir composetest cd composetest
创建文件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)
创建requirements.txt文件
flask redis
创建 Dockerfile
vim Dockerfile # syntax=docker/dockerfile:1 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 EXPOSE 5000 COPY . . CMD ["flask", "run"]
创建docker-compose.yml文件
version: "2.3" services: web: build: . ports: - "5000:5000" redis: image: "redis:alpine"
启动
docker-compose up docker-compose up Starting composetest_web_1 ... done Starting composetest_redis_1 ... done Attaching to composetest_web_1, composetest_redis_1 redis_1 | 1:C 20 Jul 2021 00:46:17.761 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo redis_1 | 1:C 20 Jul 2021 00:46:17.761 # Redis version=6.2.4, bits=64, commit=00000000, modified=0, pid=1, just started redis_1 | 1:C 20 Jul 2021 00:46:17.761 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf redis_1 | 1:M 20 Jul 2021 00:46:17.761 * monotonic clock: POSIX clock_gettime redis_1 | 1:M 20 Jul 2021 00:46:17.761 * Running mode=standalone, port=6379. redis_1 | 1:M 20 Jul 2021 00:46:17.762 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. redis_1 | 1:M 20 Jul 2021 00:46:17.762 # Server initialized redis_1 | 1:M 20 Jul 2021 00:46:17.762 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysct
查看服务以及测试
[root@izj6c22bffydfp7tlrbx7fz ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5992a0716736 composetest_web "flask run" 9 minutes ago Up 7 minutes 0.0.0.0:5000->5000/tcp composetest_web_1 885b416a1232 redis:alpine "docker-entrypoint.s…" 9 minutes ago Up 7 minutes 6379/tcp composetest_redis_1 [root@izj6c22bffydfp7tlrbx7fz ~]# curl http://172.18.0.2:5000/ Hello World! I have been seen 5 times. [root@izj6c22bffydfp7tlrbx7fz ~]# curl http://172.18.0.2:5000/ Hello World! I have been seen 6 times. [root@izj6c22bffydfp7tlrbx7fz ~]# curl http://172.18.0.2:5000/ Hello World! I have been seen 7 times. [root@izj6c22bffydfp7tlrbx7fz ~]#
停止
docker-compose down ctrl+c
注意
服务命名规则
默认的服务名 文件名_服务名_num,多个服务器集群方案 ,_num副本数量
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5992a0716736 composetest_web "flask run" 9 minutes ago Up 7 minutes 0.0.0.0:5000->5000/tcp composetest_web_1 885b416a1232 redis:alpine "docker-entrypoint.s…" 9 minutes ago Up 7 minutes 6379/tcp composetest_redis_1
网络规则
docker network ls 可以看到 有个compsetest_default网络 默认项目中的内容都在同一个网络中 所以可以通过域名访问
后台启动
docker-compose up -d
yaml规则
官网文档
Compose specification | Docker Documentation
yaml文件只有3层
version: '' # 版本 services: # 服务 服务1: web # 服务配置 images build network ..... 服务2: redis .... 服务3: redis # 其他配置 网络/卷、全局规则 volumes: networks: configs:
注意:其中文件可以通过depends_on 规定启动顺序
4、开源项目-wordpress博客搭建
通过compose可以直接启动开源应用 ,比如wordpress博客
地址
Quickstart: Compose and WordPress | Docker Documentation
mkdir wordpress
vim docker-compose.yml
version: "3.9" services: db: image: mysql:5.7 volumes: - db_data:/var/lib/mysql restart: always environment: MYSQL_ROOT_PASSWORD: somewordpress MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress wordpress: depends_on: - db image: wordpress:latest volumes: - wordpress_data:/var/www/html ports: - "8000:80" restart: always environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress WORDPRESS_DB_NAME: wordpress volumes: db_data: {} wordpress_data: {}
访问
ip:8000
说明
启动开源项目,直接通过images启动的,所以 不需要创建dockerfile文件 也不需要build等
5、实战
docker-compose.yml
1、编写项目微服务
创建一个boot的微服务项目,带有redis测试,配置文件如下
server.port=8088 spring.redis.host=redis
2、创建dockerfile 构建镜像文件
FROM java:8 COPY *.jar /app.jar CMD ["--server.port=8088"] EXPOSE 8088 ENTRYPOINT ["java","-jar","/app.jar"]
3、docker-compose.yaml 编排项目
version: '3.9' services: testapp: build: image: testapp depends_on: - redis ports: - "8080:8080" redis: image: "/library/redis:alpine"
4、丢到服务器运行 docker-compose up
小结:
项目中如果有 docker-compose 文件。说明所有项目都是按照这个规则来运行,直接启动 一键搞定
假设项目要重新部署打包docker-compose up --build# 重新构建!
二、Swarm
现在有若干台docker主机,每个主机就是一个node即docker节点。这些节点有管理者也有工作者,多个节点就组成了一个网络集群,而要管理这个网络集群就得需要一个工具
Swarm 是 Docker 官方提供的一款集群管理工具,其主要作用是把若干台 Docker 主机抽象为一个整体,并且通过一个入口统一管理这些 Docker 主机上的各种 Docker 资源。
Swarm 和 Kubernetes 比较类似,但是更加轻,具有的功能也较 kubernetes 更少一些。
Docker Swarm 包含两方面:一个企业级的 Docker 安全集群,以及一个微服务应用编排引擎。
集群方面,Swarm 将一个或多个 Docker 节点组织起来,使得用户能够以集群方式管理它们。
Swarm 默认内置有加密的分布式集群存储(encrypted distributed cluster store)、加密网络(Encrypted Network)、公用TLS(Mutual TLS)、安全集群接入令牌 Secure Cluster Join Token)以及一套简化数字证书管理的 PKI(Public Key Infrastructure)。我们可以自如地添加或删除节点。
编排方面,Swarm 提供了一套丰富的 API 使得部署和管理复杂的微服务应用变得易如反掌。通过将应用定义在声明式配置文件中,就可以使用原生的 Docker 命令完成部署。
此外,甚至还可以执行滚动升级、回滚以及扩缩容操作,同样基于简单的命令即可完成。
以往,Docker Swarm 是一个基于 Docker 引擎之上的独立产品。自 Docker 1.12 版本之后,它已经完全集成在 Docker 引擎中,执行一条命令即可启用。到 2018 年,除了原生 Swarm 应用,它还可以部署和管理 Kubernetes 应用。
一般10台以上用k8s,10台以下swarm
官网文档
Swarm mode overview | Docker Documentation
环境准备
需要4台服务器,阿里云购买个人后台创建ecs,选择按量付费+共享性
每台需要安装docker ,xshell中打开四个窗口,选择一个右键选择同步会话,其他三个会同步操作
Swarm工作模式
通过swarm搭建docker集群
参考地址
【狂神说Java】Docker进阶篇超详细版教程通俗易懂_哔哩哔哩_bilibili
初始化节点a,(a、b、d、c)
#ip可通过ip addr 查看eth0即可 docker swarm init --advertise-addr 172.21.30.251
初始化节点完成后,把其他3台服务器c d e依次搭建进去,在a上先获取令牌
# 获取令牌 #获取管理者令牌方式 [root@izj6c22bffydfp7tlrbx7fz ~]# docker swarm join-token manager To add a manager to this swarm, run the following command: docker swarm join --token SWMTKN-1-19s33oz27db2fxbkimmh2cz2upq75hn9tbn19o1j4rc2cxlb3j-4g88m1p1mwlcf9w37cvnne239 172.21.30.251:2377 #获取工作者令牌方式 [root@izj6c22bffydfp7tlrbx7fz ~]# docker swarm join-token worker To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-19s33oz27db2fxbkimmh2cz2upq75hn9tbn19o1j4rc2cxlb3j-7ncmcil94nzm4jxdh21n9k2yy 172.21.30.251:2377 [root@izj6c22bffydfp7tlrbx7fz ~]#
根据令牌加入工作者和管理者
比如将b设置为工作者,直接在b执行
docker swarm join --token SWMTKN-1-19s33oz27db2fxbkimmh2cz2upq75hn9tbn19o1j4rc2cxlb3j-7ncmcil94nzm4jxdh21n9k2yy 172.21.30.251:2377
将c设置成管理者,直接在c执行
docker swarm join --token SWMTKN-1-19s33oz27db2fxbkimmh2cz2upq75hn9tbn19o1j4rc2cxlb3j-4g88m1p1mwlcf9w37cvnne239 172.21.30.251:2377
搭建完成通过命令查看
docker node ls
Raft协议
Raft协议:保证大多数节点存活才可以用。只要>1 ,集群至少大于3台!
启动服务
swarm中不在叫启动容器而是启动一个服务,docker run 容器启动!容器不具有扩缩性,docker service启动服务!具有扩缩性,滚动更新!
启动一个服务
查看服务 REPLICAS
docker service ls
只有一个节点
动态管理容器(扩缩容)
现在用户量增加 需要3台容器,则只需扩容nginx服务
或者使用scale命令扩容
集群相当于一个整体,上面通过update或者scale扩容后,或随机分配服务到节点中,有的可能没有分到,通过docker ps 可以查看
但是就算此节点没有分到服务,通过该节点服务器ip:80也能访问服务
删除服务命令
docker swarm rm
三、Stack
docker-compose 单机部署项目!Docker Stack部署,集群部署!
//单机 docker-compose up -d wordpress.yam 集群内 docker stack deploy wordpress.yaml
四、Secret
安全!配置密码,证书
五、Config
创建配置文件. 主要是在docker swarm service创建的过程中 挂在配置文件
主要在docker swarm 容器管理中使用
docker swarm init
echo "This is a config" | docker config create my-config -
挂在配置文件my-config到service容器
docker service create --name redis --config my-config redis:alpine