Docker Compose

简介

Docker

DockerFile build run 手动操作,单个容器!

微服务。100个微服务!依赖关系。

Docker Compose 来轻松高效的管理容器。定义运行多个容器!

官方介绍
定义、运行多个容器。
YAML file 配置文件
single command 命令有哪些

三步骤

  1. Dockerfile 保证我们的项目在任何地方可以运行。
  2. services
    docker-compose.yml 这个文件怎么写!
  3. docker-compose up 启动项目

作用:批量容器编排。

Compose 是Docker官方的开源项目。需要安装!

Dockerfile 让程序在任何地方运行。

docker-compose.yaml

version: "3.9"  # optional since v1.27.0
services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/code
      - logvolume01:/var/log
    links:
      - redis
  redis:
    image: redis
volumes:
  logvolume01: {}

Compose:重要的概念

  • 服务service,容器。应用。(web、redis、mysql。。。)
  • 项目project。一组关联的容器。博客。web、mysql

安装docker-compose

# -o 下载docker-compose 到本地
curl -L "https://get.daocloud.io/docker/compose/releases/download/1.28.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 不知道为什么上面那个有时候会报错,就用下面这个
curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 授权,否则会报权限不够
chmod +x /usr/local/bin/docker-compose

# 出现版本则安装成功
docker-compose version

# 卸载docker-compose
# docker-compose卸载只需要删除二进制文件就可以了。
sudo rm /usr/local/bin/docker-compose

docker-compose命令

# 重启
docker-compose restart

# 日志
docker-compose logs -f 容器id/名称

体验

python应用。计数器。redis!

  1. 应用 app.py
  2. Dockerfile 应用打包为镜像(单机玩具!)
  3. docker-compose yaml文件(定义整个服务,需要的环境。web、redis)完整的上线服务!
  4. 启动 compose 项目(docker-compose up,停止是down,得再docker-compose.yml文件下输入命令)

就是四个文件

app.py
docker-compose.yml
Dockerfile
requirements.txt

内容在:
https://docs.docker.com/compose/gettingstarted/

流程:

  1. 创建网络
  2. 执行 Docker-compose yaml
  3. 启动服务
Docker compose yaml

Creating composetest_redis_1 ... done
Creating composetest_web_1   ... done

文件名定义规则

  1. 文件名 composetest
  2. 服务
  3. 1 就是集群中的第一个节点
version: "3.9"
services:
  web:
    build: .
    ports:
      - "5000:5000"
  redis:
    image: "redis:alpine"

网络规则

一个项目中有10个服务,所有服务都在同个网络下。

"ConfigOnly": false,
        "Containers": {
            "ae9d28941ef9a6be84856341bae784d45bf5e1c9f2f1cbdbf89d406fc7a48215": {
                "Name": "composetest_redis_1",
                "EndpointID": "f113bba0f037b68f4a780684246dd531334bd24a23df3a851fd75d288fe8c697",
                "MacAddress": "02:42:ac:14:00:03",
                "IPv4Address": "172.20.0.3/16",
                "IPv6Address": ""
            },
            "cd9727b5c5643c9af07c6296643684b904755e48b499c9ffb335a76506066cb5": {
                "Name": "composetest_web_1",
                "EndpointID": "59835d4adafaa0b682a8987fcb60f44957244a14edd093668a635929724d4253",
                "MacAddress": "02:42:ac:14:00:02",
                "IPv4Address": "172.20.0.2/16",
                "IPv6Address": ""
            }

如果在同一个网络下,我们能可以直接通过域名(name)访问。

以前都是单个 docker run 启动容器。

现在通过 docker-compose 编写yaml配置文件,可以通过compose一键启动所有服务,停止!

Docker小结:

  1. Docker镜像。run -> 容器
  2. DockerFile 构建镜像(服务打包)
  3. docker-compose 启动项目(编排、多个微服务/环境)
  4. Docker网络

yaml规则

# 三层!!!

version:''		# 版本,向下兼容
services:		# 服务
	服务1:web
		# 服务配置(就是说这里可以配置docker容器的配置)
		images
		build
		network
		# docker容器并不能自动读取宿主机的hosts,所以需要配置
		# 配置后需要停止容器,再启动才会读取到配置
		extra_hosts:
      		- "www.baidu.com:11.0.9.1"
		...
	服务2:redis
# 其他配置	网络/卷、全局规则
volumes:
network:
configs:

depends_on 启动顺序

docker 运维办公工具_docker 运维办公工具

配置域名解析

extra_hosts:
 - "somehost:162.242.195.82"
 - "otherhost:50.31.209.229"

dns: 8.8.8.8

dns:
  - 8.8.8.8
  - 9.9.9.9

开源项目

实战

  1. 编写项目微服务
package com.example.demo.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @Autowired
    StringRedisTemplate stringRedisTemplate;

    @GetMapping("/hello")
    public String hello(){
        Long views = stringRedisTemplate.opsForValue().increment("views");

        return "hello,kuangshen,thx,views" + views;
    }
}
  1. Dockerfile 构建镜像
FROM java:8

COPY *.jar /app.jar

CMD ["--server.port=8080"]

EXPOSE 8080

ENTRYPOINT ["java","-jar","/app.jar"]
  1. docker-compose.yml 编排项目
version: '3.8'
services:
  kuangapp:
    build: . # .代表当前目录下的Dockerfile
    image: kuangapp
    depends_on:
      - redis
    ports:
    - "8080:8080"
  redis:
    image: "library/redis:alpine"
  1. 丢到服务器,docker-compose up 启动

总结

工程、服务、容器

项目 compose:三层

  • 工程 Project
  • 服务 服务
  • 容器 运行实例! docker k8s

todo docker和jenkins的知识点乱了些,有时间再整理吧

docker 与 Jenkins

随着云计算和容器化技术的兴起,Docker和Jenkins成为了现代软件开发和运维中不可或缺的工具。Docker提供了轻量级的容器化解决方案,而Jenkins则是一个功能强大的自动化服务器,可以集成到项目中实现持续集成和持续部署(CI/CD)。

一、Docker简介

Docker是一个开源的容器化平台,它允许开发者将应用程序及其依赖项打包到一个可移植的容器中,并在任何Docker支持的平台上运行。通过Docker,我们可以轻松实现应用程序的隔离、版本控制和自动化部署。

二、Jenkins简介

Jenkins是一个开源的自动化服务器,用于自动化各种任务,如构建、测试和部署软件。它提供了丰富的插件生态系统,可以轻松地与各种工具和平台集成。Jenkins可以定时触发构建任务,监控代码仓库的变化,并在检测到新代码提交时自动触发构建和部署流程。

三、Docker与Jenkins的结合

将Docker与Jenkins结合使用,可以实现项目的自动化打包和部署。具体步骤如下:

  1. 安装Docker和Jenkins

在服务器上安装Docker和Jenkins。确保Docker服务已启动并正常运行。

  1. 配置Jenkins

打开Jenkins界面,进行必要的配置,如设置管理员账号、安装插件等。

  1. 安装Docker插件

在Jenkins中安装Docker插件,该插件允许Jenkins与Docker进行交互,实现容器的创建、停止和管理等操作。

  1. 创建Jenkins任务

在Jenkins中创建一个新的构建任务,配置任务的相关参数,如源码管理、构建触发器、构建步骤等。

  1. 配置Docker构建步骤

在构建步骤中,添加Docker构建步骤。指定Dockerfile的位置,配置构建镜像的相关参数,如镜像名称、标签等。

  1. 配置Docker部署步骤

在构建步骤中,添加Docker部署步骤。配置目标Docker主机的信息,指定要部署的容器名称、端口映射等。

  1. 保存并触发构建

保存配置后,手动触发或等待Jenkins自动触发构建任务。Jenkins将自动拉取源码、构建镜像、部署容器,完成整个项目的打包和部署过程。

四、实际应用中的优势

通过Docker与Jenkins的结合,我们可以实现以下优势:

  1. 自动化部署:Jenkins可以自动触发构建和部署流程,减少人工干预,提高工作效率。
  2. 环境一致性:Docker容器提供了隔离的环境,确保应用程序在不同环境中的一致性。
  3. 快速回滚:如果部署出现问题,可以迅速回滚到之前的版本,减少故障对业务的影响。
  4. 持续集成与持续部署:通过Jenkins的持续集成和持续部署功能,可以实时监控代码仓库的变化,并在代码提交后自动构建和部署。
  5. 可视化监控:Jenkins提供了丰富的可视化界面,可以实时监控构建和部署的状态,方便问题排查和管理。

五、总结

Docker与Jenkins的结合为现代软件开发和运维带来了极大的便利。通过自动化打包和部署,我们可以提高工作效率,减少人工错误,并确保应用程序在不同环境中的一致性。在实际应用中,我们可以根据项目的需求进行灵活的配置和扩展,以满足不同的业务需求。

Docker Swarm 适合十台服务器以下,k8s适合十台以上,现在k8s用的多,所以下面的了解一下就可以,我自己也没觉得下面有多详细,

Docker Swarm

集群

购买服务器并安装docker

4台服务器 1核2G!

工作模式

docker 运维办公工具_运维_02

  • 管理节点之间可以相互通信
  • 操作都在 manager(管理节点)
  • Raft 一致性算法

搭建集群

swarm命令

  1. 生成主节点 init
  2. 加入(管理者、worker)
  3. 目标:双主双从
[root@iZ2ze7eg85rq92ilowwya5Z ~]# docker swarm --help

Usage:  docker swarm COMMAND

Manage Swarm

Commands:
  ca          Display and rotate the root CA
  init        Initialize a swarm
  join        Join a swarm as a node and/or manager
  join-token  Manage join tokens
  leave       Leave the swarm
  unlock      Unlock swarm
  unlock-key  Manage the unlock key
  update      Update the swarm

私网、公网!

用私网的,不要钱,ip addr,eth0,172.22.80.249

# 初始化swarm节点
docker swarm init --advertise-addr 172.22.80.249

# 初始化节点后就会生成这个,在别的服务器上输入就可以加入该初始化节点
# docker swarm join --token SWMTKN-1-3o1dlg1iv4ritpj32lm0jhiy9lnwvjncdwzxcn82yur2y1p2ge-5fdhgkkqx6neglmevopfk9dtu 172.22.80.249:2377

# 加入一个节点
docker swarm join

# 获取令牌
docker swarm join-token manager
docker swarm join-token worker

# 主节点
[root@iZ2ze7eg85rq92ilowwya2Z ~]# docker node ls
ID                            HOSTNAME                  STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
9lttrciqnitzalg6zd62nnen3 *   iZ2ze7eg85rq92ilowwya2Z   Ready     Active         Reachable        20.10.5
c0201mzwwyhir4zn2spdrxlsc     iZ2ze7eg85rq92ilowwya3Z   Ready     Active                          20.10.5
hx2x19h34lz1bolne0vbn8sjc     iZ2ze7eg85rq92ilowwya4Z   Ready     Active                          20.10.5
vxdbials4mo4qgyhnkiysxzc4     iZ2ze7eg85rq92ilowwya5Z   Ready     Active         Leader           20.10.5

Raft协议

双主双从:假设一个节点挂了!其他节点是否可用!

Raft协议:保证大多数节点存活才可以用。只要>1,集群至少大于3台。

实验:

  1. 将docker1机器停止。宕机!双主,另外一个主节点也不能使用了!
  2. 将其他非主节点离开集群
# 节点离开集群
docker swarm leave
  1. worker就是工作的,管理节点操作!3台机器设置为了管理节点
# 在管理节点输入命令
docker swarm join-token manager

十分简单:集群,可用!3个主节点。>1台管理节点存活!
Raft协议:保证大多数节点存货,才可以使用 ,高可用!

体会

弹性、扩缩容!集群!

以后告别 docker run!

docker-compose up! 启动一个项目。单机!

集群:swarm docker service

容器 => 服务

容器 => 服务 => 副本

redis服务 => 10个副本!(同时开启10个redis容器)

docker service 命令

体验:创建服务、动态扩展服务、动态更新服务。

[root@iZ2ze7eg85rq92ilowwya5Z ~]# docker service --help

Usage:  docker service COMMAND

Manage services

Commands:
  create      Create a new service
  inspect     Display detailed information on one or more services
  logs        Fetch the logs of a service or task
  ls          List services
  ps          List the tasks of one or more services
  rm          Remove one or more services
  rollback    Revert changes to a service's configuration
  scale       Scale one or multiple replicated services
  update      Update a service

灰度发布:金丝雀发布!(发布不会影响网站的运行)

动态扩缩容

# 容器启动!不具有扩缩容器
docker run	
# 服务!具有扩缩容器,滚动更新!
docker service
# 查看服务
docker service ps 服务名
# 查看节点
docker service ls
# 动态扩缩容
# 添加三个nginx服务到集群,是一共3个不是添加3个
# 此时会把3个服务分配到不同的服务器,但有一个服务器不会有nginx服务
# 但依然可以对nginx进行访问
# 如果此时,想要动态回滚到两个节点,只需要把以下命令改为2
docker service update --replicas 3 mynginx
# 和上面命令是一样的
docker service scale mynginx=5
# 删除服务
docker service rm mynginx

服务,集群中任意的节点都可以访问。服务可以有多个副本动态扩缩容实现高可用!

docker swarm 其实并不难

只要会搭集群、会启动服务、动态管理容器就可以了!

概念总结

  • swarm
    集群的管理和编排。docker可以初始化一个 swarm 集群,其他节点可以加入。(管理、工作者)
  • node
    就是一个docker节点。多个节点就组成了一个网络集群。
  • service
    任务,可以在管理节点或者工作节点来运行。核心。
  • Task
    容器内的命令,细节任务!


张嘉佳