docker 入门,docker-compose 入门

news2024/11/20 16:29:26

1,什么是docker 

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。

注意他是一个开源得应用容器 引擎 ,大家说docker容器,这不准确,应该回答是容器化技术,应用容器引擎。基于go 语言开发的。

 这里说到go 语言 ,我想聊聊,目前go语言大火的原因就是他开发了docker  目前 bat 这些大公司 都在做技术转型,从Java 转 go ,我有幸接触了三个月的go 语言开发,他比java 更轻量级(定义结构体和接口完成服务,结构体理解为java 的对象),对于开发大数据,微服务的应用运行速度更快,尤其是目前微服务都部署到了docker 上,那go语言选型就作为上层开发的首选!

java  和 go 语言的区别:

1、Go不允许函数重载,java允许;

2、Java默认允许多态,Go没有;

3、Go用HTTP协议进行路由配置,java不是;

4、Go代码可以自动扩展到多个核心,而Java并不总是具有足够的可扩展性;

5、Java对象的方法会有隐藏this指针传递,Go没有;

6、Java不支持多继承,Go支持多继承;

7、GO采用的是非侵入式接口,而java不是

 还有补充一点也是重要的一点,就是二者并发支持不同,

        并发模型:Go在语言级别上支持轻量级的协程(goroutine)和通道(channel),可以方便地处理并发任务。而Java需要使用线程来实现并发,需要更多的编码工作

 为啥要用docker呢?

 我们的部署一般都是 数据库程序,中间件部署到一台或者几台机器上,这是所有早期物联网公司必然经历的一个阶段。一台服务器,至少32核CPU、64G内存,如果只部署一个应用,那就太浪费了。于是,多个应用进程,DB,缓存进程等等都部署在同一个机器上。这样部署固然能高效的利用好昂贵的物理机,但是这种简单粗暴的方式有一个最大的痛点:进程间资源抢占。如果某个进程耗用了100%的CPU资源,其他的进程无法提供服务。或者如果一个进程因为突发异常很多,日志把磁盘打满了,所有的进程都要挂掉。进程间抢占资源导致其他进程无法提供服务所导致的血案数不胜数。
  既然因为资源共享导致的问题,那么解决方式就是:进程间硬件资源隔离。虚拟机技术的出现解决了这个棘手的问题。

 虚拟机通过 与软件硬化,即每台物理机从分配好的cpu , 内存,磁盘,配置网络,形成一个虚拟容器,相信大家都安装锅vm ,wmare 等软件,让自己的笔记本有两个系统,其实这个就是虚拟化技术的早期体现。

    但是 ,当大量集群化部署到虚拟机中,由于不同虚拟机的 tomcat jd ng 等软件的版本不同,我们在运维的时候需要挨个去看,挨个修改升级版本,这就比较麻烦,此时容器化技术出现。

     当应用集群部署时, 每台机器首先会拉去镜像,docker build 成容器,举个例子,我们部署的 nacos 镜像赖的 mysql 镜像, 我们的businessServer 业务服务也依赖mysql 镜像,他们依赖同一个镜像,当我们mysql 升级后,我们重新修改镜像文件配置,两个服务的依赖都会变化。 我们重新构建镜像后,版本依然时使用新版。我们就只需要该配置重新构建就可以,这是不是简单的多了,可见这就是伟大的程序人的思想啊,我们庆幸我们是站在巨人的肩膀上!

3, dockerfile

 Dockerfile 由一行行命令语句组成,并且支持以 # 开头的注释行

一般的,Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。

# 基础镜像
FROM  openjdk:8-jre
# author
MAINTAINER ruoyi

# 挂载目录
VOLUME /home/ruoyi
# 创建目录
RUN mkdir -p /home/ruoyi
# 指定路径
WORKDIR /home/ruoyi
# 复制jar文件到路径
COPY ./jar/ruoyi-modules-file.jar /home/ruoyi/ruoyi-modules-file.jar
# 启动文件服务
ENTRYPOINT ["java","-jar","ruoyi-modules-file.jar"]

其中,一开始必须指明所基于的镜像名称,接下来推荐说明维护者信息。

后面则是镜像操作指令,例如 RUN 指令,RUN 指令将对镜像执行跟随的命令。每运行一条 RUN 指令,镜像添加新的一层,并提交。workdir  创建一个目录(

为后续的 RUN、CMD、ENTRYPOINT 指令配置工作目录。

可以使用多个 WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径

), copy 命令时复制jar ,(

复制本地主机的 (为 Dockerfile 所在目录的相对路径)到容器中的 。

当使用本地目录为源目录时,推荐使用 COPY。

最后是 CMD 指令,来指定运行容器时的操作命令。

编写完成 Dockerfile 之后,可以通过 docker build 命令来创建镜像。

基本的格式为 docker build [选项] 路径,该命令将读取指定路径下(包括子目录)的 Dockerfile,并将该路径下所有内容发送给 Docker 服务端,由服务端来创建镜像。因此一般建议放置 Dockerfile 的目录为空目录。也可以通过 .dockerignore 文件(每一行添加一条匹配模式)来让 Docker 忽略路径下的目录和文件。

二、 docker-compose

    由于构建容器比较多,每次都要执行 docker build 一大串命令,去构建镜像这还是比较麻烦,那有没有一键移动构建多个镜像的方法呢?

docker-compse 应运而生 

Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。

Compose 使用的三个步骤:

  • 使用 Dockerfile 定义应用程序的环境。

  • 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。

  • 最后,执行 docker-compose up 命令来一键启动!!

  • 这是本地引用若依开源管理系统微服务版本再次感谢阳大神开发了这套开源管理系统,我们每个使用者学习者都会记住您和您的ruoyi,,,,构建的docker + docker compose 部署方式

注意 要执行 docker-compuse up 命令 要在 docker-compsose.yml  同级目录中如果不在同级目录中则会报错:

那我们打开看下docker-compose.yml 看下:

这里只截取了该服务的部分镜像:

version : 版本号

services :  定义服务

     xxx:  服务名

      container_name:  容器名称

     image :  镜像名称

   build: 

      context: ./nacos

    volumes : 数据卷挂在,就是容器内的配置文件或者日志, 或者数据存储位置挂在到外部,便于修改和存储。

  ports:  

     端口映射,容器内端口映射到外部用于访问

(暴露端口。注意端口映射与network_mode: host不兼容。支持short和long两种格式的语法。short语法可以使用HOST:CONTAINER的格式指定端口映射,也可以指定容器端口,宿主机会随机选择临时端口进行映射。)

     build: 在构建时应用的配置项。一般直接指定Dockerfile所在文件夹路径,可以是绝对路径,或者相对于Compose配置文件的路径。可以指定为包含构建上下文(context)路径的字符串。

depends_on : 

      - ruoyi-mysql 

完整的一个镜像配置yml

ruoyi-mysql:
    container_name: ruoyi-mysql
    image: mysql:5.7  (指定要从中启动容器的镜像。可以写仓库/标签,如果镜像不存在,Compose会自动拉取镜像)
    build:
      context: ./mysql
    ports:
      - "3306:3306"
    volumes:
      - ./mysql/conf:/etc/mysql/conf.d
      - ./mysql/logs:/logs
      - ./mysql/data:/var/lib/mysql
    command: [
          'mysqld',
          '--innodb-buffer-pool-size=80M',
          '--character-set-server=utf8mb4',
          '--collation-server=utf8mb4_unicode_ci',
          '--default-time-zone=+8:00',
          '--lower-case-table-names=1'
        ]
    environment:
      MYSQL_DATABASE: 'ry-cloud'
      MYSQL_ROOT_PASSWORD: password

指定服务之间的依赖关系,解决服务启动先后顺序问题。指定服务之间的依赖关系,将会导致以下行为:

docker-compose up以依赖顺序启动服务。

docker-compose up SERVICE会自动包含SERVICE的依赖项。

docker-compose stop 以依赖顺序停止服务。

docker-compose stop           停止正在运行的容器

docker-compose  start 启动容器,

docker-compose down  

停止由 docker-compose up 启动的容器

移除这些容器

移除关联的网络

移除关联的卷

docker-compose ps -a 命令

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1416961.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多维时序 | Matlab实现DBO-GRU蜣螂算法优化门控循环单元多变量时间序列预测

多维时序 | Matlab实现DBO-GRU蜣螂算法优化门控循环单元多变量时间序列预测 目录 多维时序 | Matlab实现DBO-GRU蜣螂算法优化门控循环单元多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现DBO-GRU蜣螂算法优化门控循环单元多变量时间序列预…

万字图解 | 深入揭秘HTTP工作原理

大家好,我是「云舒编程」,今天我们来聊聊计算机网络面试之-(应用层HTTP)工作原理。 文章首发于微信公众号:云舒编程 关注公众号获取: 1、大厂项目分享 2、各种技术原理分享 3、部门内推 前言 想必不少同学在面试过程中&#xff0…

华清远见作业第三十四天——C++(第三天)

思维导图: 题目: 设计一个Per类,类中包含私有成员:姓名、年龄、指针成员身高、体重,再设计一个Stu类,类中包含私有成员:成绩、Per类对象p1,设计这两个类的构造函数、析构函数和拷贝构造函数。 代码&#…

LabVIEW动态数据交换实现数据通信

LabVIEW动态数据交换实现数据通信 介绍了LabVIEW软件在驱动一般多功能接口卡中的应用。LabVIEW作为一种图形化编程平台,被广泛应用于自动测量系统、工业过程自动化等领域。利用LabVIEW驱动实验室中常用的多功能接口卡,以实现数据采集和分析。 系统主要…

通讯录项目(终)

Start And Stick 上一期我们将通讯录的项目的基本功能已经实现,这一篇文章我们将对通讯录进行完善。 目录 Start And Stick 上期回顾: 上期必要代码: 数据打印: 代码讲解: 头部插入数据: 代码讲解&…

黑马程序员-瑞吉外卖-day5

修改实体类 package com.itheima.reggie.entity;import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode;i…

常见の算法5

位图 一个int类型32字节,可以表示0-31这32个数出没出现过,出现过1没出现0,再扩大一点搞个数组,就可以表示0-1023出没出现过,一个long类型可储存64位 如何把10位组成的数,第四位由1改成零 package class05…

【深度学习:开源BERT】 用于自然语言处理的最先进的预训练

【深度学习:开源BERT】 用于自然语言处理的最先进的预训练 是什么让 BERT 与众不同?双向性的优势使用云 TPU 进行训练BERT 结果让 BERT 为您所用 自然语言处理 (NLP) 面临的最大挑战之一是训练数据的短缺。由于 NLP 是一个具有许多…

绿联私有云DX4600升级DX4600 Pro试用体验 | 全方位解读“卷王”NAS的进化史

哈喽小伙伴们好,我是Stark-C~ 想必很多关注数码圈的朋友都知道绿联这个品牌吧?作为一个深耕数码科技领域数十载的国民大品牌,绿联现在可谓是在数码行业全面开花,并且取得的成就大家也是有目共睹。它家的产品基本都是以高性价比著…

详解SpringCloud微服务技术栈:ElasticSearch实践1——RestClient操作索引库与文档

👨‍🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习 🌌上期文章:详解SpringCloud微服务技术栈:ElasticSearch原理精讲、安装、实践 📚订阅专栏:微服务技术全家…

C++ 数论相关题目 表达整数的奇怪方式(中国剩余定理)

给定 2n 个整数 a1,a2,…,an 和 m1,m2,…,mn ,求一个最小的非负整数 x ,满足 ∀i∈[1,n],x≡mi(mod ai) 。 输入格式 第 1 行包含整数 n 。 第 2…n1 行:每 i1 行包含两个整数 ai 和 mi ,数之间用空格隔开。 输出格式 输出最小…

使用 create-react-app 创建 react 应用

一、创建项目并启动 第一步:全局安装:npm install -g create-react-app 第二步:切换到想创建项目的目录,使用命令create-react-app hello-react 第三步:进入项目目录,cd hello-react 第四步:启…

内部类 --java学习笔记

内部类 是类中的五大成分之一(成员变量、方法、构造器、内部类、代码块),如果一个类定义在另一个类的内部,那么这个类就是内部类当一个类的内部包含了一个整体的事务,且这个事务没必要单独设计时,就可以把…

Java面试题:JMM与锁的理论

王有志,一个分享硬核Java技术的互金摸鱼侠 加入Java人的提桶跑路群:共同富裕的Java人 今天是《面霸的自我修养》的第二弹,内容是Java并发编程中关于Java内存模型(Java Memory Model)和锁的基础理论相关的问题。这两块内…

网工必备工具:不懂它,何谈高手之位?

点开之前,你脑子里闪出来的工具是什么?ping?又或是arp、tracert、route……? 今天要给你分享的是非常经典的Linux网络抓包工具Tcpdump。 它允许用户拦截和显示发送或收到过网络连接到该计算机的TCP/IP和其他数据包。 Tcpdump 适用…

【语录】岁月

中年 写中年,应该是年少励志三千里 踌躇百步无寸功,转眼高堂已白发 儿女蹒跚学堂中,不如意事常八九,可与人言无二三 可是诸位,不用悲伤,稻盛和夫说, 人生并不是一场物质的盛宴,而是…

12.Golang中类的表示与封装

目录 概述类的表示代码结果 类的封装代码结果 结束 概述 Golang中类的表示与封装 类的表示 代码 注释掉的代码,并不能拿来当赋值或获取值来使用。 package mainimport "fmt"// 类大写则代表,可以被其它包使用 type Hero struct {// 属性方法大…

30岁以就业为目标学前端,快歇着吧;反之50岁都不晚。

Hi,我是贝格前端工场,首先声明声明我们不搞前端培训,有很多老铁在留言中问我关于前端学习的问题,最普遍的一个问题就是30岁以后学前端晚了吗?今天借着此篇文章回答一下。 一、30岁学前端的三种人 首先抛开年龄不说&am…

【计算数组连续值的移动距离】及【计算遥控器按键总次数】

计算数组连续值的移动距离及计算遥控器按键总次数 计算数组连续值的移动距离计算遥控器按键总次数 计算数组连续值的移动距离 /*** 计算数组连续值的移动距离* 给定一个乱序的整数数组,数组中值为1~n,请计算出所有数字移动到比其大1的数字位置的距离和。…

【vue2】路由之 Vue Router

文章目录 一、安装二、基础使用1、简单的示例2、动态路由2.1 定义动态路径参数2.2 获取动态路径的参数2.3 捕获所有路由 3、嵌套路由4、编程式的导航4.1 router.push4.2 router.replace4.3 router.go(n) 5、命名路由6、重定向 三、进阶1、导航守卫1.1 全局前置守卫1.2 全局后置…