〖Docker指南⑦〗docker-compose快速入门

简介: 由Docker引领先锋,容器在过去的一年里得到了飞速发展。容器技术提供了组件化环境,帮助应用在云之间轻松迁移而无需显著的返工。当谈到构建云以及非云的应用时,容器的战斗口号是可移植性和简单性。

一、简介



由Docker引领先锋,容器在过去的一年里得到了飞速发展。容器技术提供了组件化环境,帮助应用在云之间轻松迁移而无需显著的返工。当谈到构建云以及非云的应用时,容器的战斗口号是可移植性和简单性。


随着容器在企业持续获得发展,厂商将增加新的功能让用户可以创建可扩展的基于容器的环境,这些功能很大程度上都集中于容器编排上。


容器编排工具提供调度和集群的技术,提供用于基于容器应用可扩展性的基本机制。这些工具使用容器服务,并编排他们以决定容器之间如何进行交互。此外,编排允许容器可以存在并执行在集群上,这使得他们能够扩展来适应增加的处理负荷。


docker-compose是docker官方提供的容器编排工具,但市面上使用得较多的容器编排工具是k8s。什么是容器编排?容器编排就是管理宿主机部署容器的过程。docker-compose 只支持单机多容器部署,通过yml文件配置你自己的服务,然后通过一个命令,你能使用配置文件创建和运行所有的服务,重点可以启动多个容器!!!


二、安装



2.1 版本选择


我们所选择的docker-compose版本要和docker engine版本对应:友情链接

1.png


2.2 下载


在 Linux 系统上将 Compose 安装为独立的二进制文件


  1. 运行以下命令下载 Docker Compose 的当前稳定版本:

curl -SL https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose

  1. 对二进制文件应用可执行权限:

chmod +x /usr/local/bin/docker-compose

  1. 测试安装:

docker-compose --version

2.png



三、原理



Compose 项目是由Python编写的,实际上就是调用了Docker服务提供的API来对容器进行管理,因此,只要所在的操作系统的平台支持Docker API,就可以在其上利用Compose来进行编排管理。


compose 中常常提及的概念:


project

通过 docker compose 管理的一个项目被抽象称为一个 project,它是由一组关联的应用容器组成的一个完整的业务单元。简单点说就是一个 docker-compose.yml 文件定义一个 project。

我们可以在执行 docker-compose 命令时通过 -p 选项指定 project 的名称,如果不指定,则默认是 docker-compose.yml 文件所在的目录名称。


service

运行一个应用的容器,实际上可以是一个或多个运行相同镜像的容器。可以通过 docker-compose up 命令的 --scale 选项指定某个 service 运行的容器个数,比如:


docker-compose up -d --scale redis=2


了解了上面的基本概念之后,让我们一起看看 compose 的一次调用流程:

3.png


右上角的 docker-compose 定义了一组 service 来组成一个 project,通过 docker-compose.yml 中 service 的定义与 container 建立关系(service 与容器的对应关系),最后使用 container 来完成对 docker-py(Python 版的 docker client) 的调用,向 docker daemon 发起 http 请求。


注意,这里的 project, service 和 container 对应的都是 docker-compose 实现中的数据结构。下面让我们结合上图来介绍 docker-compose 工作的大致流程。


首先,用户执行的 docker-compose up 命令调用了命令行中的启动方法,功能非常简单。一个 docker-compose.yml 文件定义了一个 project,docker-compose up 提供的命令行参数则作为这个 project 的启动参数交由 project 模块处理。


然后,如果当前宿主机已经存在与该应用对应的容器,docker-compose 则进行行为逻辑判断。如果用户指定可以重新启动已有服务,docker-compose 就会执行 service 模块的容器重启方法,否则就直接启动已有容器。这两种操作的区别在于前者会停止旧的容器,创建并启动新的容器,并把旧容器移除掉。在这个过程中创建容器的各项自定义参数都是从 docker-compose up 命令和 docker-compose.yml 中传入的。


接下来,启动容器的方法也很简洁,这个方法中完成了一个 docker 容器启动所需的主要参数的封装,并在 container 模块执行启动。


最后,contaier 模块会调用 docker-py 客户端来执行向 docker daemon 发起创建容器的 POST 请求。


由此可见 docker-compose 工作的整体流程非常清晰、简洁!


重新启动 services

前面我们提到当前宿主机已经存在与该应用对应的容器,docker-compose 会进行判断并决定是否重新启动已有服务。


强制 recreate

Recreate 就是删除现有的容器并且重新创建新的容器,为 docker-compose up 命令指定 --force-recreate 选项可以强制 recreate 容器。


创建个别容器

如果应用中的个别 service 对应的容器被删除了,docker-compose up 命令会新建相关的容器。


启动个别容器

与上面类似,如果应用中的个别 service 对应的容器被停止(stop)了,docker-compose up 命令会重新启动相关的容器。


四、常用命令



命令 注释

命令

注释
docker-compose -h 查看帮助
docker-composeup 启动所有docker-compose服务

docker-composeup -d

启动所有docker-compose服务并后台运行

docker-composedown

停止并删除容器、网络、卷、镜像
docker-composeexec ${yml内服务的id} /bin/bash 进入容器实例内部
docker-composeps 展示当前docker-compose编排过的运行的所有容器
docker-composetop

展示当前docker-compose编排过的容器进程

docker-composelogs ${yml内服务的id} 查看容器输出日志
docker-composeconfig 检查配置

docker-composeconfig -q

检查配置,有问题才输出
docker-composerestart 重启服务
docker-composestart 启动服务

docker-composestop

停止服务

Compose 大部分命令的对象即可以是项目的本身,也可以是指定为项目中的服务或者容器

执行docker-compose [COMMAND] --help 或者docker-compose help [COMMAND]可以查看命令的帮助信息


具体的使用格式

docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS]


参数选项


1 2
-f,--file file指定模板文件,默认是docker-compose.yml模板文件,可以多次指定

-p,--project-name

name指定项目名称,默认使用所在目录名称作为项目名称
--x-networking 使用Docker的后端可插拔网络特性
--x-networking-driver driver指定网络的后端驱动,默认使用bridge
--verbose 输入更多的调试信息
-v,--version 输出版本信息


Compose所支持的命令


1 1
build Build or rebuild services (构建项目中的服务容器)
bundle Generate a Docker bundle from the Compose file (从Compose文件生成分布式应用程序包)
config Validate and view the Compose file (验证并查看Compose文件)
create Create services (为服务创建容器)
down Stop and remove containers, networks, images, and volumes (停止容器并删除由其创建的容器,网络,卷和图像up)
events Receive real time events from containers (为项目中的每个容器流式传输容器事件)
exec Execute a command in a running container (这相当于docker exec。使用此子命令,您可以在服务中运行任意命令。默认情况下,命令分配TTY,因此您可以使用命令docker-compose exec web sh来获取交互式提示。)
help Get help on a command (获得一个命令的帮助)
images List images ()
kill Kill containers (通过发送SIGKILL信号来强制停止服务容器)
logs View output from containers (查看服务容器的输出)
pause Pause services (暂停一个容器)
port

Print the public port for a port binding (打印某个容器端口所映射的公共端口)

ps List containers (列出项目中目前所有的容器)
pull Pull service images (拉取服务依赖镜像)
push Push service images (推送服务镜像)
restart Restart services (重启项目中的服务)
rm Remove stopped containers (删除所有停止状态的服务容器)
run Run a one-off command (在指定服务上执行一个命令)
scale Set number of containers for a service (设置指定服务执行的容器个数)
start Start services (启动已存在的服务容器)
stop Stop services (停止已存在的服务容器)
top Display the running processes (显示容器正在运行的进程)
unpause Unpause services (恢复处于暂停状态的容器)
up Create and start containers (自动完成包括构建镜像、创建服务、启动服务并关联服务相关容器的一系列操作)
version Show the Docker-Compose version information (输出版本)


五、实战



编写docker-compose.yml


version: "3"
services:
  ossa-service-producer:
    image: ossa-service-producer-9001
    container_name: ossa-service-producer-9001
    ports:
      - "9001:9001"
    volumes:
      - /app/ossa-service-producer:/data
    networks:
      - ossa_net
    depends_on:
      - nacos
      - sentinel
  nacos:
    image: ossa-nacos
    ports:
    - "8848:8848"
    - "9848:9848"
    volumes:
    - /app/nacos:/data
    networks:
      - ossa_net
    command: 
  sentinel:
    image: ossa-sentinel
    ports:
      - "8858:8858"
    volumes:
      - /app/sentinel:/data
    networks:
      - ossa_net
    command: 

修改项目中的相关配置文件


server:
  port: 9001
spring:
  application:
    name: ossa-service-producer
  cloud:
    nacos:
      # nacos踩坑:docker run --name nacos -itd -e MODE=standalone -p 8848:8848 -p 9848:9848 nacos/nacos-server:v2.0.3
      discovery:
        server-addr: nacos:8848
        namespace: a3915605-1084-43cb-911e-d206afa6c032
        group: DEV_GROUP
      config:
        server-addr: nacos:8848
        file-extension: yml
        refresh-enabled: true
        group: DEV_GROUP
        namespace: a3915605-1084-43cb-911e-d206afa6c032
    sentinel:
      transport:
        dashboard: sentinel:8858
        port: 8719
#        clientIp: 127.0.0.1

执行配置文件检查

4.png



有问题修改,没问题执行yml文件

docker-compose up -d


此时查看我们的docker网络

docker network ls

会发现我们的自定义的网络名字ossa_net变成了docker-compose-test_ossa_net


「对于网络名称,会在自定的网络前加上当前文件夹名字+_,对于没有指定容器名字的服务,会在服务的前面加上当前文件夹名字+_,在后面加上数字1,如存在1,则递增」


最后,停止服务

docker-compose stop


文献参考:

徐珉. Docker环境下容器编排工具的选择. 《 集成电路应用 》 , 2017


相关文章
|
23天前
|
关系型数据库 MySQL Java
【Docker最新版教程】一文带你快速入门Docker常见用法,实现容器编排和自动化部署上线项目
Docker快速入门到项目部署,MySQL部署+Nginx部署+docker自定义镜像+docker网络+DockerCompose项目实战一文搞定!
|
2月前
|
消息中间件 NoSQL Kafka
Flink-10 Flink Java 3分钟上手 Docker容器化部署 JobManager TaskManager Kafka Redis Dockerfile docker-compose
Flink-10 Flink Java 3分钟上手 Docker容器化部署 JobManager TaskManager Kafka Redis Dockerfile docker-compose
65 4
|
3月前
|
应用服务中间件 nginx Docker
单机编排工具之docker-compose快速入门使用
这篇文章是关于如何使用docker-compose进行单机编排的快速入门指南,包括了镜像准备、docker-compose安装、使用教程以及验证服务生效的步骤。
66 2
单机编排工具之docker-compose快速入门使用
|
2月前
|
缓存 Kubernetes 应用服务中间件
1分钟了解什么是docker和docker-compose?前后端必知必会技能GET啦
1分钟了解什么是docker和docker-compose?前后端必知必会技能GET啦
|
3月前
|
Ubuntu Linux Docker
docker swarm快速入门篇
关于Docker Swarm集群部署和验证高可用性的快速入门教程。
59 2
|
4月前
|
数据采集 存储 Docker
Docker快速入门指南
Docker快速入门指南
55 1
|
4月前
|
Ubuntu Shell Linux
docker快速入门教程
docker快速入门教程
88 0
|
6月前
|
Linux 开发工具 Docker
【Docker】快速入门手册
【Docker】快速入门手册
128 1
|
6月前
|
Java Linux Shell
docker 打包 springboot 项目快速入门
docker 打包 springboot 项目快速入门
66 0
|
7月前
|
NoSQL Unix MongoDB
【docker 】docker-compose 部署mongoDB
【docker 】docker-compose 部署mongoDB
214 1