Docker网桥、DockerFile自定义镜像、DockerCompose工具(二)

这里写目录标题

  • 1、网桥
    • 1.1、网络相关操作
      • 1.1.1、创建网络
      • 1.1.2、列出网络
      • 1.1.3、加入网络
      • 1.1.4、查看网络详情
      • 1.1.5、删除网络
  • 2、Dockerfile自定义镜像
    • 2.1、镜像结构
    • 2.2、Dockerfile语法
      • 2.2.1、概述
      • 2.2.2、快速入门
      • 2.2.1、FROM
      • 2.2.2、CMD
      • 2.2.3、ENV
      • 2.2.4、WORKDIR
      • 2.2.5、run
      • 2.2.6、ADD
      • 2.2.7、EXPOSE
    • 2.3、构建镜像
  • 3、DockerCompose
    • 3.1、DockerCompose概述
    • 3.2、安装DockerCompose
    • 3.3、初始DockerCompose
    • 3.4、DockerCompose元素

1、网桥

虽然默认情况下容器和容器可以进行网络通信。但是每次创建容器都是Docker给容器分配的IP地址,这让我们使用起来不太方便。

这些情况我们都可以创建自定义网络来解决这些问题。把需要互相连通的容器加入到同一个网络,这样容器和容器之间就可以通过容器名来代替ip地址进行互相访问

1.1、网络相关操作

Java项目往往需要访问其它各种中间件,例如MySQL、Redis等,MySQL容器和Redis之间可以相互访问,但是,容器的网络IP其实是一个虚拟的IP,其值并不固定与某一个容器绑定,如果我们在开发时写死某个IP,而在部署时很可能MySQL容器的IP会发生变化,连接会失败。所以,我们必须借助于docker的网络功能来解决这个问题,常见命令有:

命令说明文档地址
docker network create创建一个网络docker network create
docker network ls查看所有网络docs.docker.com
docker network rm删除指定网络docs.docker.com
docker network prune清除未使用的网络docs.docker.com
docker network connect使指定容器连接加入某网络docs.docker.com
docker network disconnect使指定容器连接离开某网络docker network disconnect
docker network inspect查看网络详细信息docker network inspect

1.1.1、创建网络

  • 用法:docker network create 网络名
docker network create blog_net

1.1.2、列出网络

  • 用法:docker network ls

1.1.3、加入网络

我们可以在容器创建时使用 --network 选项让容器创建时就加入对应的网络。

  • 容器创建时加入网络用法:docker run --network 网络名 镜像名
  • 容器创建后加入网络用法:docker network connect 网络名 容器名或容器id

示例:

docker network connect blog_net sg_blog

1.1.4、查看网络详情

  • 用法:docker network inspect 网络名或者网络id

示例:

docker network inspect blog_net

1.1.5、删除网络

  • 用法:docker network rm 网络名或网络id

2、Dockerfile自定义镜像

前面我们一直在使用别人准备好的镜像,那如果我要部署一个Java项目,把它打包为一个镜像该怎么做呢?

2.1、镜像结构

要想自己构建镜像,必须先了解镜像的结构。之前我们说过,镜像之所以能让我们快速跨操作系统部署应用而忽略其运行环境、配置,就是因为镜像中包含了程序运行需要的系统函数库、环境、配置、依赖。因此,自定义镜像本质就是依次准备好程序运行的基础环境、依赖、应用本身、运行配置等文件,并且打包而成。

举个例子,我们要从0部署一个Java应用,大概流程是这样:

  • 准备一个linux服务(CentOS或者Ubuntu均可)
  • 安装并配置JDK
  • 上传Jar包
  • 运行jar包

那因此,我们打包镜像也是分成这么几步:

  • 准备Linux运行环境(java项目并不需要完整的操作系统,仅仅是基础运行环境即可)
  • 安装并配置JDK
  • 拷贝jar包
  • 配置启动脚本

上述步骤中的每一次操作其实都是在生产一些文件(系统运行环境、函数库、配置最终都是磁盘文件),所以镜像就是一堆文件的集合。但需要注意的是,镜像文件不是随意堆放的,而是按照操作的步骤分层叠加而成,每一层形成的文件都会单独打包并标记一个唯一id,称为Layer)。这样,如果我们构建时用到的某些层其他人已经制作过,就可以直接拷贝使用这些层,而不用重复制作。

例如,第一步中需要的Linux运行环境,通用性就很强,所以Docker官方就制作了这样的只包含Linux运行环境的镜像。我们在制作java镜像时,就无需重复制作,直接使用Docker官方提供的CentOS或Ubuntu镜像作为基础镜像。然后再搭建其它层即可,这样逐层搭建,最终整个Java项目的镜像结构如图所示:

在这里插入图片描述

2.2、Dockerfile语法

2.2.1、概述

Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer。

由于制作镜像的过程中,需要逐层处理和打包,比较复杂,所以Docker就提供了自动打包镜像的功能。我们只需要将打包的过程,每一层要做的事情用固定的语法写下来,交给Docker去执行即可。而这种记录镜像结构的文件就称为Dockerfile,其常用语法:

指令说明示例
FROM指定基础镜像FROM centos:6
ENV设置环境变量,可在后面指令使用ENV key value
COPY拷贝本地文件到镜像的指定目录COPY ./xx.jar /tmp/app.jar
RUN执行Linux的shell命令,一般是安装过程的命令RUN yum install gcc
EXPOSE指定容器运行时监听的端口,是给镜像使用者看的EXPOSE 8080
ENTRYPOINT镜像中应用的启动命令,容器运行时调用ENTRYPOINT java -jar xx.jar

例如,要基于Ubuntu镜像来构建一个Java应用,其Dockerfile内容如下:

# 指定基础镜像
FROM ubuntu:16.04# 配置环境变量,JDK的安装目录、容器内时区
ENV JAVA_DIR=/usr/local
ENV TZ=Asia/Shanghai# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar# 设定时区
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone# 安装JDK
RUN cd $JAVA_DIR \&& tar -xf ./jdk8.tar.gz \&& mv ./jdk1.8.0_144 ./java8# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin# 指定项目监听的端口
EXPOSE 8080# 入口,java项目的启动命令
ENTRYPOINT ["java", "-jar", "/app.jar"]

我们思考一下:以后我们会有很多很多java项目需要打包为镜像,他们都需要Linux系统环境、JDK环境这两层,只有上面的3层不同(因为jar包不同)。如果每次制作java镜像都重复制作前两层镜像,是不是很麻烦。所以,就有人提供了基础的系统加JDK环境,我们在此基础上制作java镜像,就可以省去JDK的配置了:

# 基础镜像
FROM openjdk:11.0-jre-buster# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone# 拷贝jar包
COPY xxx.jar /app.jar# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]

是不是简单多了。

2.2.2、快速入门

首先明确三点:

  • Dockerfile 不区分大小写,但是习惯大写
  • 基本以FROM指令开头
  • 开头代表注释

需求:构建一个最简单的HelloWorld镜像

  • 创建文件 HelloWorld
  • 编写指令
FROM centos:7 
CMD ["echo","helloworld"]
  • 编译镜像
# -t 指定镜像名和标签
# -f 指定基于哪个DockerFile文件去构建镜像
# .表示在当前目录下查找对应的DockerFile来构建镜像
docker build -t hello:1.0 -f HelloWorld .

在这里插入图片描述

  • 运行我们的镜像
docker run hello:1.0

在这里插入图片描述

2.2.1、FROM

  • 作用:用来定义基础镜像
  • 用法:FROM 镜像名:标签名
  • 作用时机:构建镜像的时候
  • 例如
FROM centos:7

2.2.2、CMD

  • 作用:用来定义容器运行时的默认命令。可以在使用docker run的时候覆盖掉CMD中定义的命令

  • 作用时机:运行容器的时候

  • 用法:CMD ["命令1","参数1","参数2"]

    • 命令和参数作为 json 数组的元素去书写,这种形式不会直接去解析环境变量**(也就是有方括号包裹的话,不会解析环境变量)**
    • CMD echo $HOME 这种形式可以解析环境变量

一个DockerFile文件中如果有多个CMD命令,只有最后一条CMD命令会执行。

2.2.3、ENV

  • 作用:用来定义环境变量
  • 用法:ENV 变量名 = "变量值" ,例如:ENV DIR = "/root"
  • 作用时机:构建镜像的时候

2.2.4、WORKDIR

  • 作用:用于设置当前工作的目录,如果该目录不存在会自动创建
  • 用法:WORKDIR 目录 ,例如 WORKDIR /root/app (在执行到这里时,会判断这个目录是否存在,不存在会创建目录,并且 cd 到这个目录中去)
  • 作用时机:构建镜像的时候
  1. 探索:有如下指令,最终使用pwd输出的目录是什么
FROM centos:7WORKDIR /a
WORKDIR b
WORKDIR c
# /a/b/c
CMD pwd
  1. 如果WORKDIR指定的父目录不存在,则会把父目录自动创建
WORKDIR /a/b/c
  1. WORKDIR指定的目录可以引用环境变量
FROM centos:7
ENV DIR="/app/cdd"
WORKDIR &DIR
CMD pwd

2.2.5、run

  • 作用:它是用来定义构建过程中要执行的命令的
  • 用法:RUN 命令,例如RUN echo sg
  • 作用时机:构建镜像的时候

CMD 是执行容器运行中的命令,RUN 是构建过程中的命令

需求:

定义一个CONTENT变量,默认值为hellodocker,在镜像的 /app 目录下创建一个 sg 目录,在其中创建一个 content.txt 文件,文件的内容为 CONTENT 变量的值。容器启动时打印 content.txt 的内容。

FROM centos:7
ENV CONTENT = "hellodocker"
WORKDIR /app/sg
RUN echo &CONTENT > content.txt
CMD ["cat","content.txt"]

2.2.6、ADD

  • 作用:把**构建上下文(构建目录)**中的文件或者网络文件添加到镜像中,如果文件是一个压缩包会自动解压,如果是网络中的文件并不会自动解压
  • 用法:ADD 原路径 目标路径,例如:ADD sg-blog-vue.tar.gz把构建上下文中的 sg-blog0vue.tar.gz 添加到镜像当前的工作目录中
  • 作用时机:构建镜像的时候

2.2.7、EXPOSE

  • 作用:暴露需要发布的端口,让镜像使用者知道应该发布哪些端口
  • 用法:EXPOSE 端口1 端口2,例如:EXPOSE 80 8080
  • 作用时机:构建镜像的时候

需求:

  • 在构建目录下存放一个 sg-blog-vue.tar.gz 包,构建镜像的时候把这个包添加到镜像的 /app 目录下解压,然后把其中的 dist 目录的内容存放到 nginx 的html 目录下,声明开放80端口,nginx用 1.21.5 版本。
    • 构建目录DockerFile所在的目录就是构建目录
# 基础镜像nginx:1.21.5
# WORKDIR /app 在构建目录下新建/app目录并进入
# ADD sg-blog-vue.tar.gz .   将这个包添加到镜像的当前目录并解压
# 把解压后的dist下的文件都复制到 nginx 的 html 目录下
# CMD 前台启动nginx
FROM nginx:1.21.5
WORKDIR /app
ADD sg-blog-vue.tar.gz .
RUN cp -r sg-blog-vue/dist/* /usr/share/nginx/html
EXPOSE 80
CMD ["nginx","-g","daemon off;"]

2.3、构建镜像

当Dockerfile文件写好以后,就可以利用命令来构建镜像了。例如我们将xxx.jar 包和Dockerfile拷贝到虚拟机的/root/demo 目录:

# 进入镜像目录
cd /root/demo
# 开始构建
docker build -t xxx:1.0 .
  • docker build : 就是构建一个docker镜像
  • -t xxx:1.0-t参数是指定镜像的名称(repositorytag
  • . : 最后的点是指构建时Dockerfile所在路径,由于我们进入了demo目录,所以指定的是.代表当前目录,也可以直接指定Dockerfile目录:
# 直接指定Dockerfile目录
docker build -t xxx:1.0 /root/demo

查看镜像列表:

# 查看镜像列表:
docker images

然后尝试运行该镜像:

# 1.创建并运行容器
docker run -d --name dd -p 8090:8090 xxx:1.0
# 2.查看容器
dps# 3.访问
curl localhost:8080

3、DockerCompose

我们在部署运行一个项目的时候可能需要运行多个容器,还要去处理这些容器的网络、数据卷等。如果用 docker 命令一个个去处理还是不方便,DockerCompose 就是去解决这个问题的。

3.1、DockerCompose概述

DockerCompose 是用来定义和运行一个或多个(通常都是多个)运行和应用的工具。

  • 可以使用 YAML 文件来配置应用程序的服务,然后使用单个命令,就可以根据配置文件创建并启动所有服务

3.2、安装DockerCompose

  • 当前版本的Docker已经集成了DockerCompose
  • 使用docker compose version 可以查看其版本

3.3、初始DockerCompose

  1. 编写 docker-compose.yaml 模板文件

    Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。格式如下:

version: "3.8"services:mysql:image: mysql:5.7.25environment:MYSQL_ROOT_PASSWORD: 123 volumes:- "/tmp/mysql/data:/var/lib/mysql"- "/tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf"web:build: .ports:- "8090:8090"
  1. 运行:docker compose up
  2. 停止:docker compose down

上面的Compose文件就描述一个项目,其中包含两个容器:

  • mysql:一个基于mysql:5.7.25镜像构建的容器,并且挂载了两个目录
  • web:一个基于docker build临时构建的镜像容器,映射端口时8090

DockerCompose的详细语法参考官网:https://docs.docker.com/compose/compose-file/

  • 其实DockerCompose文件可以看做是将多个docker run命令写到一个文件,只是语法稍有差异。

3.4、DockerCompose元素

元素:

  • command:覆盖容器启动后的默认指令
  • environment:指定环境变量,相当于run的 -e 选项
  • image:用来指定镜像
  • networks:指定网络,相当于 run 的 --network
  • ports:用来指定要发布的端口,相当于 run 的 -p
  • volumes:用来指定数据卷,相当于 -v
  • restart:用来指定重启策略,相当于 --restart

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于汽车中网改装需要报备吗?(第二天)

车联网改造需要申报吗? 今天2022年10月20日,小编就给大家介绍一下车联网改装是否需要申报的相关知识。 让我们来看看。 汽车格栅改装无需申报。 这种年检可以直接通过。 您不必担心,因为汽车格栅对于实车的外观来说并不陌生,因此…

设计编程网站集:生活部分:饮食+农业,植物(暂记)

这里写目录标题 植物相关综合教程**大型植物:****高大乔木(Trees):** 具有坚硬的木质茎,通常高度超过6米。例如,橡树、松树、榉树等。松树梧桐 **灌木(Shrubs):** 比乔木…

flutter使用记录(vscode开发)

1.Gradle-7.6.3-all.zip 下载失败 编辑项目中的 gradle/wrapper/gradle-wrapper.properties 文件,并设置 distributionUrl 的值为可靠的镜像站点,如下所示: distributionUrlhttps\://services.gradle.org/distributions/gradle-7.6.3-all.z…

HarmonyOS ArkTS 基础组件

目录 一、常用组件 二、文本显示(Text/Span) 2.1 创建文本 2.2 属性 2.3 添加子组件(Span) 2.4 添加事件 三、按钮(Button) 3.1 创建按钮 3.2 设置按钮类型 3.3 悬浮按钮 四、文本输入(TextInput/TextArea)…

个人网站制作 Part 14 添加网站分析工具 | Web开发项目

文章目录 👩‍💻 基础Web开发练手项目系列:个人网站制作🚀 添加网站分析工具🔨使用Google Analytics🔧步骤 1: 注册Google Analytics账户🔧步骤 2: 获取跟踪代码 🔨使用Vue.js&#…

分库分表场景下多维查询解决方案(用户+商户)

在采用分库分表设计时,通过一个PartitionKey根据散列策略将数据分散到不同的库表中,从而有效降低海量数据下C端访问数据库的压力。这种方式可以缓解单一数据库的压力,提升了吞吐量,但同时也带来了新的问题。对于B端商户而言&#…

权限提升-Web权限提升篇划分获取资产服务后台系统数据库管理相互转移

知识点 1、权限提升转移-分类&高低&场景 2、Web权限提升及转移-后台&数据库 3、后台权限及转移-转移对象&后台分类 章节点: 1、Web权限提升及转移 2、系统权限提升及转移 3、宿主权限提升及转移 4、域控权限提升及转移 基础点 0、为什么我们要学…

B004-springcloud alibaba 服务容错 Sentinel

目录 高并发带来的问题服务雪崩效应常见容错方案常见的容错思路隔离超时限流熔断降级 常见的容错组件 Sentinel入门什么是Sentinel微服务项目集成Sentinel核心库安装Sentinel控制台实现一个接口的限流 Sentinel的概念和功能基本概念重要功能 Sentinel规则流控规则三种流控模式三…

verilog设计-CDC:单bit脉冲快时钟域到慢时钟域

一、前言 当单bit信号由快时钟域传递给慢时钟域时,快时钟域的异步信号最小可为快时钟信号的一个时钟周期脉冲,快时钟域的单时钟周期脉冲长度小于慢时钟域的时钟周期,很有可能该脉冲信号在慢时钟域的两个时钟上升沿之间,导致该脉冲…

Flask中的Blueprints:模块化和组织大型Web应用【第142篇—Web应用】

👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Flask中的Blueprints:模块化和组织大型Web应用 在构建大型Web应用时&#xff0…

数据机构-2(顺序表)

线性表 概念 顺序表 示例&#xff1a;创建一个存储学生信息的顺序表 表头&#xff08;Tlen总长度&#xff0c; Clen当前长度&#xff09; 函数 #include <seqlist.c> #include <stdio.h> #include <stdlib.h> #include "seqlist.h" #include &…

【论文精读】OTA: Optimal Transport Assignment for Object Detection(物体探测的最优传输分配)

OTA最优传输 &#x1f680;&#x1f680;&#x1f680;摘要一、1️⃣ Introduction---介绍二、2️⃣Related Work---相关工作2.1 &#x1f393; Fixed Label Assignment--静态标签分配2.2 ✨Dynamic Label Assignment--动态标签分配 三、3️⃣Method---论文方法3.1 &#x1f39…

Linux - 应用层HTTPS、传输层TCP/IP模型中典型协议解析

目录 应用层&#xff1a;自定制协议实例 HTTP协议首行头部空行正文http服务器的搭建 HTTPS协议 传输层UDP协议TCP协议 应用层&#xff1a; 应用层负责应用程序之间的沟通—程序员自己定义数据的组织格式 应用层协议&#xff1a;如何将多个数据对象组织成为一个二进制数据串进行…

【探讨】基于卷积神经网络深度学习模型的光场显微三维粒子空间分布重建

光场显微粒子图像测速技术通过单光场相机即可实现微尺度三维速度场的测量&#xff0c;但单光场相机角度信息有限&#xff0c;导致粒子重建的轴向分辨率低、重建速度慢。基于此&#xff0c;提出一种基于卷积神经网络深度学习模型的光场显微粒子三维空间分布重建方法&#xff0c;…

说说你对webpack的理解?解决了什么问题?

文章目录 一、背景二、问题三、是什么参考文献 一、背景 Webpack 最初的目标是实现前端项目的模块化&#xff0c;旨在更高效地管理和维护项目中的每一个资源 模块化 最早的时候&#xff0c;我们会通过文件划分的形式实现模块化&#xff0c;也就是将每个功能及其相关状态数据各…

浅谈如何自我实现一个消息队列服务器(2)——实现 broker server 服务器

文章目录 一、实现 broker server 服务器1.1 创建一个SpringBoot项目1.2 创建Java类 二、硬盘持久化存储 broker server 里的数据2.1 数据库存储2.1.1 浅谈SQLiteMyBatis 2.1.2 如何使用SQLite 2.2 使用DataBaseManager类封装数据库操作2.3 文件存储消息2.3.1 存储消息时&#…

Visual Studio 2022进行文件差异比较

前言 Visual Studio 2022在版本17.7.4中发布在解决方案资源管理器中比较文件的功能&#xff0c;通过使用此功能&#xff0c;可以轻松地查看两个文件之间的差异&#xff0c;包括添加、删除和修改的代码行。可以逐行查看差异&#xff0c;并根据需要手动调整和编辑文件内容以进行…

100个openharmony开源demo:1.日历

准备用开发者手机写100个开源的demo不知道能不能实现&#xff0c;日拱一卒&#xff0c;期待蜕变。 第一个demo&#xff1a;日历&#xff0c;借鉴了网上的日历算法&#xff0c;自己用arkts写了界面和点击事件&#xff0c;各位可根据此demo写自己的日历选择器等组件。 1.目录结…

【Godot 3.5组件】简单血条组件HealthBar

说明 本文原文写自2022年&#xff0c;内容基于Godot3.5。是本人早期进行Godot组件化和自定义节点探索时的产物&#xff0c;当时的代码和思想可能不太成熟&#xff0c;但贴出来&#xff0c;供需要学习组件化基础思路的同学食用。 概述 血条作为一个非常基础和常见的组件&…

【C++】---string的模拟

【C】---string的模拟 一、string类实现1.string类的构造函数2.swap&#xff08;&#xff09;函数3.拷贝构造函数4.赋值运算符重载5.析构6.迭代器7.operator[ ]8.size9.c_str&#xff08;&#xff09;10.reserve&#xff08;&#xff09;11.resize&#xff08;&#xff09;12.p…