Docker高级篇之Docker-compose容器编排

2024-06-10 12:04

本文主要是介绍Docker高级篇之Docker-compose容器编排,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 1. Docker-compse介绍
    • 2. Docker-compse下载
    • 3. Docker-compse核心概念
    • 4. Docker-compse使用案例

1. Docker-compse介绍

Docker-compose时Docker官方的一个开源的项目,负责对Docker容器集群的快速编排。Docker-compose可以管理多个Docker容器组成一个应用,你需要定义一个YAML格式的配置文件,docker-compose.yml,写好多个容器之间的调用关系,然后,只需要一个命令,就能同时启动/关闭这些容器。

docker建议我们每个容器中只运行一个服务,因为docker容器本身占用的资源比较少,所以是将每个服务单独的分割开来,但是这样我们又面临一个问题?

如果我们需要同时部署多个服务,难道我们要给每个服务单独写Dockerfile然后构建镜像,构建容器,这样是很麻烦的,所以docker官方为我们提供了docker-compos多服务部署的工具。例如现在我们需要实现一个web微服务项目,除了web服务容器本身,往往还需要加上后端的mysql服务器,redis服务器,注册中心,甚至还包括nginx负载均衡容器等。Compose运行用户通过docker-compose.yml来定义一组相关联的应用容器为一个项目,这样就可以很容器地用一个配置文件定义一个多容器应用,然后使用一条指令安装这个应用的所有依赖,完成构建。docker-compose解决了容器和容器之间如何编排的问题。

2. Docker-compse下载

官网下载的位置为:https://docs.docker.com/compose/install/

安装Docker Compose最简单也是最推荐的方法是安装Docker Desktop。Docker Desktop包括Docker Compose、Docker Engine和Docker CLI,它们是Docker Compose的先决条件。这里我Mac电脑上面是直接安装了docker desktop,自带按照了docker compose,所以如何安装我就不演示了,网上也有很多教程。
在这里插入图片描述
我们可以查看docker compose的版本:

docker-compose --version

在这里插入图片描述

3. Docker-compse核心概念

docker-compose的核心概念就是一个文件,两个要素。其中一个文件是docker-compose.yml。两个要素分别是服务和工程。服务指的是一个个应用容器的实例,比如订单微服务、库存微服务、mysql容器、nginx容器或者redis容器。工程就是由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml文件中定义。

使用docker-compose的步骤如下:

  • 编写dockerfile定义各个微服务应用并构建出对应的镜像文件
  • 使用docker-compose.yml定义一个完整业务单元,安排好整体应用中的各个容器服务
  • 最后,执行docker-compose up命令来启动并运行整个应用程序,完成一键部署上线

docker-compose的常见命令如下:

命令解释
docker-compose -h查看帮助
docker-compose up启动所有docker-compose服务
docker-compose up -d启动所有docker-compose服务并在后台运行
docker-compose down停止并删除容器、网络、卷以及镜像
docker-compose exec yml里面的服务id进入容器实例内部docker-compose exec docker-compose.yml文件中写的服务id /bin/bash
docker-compose ps展示当前docker-compose编排过的运行的所有容器
docker-compose top展示当前docker-compose编排过的容器进程
docker-compose logs yml里面的服务id查看容器输出日志
docker-compose config检查配置
docker-compose config -q检查配置,有问题才有输出
docker-compose restart重启服务
docker-compose start启动服务
docker-compose stop停止服务

4. Docker-compse使用案例

改造前面使用过的docker_boot案例:

  • SQL建表建库
CREATE TABLE `t_user` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`username` varchar(50) NOT NULL DEFAULT '' COMMENT '用户名',`password` varchar(50) NOT NULL DEFAULT '' COMMENT '密码',`sex` tinyint(4) NOT NULL DEFAULT '0' COMMENT '性别 0=女 1=男',`deleted` tinyint(4) unsigned NOT NULL DEFAULT '0' COMMENT '删除标志,默认0不删除,1删除',`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1114 DEFAULT CHARSET=utf8 COMMENT='用户表';
  • 下载项目

链接:https://pan.baidu.com/s/1f2aMCKGToDp6DwPLKMJUXw
提取码:cbwn

  • 编写Dockerfile
#基础镜像使用java
FROM java:8#作者
MAINTAINER jackiechai#VOLUE指定临时文件夹为/tmp。在主机指定目录下创建一个临时文件并链接到容器的/tmp
VOLUME /tmp#将jar包添加到容器并更名
ADD docker_boot-0.0.1-SNAPSHOT.jar jackiechai_docker.jar#运行jar包RUN bash -c 'touch /jackiechai_docker.jar'
ENTRYPOINT ["java","-jar","/jackiechai_docker.jar"]
#暴露端口6001作为微服务EXPOSE 6001
  • 运行docker file构建镜像
docker build -t jackiechai_docker.jar:1.6 .

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

我们首先不使用docker-compose来运行这个项目:

  • 是先创建mysql容器实例
docker run -p 3308:3306 --name mysql57 --privileged=true -v /Users/jackchai/Desktop/复习/Docker/boot_mysql/conf:/etc/mysql/conf.d -v /Users/jackchai/Desktop/复习/Docker/boot_mysql/logs:/logs -v /Users/jackchai/Desktop/复习/Docker/boot_mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d e00adb645cb5

在这里插入图片描述

修改mysql然后让navicat连接到mysql服务(操作流程看这篇博客:https://blog.csdn.net/a1023266384/article/details/119455841)同时创建数据库和表:

不进行这步操作可能报错:1130 - Host ‘172.17.0.1’ is not allowed to connect to this MySQL server

在这里插入图片描述

  • 然后创建redis实例
docker run -p 6379:6379 --name redis608 --privileged=true -v /Users/jackchai/Desktop/复习/Docker/boot_redis/redis.conf:/etc/redis/redis.conf -v /Users/jackchai/Desktop/复习/Docker/boot_redis/data:/data -d redis:6.0.8 redis-server /etc/redis/redis.conf
  • 启动镜像
docker run -d -p 6001:6001 [镜像id]

在这里插入图片描述

  • 进行swagger测试

在这里插入图片描述
在这里插入图片描述

数据插入成功

在这里插入图片描述

数据查找成功

上面我没使用docker-compose玩成了服务的部署。但是会存在下面这些问题:

  • 先后顺序要求固定,先mysql+redis部署,才能进行微服务的部署
  • 运行了多个run命令
  • 容器间的启停或宕机,有可能导致ip地址对应的容器实例变化,映射出错,要么生产ip写死,要么通过服务调用

使用docker-compose来运行这个项目:

  • 编写docker-compose.yml文件
version: "3"
services:microService:image: jackiechai_docker.jar:1.6container_name: ms01ports:- "6001:6001"volumes:- /Users/jackchai/Desktop/复习/Docker/boot/microService:/datanetworks:- jack_netdepends_on:- redis- mysql
redis:image: redis:6.0.8ports:- "6379:6379"volumes:- /Users/jackchai/Desktop/复习/Docker/boot_redis/redis.conf:/etc/redis/redis.conf - /Users/jackchai/Desktop/复习/Docker/boot_redis/data:/datanetworks:- jack_netcommand: redis-server /etc/redis/redis.confmysql:image: mysql/mysql-server:5.7environment:MYSQL_ROOT_PASSWORD: '123456'MYSQL_ALLOW_EMPTY_PASSWORD: 'no'MYSQL_DATABASE: 'db2024'MYSQL_USER: 'jackiechai'MYSQL_PASSWORD: '123456'ports:- "3307:3306"volumes:- /Users/jackchai/Desktop/复习/Docker/boot_mysql/db:/var/lib/mysql- /Users/jackchai/Desktop/复习/Docker/boot_mysql/conf/my.cnf:/etc/my.cnf- /Users/jackchai/Desktop/复习/Docker/boot_mysql/init:/docker-entrypoint-initdb.dnetworks:- jack_netcommand: --default-authentication-plugon=mysql_native_password
networks:jack_net

在这里插入图片描述

  • 然后修改微服务的配置,将固定地址访问改成服务名访问
server.port=6001
# ========================alibaba.druid????=====================
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://mysql:3307/db2024?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.druid.test-while-idle=false
# ========================redis????=====================
spring.redis.database=0
spring.redis.host=redis
spring.redis.port=6379
spring.redis.password=
spring.redis.lettuce.pool.max-active=8
spring.redis.lettuce.pool.max-wait=-1ms
spring.redis.lettuce.pool.max-idle=8
spring.redis.lettuce.pool.min-idle=0
# ========================mybatis????===================
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.wang.docker.entities
# ========================swagger=====================
spring.swagger2.enabled=true

然后重新打包

  • 然后运行docker-compose

首先我们需要坚持docker-compose是否出现语法错误:

docker-compose config -q

如果docker-compose.yml没有任何错误,它不会出现任何提示

然后我们可以运行docker-compose了

docker-compose up -d

在这里插入图片描述
然后我们进入mysql建库建表:

docker exec -it c265227ba92a bash

在这里插入图片描述

  • 最后我们使用swagger进行测试

同样可以执行成功,这里就不演示了。

这篇关于Docker高级篇之Docker-compose容器编排的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1048108

相关文章

Docker镜像pull失败两种解决办法小结

《Docker镜像pull失败两种解决办法小结》有时候我们在拉取Docker镜像的过程中会遇到一些问题,:本文主要介绍Docker镜像pull失败两种解决办法的相关资料,文中通过代码介绍的非常详细... 目录docker 镜像 pull 失败解决办法1DrQwWCocker 镜像 pull 失败解决方法2总

如何将Tomcat容器替换为Jetty容器

《如何将Tomcat容器替换为Jetty容器》:本文主要介绍如何将Tomcat容器替换为Jetty容器问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Tomcat容器替换为Jetty容器修改Maven依赖配置文件调整(可选)重新构建和运行总结Tomcat容器替

通过Docker Compose部署MySQL的详细教程

《通过DockerCompose部署MySQL的详细教程》DockerCompose作为Docker官方的容器编排工具,为MySQL数据库部署带来了显著优势,下面小编就来为大家详细介绍一... 目录一、docker Compose 部署 mysql 的优势二、环境准备与基础配置2.1 项目目录结构2.2 基

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa

关于Docker Desktop的WSL报错问题解决办法

《关于DockerDesktop的WSL报错问题解决办法》:本文主要介绍关于DockerDesktop的WSL报错问题解决办法的相关资料,排查发现是因清理%temp%文件夹误删关键WSL文件,... 目录发现问题排查过程:解决方法其实很简单:重装之后再看就能够查到了:最后分享几个排查这类问题的小www.cp

Python容器类型之列表/字典/元组/集合方式

《Python容器类型之列表/字典/元组/集合方式》:本文主要介绍Python容器类型之列表/字典/元组/集合方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 列表(List) - 有序可变序列1.1 基本特性1.2 核心操作1.3 应用场景2. 字典(D

kotlin中的行为组件及高级用法

《kotlin中的行为组件及高级用法》Jetpack中的四大行为组件:WorkManager、DataBinding、Coroutines和Lifecycle,分别解决了后台任务调度、数据驱动UI、异... 目录WorkManager工作原理最佳实践Data Binding工作原理进阶技巧Coroutine

如何使用Docker部署FTP和Nginx并通过HTTP访问FTP里的文件

《如何使用Docker部署FTP和Nginx并通过HTTP访问FTP里的文件》本文介绍了如何使用Docker部署FTP服务器和Nginx,并通过HTTP访问FTP中的文件,通过将FTP数据目录挂载到N... 目录docker部署FTP和Nginx并通过HTTP访问FTP里的文件1. 部署 FTP 服务器 (

解读docker运行时-itd参数是什么意思

《解读docker运行时-itd参数是什么意思》在Docker中,-itd参数组合用于在后台运行一个交互式容器,同时保持标准输入和分配伪终端,这种方式适合需要在后台运行容器并保持交互能力的场景... 目录docker运行时-itd参数是什么意思1. -i(或 --interactive)2. -t(或 --