Docker自定义镜像

Dockerfile自定义镜像

一:镜像结构

镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成。
我们以MySQL为例,来看看镜像的组成结构:

简单来说,镜像就是在系统函数库、运行环境基础上,添加应用程序文件、配置文
件、依赖文件等组合,然后编写好启动脚本打包在一起形成的文件。
我们要构建镜像,其实就是实现上述打包的过程。
 

1.2:Dockerfile语法

构建自定义的镜像时,并不需要一个个文件去拷贝,打包。
我们只需要告诉Docker,我们的镜像的组成,需要哪些BaseImage、需要拷贝什么
文件、需要安装什么依赖、启动脚本是什么,将来Docker会帮助我们构建镜像。
而描述上述信息的文件就是Dockerfile文件。
Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说
明要执行什么操作来构建镜像。每一个指令都会形成一层Layer。

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

更新详细语法说明,请参考官网文档:Dockerfile reference | Docker Docs

1.3 案例一
基于Ubuntu镜像构建一个新镜像,运行一个java项目

        *新建一个空文件夹docker-demo
        *拷贝课前资料中的docker-demo.jar文件到docker-demo这个目录
        *拷贝课前资料中的jdk8.tar.gz文件到docker-demo这个目录
        *拷贝课前资料提供的Dockerfile到docker-demo这个目录
        *进入docker-demo

运行命令:docker build -t javaweb:1.0 .

最后访问:http://192.168.112.100:8090/hello,其中的ip改成你的虚拟机ip

1.4 案例二

基于java:8-alpine镜像,将一个Java项目构建为镜像


虽然我们可以基于Ubuntu基础镜像,添加任意自己需要的安装包,构建镜像,但是
却比较麻烦。所以大多数情况下,我们都可以在一些安装了部分软件的基础镜像上做
改造。


例如,构建java项目的镜像,可以在已经准备了JDK的基础镜像基础上构建。


需求:基于java:8-alpine镜像,将一个Java项目构建为镜像


实现思路如下:

        *新建一个空的目录,然后在目录中新建一个文件,命名为Dockerfile
        *拷贝课前资料提供的docker-demo.jar到这个目录中
        *编写Dockerfile文件:
                基于java:8-alpine作为基础镜像
                将app.jar拷贝到镜像中
                暴露端口
                编写入口ENTRYPOINT
        内容如下:

FROM openjdk:8
COPY ./app.jar /tmp/app.jar
EXPOSE 8090
ENTRYPOINT java -jar /tmp/app.jar

        *使用docker build命令构建镜像
        *使用docker run创建容器并运行

Dockerfile的本质是一个文件,通过指令描述镜像的构建过程
Dockerfile的第一行必须是FROM,从一个基础镜像来构建
基础镜像可以是基本操作系统,如Ubuntu。也可以是其他人制作好的镜像,例如:
openjdk:8

二.Docker-Compose


5.1 DockerCompose简介

Docker Compose可以基于Compose文件帮我们快速的部署分布式应用,而无需手
动一个个创建和运行容器!


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

version: "3.8"
services:
        mysql:
                image: mysql:5.7.25
                environment:
                        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"
 

上面的Compose文件就描述一个项目,其中包含两个容器:
        *mysql:一个基于mysql:5.7.25镜像构建的容器,并且挂载了两个目录

        *web:一个基于docker build临时构建的镜像容器,映射端口时8090
其实DockerCompose文件可以看做是将多个docker run命令写到一个文件,只是语
法稍有差异。

DockerCompose的详细语法参考官网:Compose file reference | Docker Docs

2.2 安装DockerCompose


        方式一:Linux下需要通过命令下载:

# 安装
curl -L
https://github.com/docker/compose/releases/download/1.23.1/docker-
compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

如果下载速度较慢,或者下载失败,使用课前资料提供的docker-compose文件
方式二:上传docker-compose文件到/usr/local/bin/目录。
修改文件权限:

# 修改权限
chmod +x /usr/local/bin/docker-compose
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

1.3 部署微服务集群
1.3.1 数据库迁移

将cloud-demo涉及的相关sql导入到Linux上的mysql容器中

5.3.2 阅读docker-compose.yml文件

version: "3.2"
services:
        nacos:
               image: nacos/nacos-server:1.4.1
                environment:

                        MODE: standalone
                ports:
                        - "8848:8848"
        mysql:
                image: mysql:8.0.30
                environment:
                        MYSQL_ROOT_PASSWORD: 123456
                volumes:
                        - "/tmp/mysql/data:/var/lib/mysql"
                        - "/tmp/mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf"
                ports:
                        - "3306:3306"
                userservice:
                        build: ./user-service
                        depends_on:
                                - nacos
                                - mysql
                        ports:
                                - "8081:8081"
                orderservice:
                        build: ./order-service
                        depends_on:
                                - nacos
                                - mysql
                        ports:
                                - "8080:8080"
                gateway:
                        build: ./gateway
                        depends_on:
                                - nacos
                                - mysql
                        ports:
                                - "10010:10010"

5.3.3 将项目打包

<build><finalName>app</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins>
</build>

配置文件:

# 所有连接mysql的地方都要修改为mysql的容器名称(需要添加端口号)
# 所有连接nacos的地方都要修改为nacos的容器名称(需要添加端口号)

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

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

相关文章

论文阅读(十六):利用线性链条件随机场模型检测阵列比较基因组杂交数据的拷贝数变异

1.论文链接&#xff1a;Detection of Copy Number Variations from Array Comparative Genomic Hybridization Data Using Linear-chain Conditional Random Field Models 摘要&#xff1a; 拷贝数变异&#xff08;CNV&#xff09;约占人类基因组的12%。除了CNVs在癌症发展中的…

ASP.NET Core 中间件

目录 一、常见的内置中间件 二、自定义中间件 三、中间件的执行顺序 四、其他自动逸中间件案例 1. 身份验证中间件 2、跨域中间件&#xff08;CORS&#xff09; ASP.NET Core 中&#xff0c;中间件&#xff08;Middleware&#xff09;是处理 HTTP 请求和响应的组件链。你…

JavaScript中的数组方法总结+详解

在JS中,数组方法是非常重要且常用的方法.在此整理总结一番. 1. javaScript常用数组方法 2.方法详解 1.push(); 功能: 在数组最后一位添加一个或多个元素,并返回新数组的长度,改变原数组.(添加多个元素用逗号隔开) var arr [1, 2, "c"];var rel arr.push(&q…

「全网最细 + 实战源码案例」设计模式——桥接模式

核心思想 桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式&#xff0c;将抽象部分与其实现部分分离&#xff0c;使它们可以独立变化。降低代码耦合度&#xff0c;避免类爆炸&#xff0c;提高代码的可扩展性。 结构 1. Implementation&#xff08;实现类…

动态规划DP 背包问题 完全背包问题(题目分析+C++完整代码)

概览检索 动态规划DP 概览&#xff08;点击链接跳转&#xff09; 动态规划DP 背包问题 概览&#xff08;点击链接跳转&#xff09; 完全背包问题 原题链接 AcWiing 3. 完全背包问题 题目描述 有 N种物品和一个容量是 V的背包&#xff0c;每种物品都有无限件可用。 第 i种物…

开源智慧园区管理系统对比五款主流产品探索智能运营新模式

内容概要 在这个数字化迅速发展的时代&#xff0c;园区管理也迎来了全新的机遇和挑战。众所周知&#xff0c;开源智慧园区管理系统作为一种创新解决方案&#xff0c;正逐步打破传统管理的局限性。它的开放性不仅使得系统可以根据具体需求进行灵活调整&#xff0c;也为用户提供…

Unity实现按键设置功能代码

一、前言 最近在学习unity2D&#xff0c;想做一个横版过关游戏&#xff0c;需要按键设置功能&#xff0c;让用户可以自定义方向键与攻击键等。 自己写了一个&#xff0c;总结如下。 二、界面效果图 这个是一个csv文件&#xff0c;准备第一列是中文按键说明&#xff0c;第二列…

稀疏混合专家架构语言模型(MoE)

注&#xff1a;本文为 “稀疏混合专家架构语言模型&#xff08;MoE&#xff09;” 相关文章合辑。 手把手教你&#xff0c;从零开始实现一个稀疏混合专家架构语言模型&#xff08;MoE&#xff09; 机器之心 2024年02月11日 12:21 河南 选自huggingface 机器之心编译 机器之心…

C++哈希(链地址法)(二)详解

文章目录 1.开放地址法1.1key不能取模的问题1.1.1将字符串转为整型1.1.2将日期类转为整型 2.哈希函数2.1乘法散列法&#xff08;了解&#xff09;2.2全域散列法&#xff08;了解&#xff09; 3.处理哈希冲突3.1线性探测&#xff08;挨着找&#xff09;3.2二次探测&#xff08;跳…

29.Word:公司本财年的年度报告【13】

目录 NO1.2.3.4 NO5.6.7​ NO8.9.10​ NO1.2.3.4 另存为F12&#xff1a;考生文件夹&#xff1a;Word.docx选中绿色标记的标题文本→样式对话框→单击右键→点击样式对话框→单击右键→修改→所有脚本→颜色/字体/名称→边框&#xff1a;0.5磅、黑色、单线条&#xff1a;点…

深入理解Java引用传递

先看一段代码&#xff1a; public static void add(String a) {a "new";System.out.println("add: " a); // 输出内容&#xff1a;add: new}public static void main(String[] args) {String a null;add(a);System.out.println("main: " a);…

Python从零构建macOS状态栏应用(仿ollama)并集成AI同款流式聊天 API 服务(含打包为独立应用)

在本教程中,我们将一步步构建一个 macOS 状态栏应用程序,并集成一个 Flask 服务器,提供流式响应的 API 服务。 如果你手中正好持有一台 MacBook Pro,又怀揣着搭建 AI 聊天服务的想法,却不知从何处迈出第一步,那么这篇文章绝对是你的及时雨。 最终,我们将实现以下功能: …

Qt之数据库操作三

主要介绍qt框架中对数据库的增加&#xff0c;删除和修改功能。 软件界面如下 程序结构 tdialogdata.h中代码 #ifndef TDIALOGDATA_H #define TDIALOGDATA_H#include <QDialog> #include<QSqlRecord> namespace Ui { class TDialogData; }class TDialogData : pub…

neo4j入门

文章目录 neo4j版本说明部署安装Mac部署docker部署 neo4j web工具使用数据结构图数据库VS关系数据库 neo4j neo4j官网Neo4j是用ava实现的开源NoSQL图数据库。Neo4作为图数据库中的代表产品&#xff0c;已经在众多的行业项目中进行了应用&#xff0c;如&#xff1a;网络管理&am…

JVM-运行时数据区

JVM的组成 运行时数据区-总览 Java虚拟机在运行Java程序过程中管理的内存区域&#xff0c;称之为运行时数据区。 《Java虚拟机规范》中规定了每一部分的作用 运行时数据区-应用场景 Java的内存分成哪几部分&#xff1f; Java内存中哪些部分会内存溢出&#xff1f; JDK7 和J…

Java篇之继承

目录 一. 继承 1. 为什么需要继承 2. 继承的概念 3. 继承的语法 4. 访问父类成员 4.1 子类中访问父类的成员变量 4.2 子类中访问父类的成员方法 5. super关键字 6. super和this关键字 7. 子类构造方法 8. 代码块的执行顺序 9. protected访问修饰限定符 10. 继承方式…

leetcode——验证二叉搜索树(java)

给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含小于当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 示例 1&#xff1a; 输入…

家居EDI:Hom Furniture EDI需求分析

HOM Furniture 是一家成立于1977年的美国家具零售商&#xff0c;总部位于明尼苏达州。公司致力于提供高品质、时尚的家具和家居用品&#xff0c;满足各种家庭和办公需求。HOM Furniture 以广泛的产品线和优质的客户服务在市场上赢得了良好的口碑。公司经营的产品包括卧室、客厅…

Spring Boot + Facade Pattern : 通过统一接口简化多模块业务

文章目录 Pre概述在编程中&#xff0c;外观模式是如何工作的&#xff1f;外观设计模式 UML 类图外观类和子系统的关系优点案例外观模式在复杂业务中的应用实战运用1. 项目搭建与基础配置2. 构建子系统组件航班服务酒店服务旅游套餐服务 3. 创建外观类4. 在 Controller 中使用外…

八、Spring Boot 日志详解

目录 一、日志的用途 二、日志使用 2.1 打印日志 2.1.1 在程序中获取日志对象 2.1.2 使用日志对象打印日志 2.2、日志框架介绍 2.2.1 门面模式(外观模式) 2.2.2 门面模式的实现 2.2.3 SLF4J 框架介绍 2.3 日志格式的说明 2.4 日志级别 2.4.1 日志级别的分类 2.4.2…