Docker 摸门级简易手册
Docker 摸门级简易手册
文章目录
- Docker 摸门级简易手册
- 使用 Docker 构建 Java 项目镜像
- Docker 安装
- Install on Mac
- Install on Windows
- Install on Linux
- Dockerfile 说明
- FROM
- LABEL
- ENV
- WORKDIR
- COPY
- ADD
- RUN
- CMD
- EXPOSE
- ENTRYPOINT
- VOLUME
- USER
使用 Docker 构建 Java 项目镜像
假设有个 Spring Boot 项目,其项目结构如下
.
├── Dockerfile
├── docker-entrypoint.sh
├── mvnw
├── mvnw.cmd
├── pom.xml
├── settings.xml
└── src├── main│ ├── java│ │ └── order│ │ ├── AppOrderApplication.java│ │ ├── InfoController.java│ │ ├── OrderController.java│ │ └── OrderServerProperties.java│ └── resources│ ├── application-dev.yaml│ ├── application-prod.yaml│ ├── application-test.yaml│ ├── application.yaml│ └── logback-file-and-console.xml└── test└── java└── order└── AppOrderApplicationTests.java
docker-entrypoint.sh
#!/bin/shecho "Start service [ Spring Boot Application ]."
java -jar app.jar ${JAVA_ARGS}
Dockerfile
FROM openjdk:8u342-oracle
LABEL authors="zhangyunan"ENV TZ=Asia/Shanghai
ENV LC_ALL en_US.utf8WORKDIR /appCOPY target/*.jar /app/app.jar
COPY docker-entrypoint.sh /appRUN chmod +x docker-entrypoint.shEXPOSE 30000ENTRYPOINT ["docker-entrypoint.sh"]
Docker 构建项目
docker build -t zyndev/spring-boot-app:1.0 .
Docker 运行项目
docker run -e "JAVA_ARGS=--spring.profiles.active=prod" -p 30002:30000 -d --name spring-boot-app-prod zyndev/spring-boot-app:1.0
测试一下
curl 127.0.0.1:30002/info{"currentTime": "2023-09-01T16:00:51.618","ServerName": "order","Profile": "prod"
}
Dockerfile 中最常用的指令包括:
- FROM:指定基础镜像。一般为 linux 或者对应的运行环境,比如 node, python, jdk
- RUN:镜像构建时执行的命令
- EXPOSE:指定容器暴露的端口
- ENV:设置环境变量
- COPY:将文件或目录复制到镜像中
- WORKDIR:设置镜像的工作目录
- ENTRYPOINT:启动时的默认命令,此指令设置的命令不可修改
Docker 安装
Install on Mac
可以通过安装 Docker Desktop 来间接安装 Docker
Install on Windows
可以通过安装 Docker Desktop 来间接安装 Docker
Install on Linux
Dockerfile 说明
Dockerfile 文件由一系列指令组成。每个指令都描述了构建镜像的某个步骤。Docker 可以通过读取 Dockerfile 中的指令自动构建镜像。 Dockerfile 是一个文本文档,其中包含用户可以在命令行上调用来组装映像的所有命令。
在 Dockerfile 中的 指令不区分大小写。不过按照惯例是用大写的,以便更容易地将它们与参数区分开来。在构建过程中按照 Dockerfile 中的指令顺序来执行。每个 Dockerfile 必须以 FROM 开始,其 FROM 前面只能有一个或多个 ARG 指令
Dockerfile 中最常用的指令包括:
- FROM:指定基础镜像
- WORKDIR:设置镜像的工作目录
- ENV:设置环境变量
- COPY:将文件或目录复制到镜像中
- ADD:将文件或目录复制到镜像中
- RUN:执行命令,在构建的阶段执行
- CMD:指定容器启动后默认执行的命令
- EXPOSE:指定容器暴露的端口
- VOLUME:创建卷
- USER:指定容器运行时的用户
- ARG:定义构建时可选参数
FROM
FROM 命令是指定你所使用的基础镜像.
指令语法
FROM [--platform=<platform>] <image> [AS <name>]
FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]
FROM [--platform=<platform>] <image>[@<digest>] [AS <name>]
如果引用多架构的镜像,可选 --platform 标志可用于指定架构的镜像。FROM 例如 linux/amd64、 linux/arm64、 或 windows/amd64。默认情况下使用构建机器对应的架构
示例
FROM ubuntu
FROM ubuntu:latest
FROM ubuntu:23.10
FROM alpine:3.18.3
FROM busyboxFROM openjdk:8u342-oracle
FROM python:3.9-slim
LABEL
将一些元数据添加到镜像中。
指令语法
LABEL <key>=<value> <key>=<value> <key>=<value> ...
示例
LABEL "com.example.vendor"="ACME Incorporated"
LABEL com.example.label-with-value="foo"
LABEL version="1.0"
LABEL description="描述"
LABEL org.opencontainers.image.authors="张瑀楠"LABEL multi.label1="value1" multi.label2="value2" other="value3"LABEL multi2.label1="value1" \multi2.label2="value2" \other2="value3"
可以使用 docker image inspect 来查看打包后的镜像的元数据信息
docker image inspect --format='{{json .Config.Labels}}' myimage{"com.example.vendor": "ACME Incorporated","com.example.label-with-value": "foo","version": "1.0","description": "描述","multi.label1": "value1","multi.label2": "value2","other": "value3","org.opencontainers.image.authors": "张瑀楠","multi2.label1": "value1","multi2.label2": "value2","other2": "value3"
}
ENV
设置环境变量。
指令语法
ENV <key>=<value> ...
示例
ENV TZ=Asia/Shanghai
ENV LC_ALL en_US.utf8ENV JAVA_HOME /usr/lib/jvm/java-7-openjdk-amd64
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH $PATH:$JAVA_HOME/bin:$JRE_HOME/binENV JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64 \CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar \PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
WORKDIR
指定容器中的工作目录,可以在构建时使用,也可以在启动容器时使用,构建使用就是通过 WORKDIR 将当前目录切换到指定的目录中,容器中使用的意思则是在你使用 docker run 命令启动容器时,默认进入的目录是 WORKDIR 指定的。
指令语法
WORKDIR /path/to/workdir
示例
WORKDIR /app
WORKDIR /opt/user
COPY
复制文件到镜像中。
指令语法
COPY [--chown=<user>:<group>] [--chmod=<perms>] <src>... <dest>
COPY [--chown=<user>:<group>] [--chmod=<perms>] ["<src>",... "<dest>"]
COPY 的 src 部分只能是本地文件,文件路径是 Dockerfile 的相对路径。如果 dest 是目录并且目录不存在,会帮你创建。
示例
COPY requirements.txt /app
COPY app.py /appCOPY target/*.jar /app/app.jar
COPY --chmod=777 docker-entrypoint.sh /appCOPY --chown=55:mygroup files* /somedir/
COPY --chown=bin files* /somedir/
COPY --chown=1 files* /somedir/
COPY --chown=10:11 files* /somedir/
COPY --chown=myuser:mygroup --chmod=644 files* /somedir/
ADD
复制命令,把本机的文件复制到镜像中,如果 dest 是目录则会帮你创建出这个目录,如果 src 是压缩文件会帮你解压出来。如果 src 是 url 则下载文件。
指令语法
ADD [--chown=<user>:<group>] [--chmod=<perms>] [--checksum=<checksum>] <src>... <dest>
ADD [--chown=<user>:<group>] [--chmod=<perms>] ["<src>",... "<dest>"]
示例
ADD https://th.bing.com/th/id/OIP.sGpPNLl05CAXgEY5bGguOgHaE8 /app/ss.img
FROM alpine:3.18.3
LABEL authors="zhangyunan"WORKDIR /appADD https://th.bing.com/th/id/OIP.sGpPNLl05CAXgEY5bGguOgHaE8 /app/ss.img
RUN
运行指定的命令,此命令只有在执行docker build时才会执行,其他情况下不会执行。
指令语法
RUN <command> (如果在 linux 中入默认用 /bin/sh -c ,在 windows 中用 cmd /S /C)
RUN ["executable", "param1", "param2"]
示例
RUN apt-get update \&& apt-get install openjdk-8-jdk --no-install-recommends -y \&& apt-get clean all \&& rm -rf /var/lib/apt/lists/*
CMD
该命令和 RUN 不同,该指令只有在容器运行的时候才会执行。
指令语法
CMD ["executable","param1","param2"]
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
CMD command param1 param2
设置容器启动时要运行的命令只有在容器运行时命令是才会运行,其他情况下不运行。如果一个 Dockerfile 里面有多条 CMD 指令,那么只有文件最后一行的 CMD 指令才会生效,其他的全部没用,CMD 指令是可以在你执行 docker run 的时候覆盖的。
示例
CMD ["python", "app.py"]
CMD ["java", "-jar", "app.jar"]
EXPOSE
设置暴露的容器端口,注意是容器端口。
指令语法
EXPOSE <port> [<port>/<protocol>...]
默认协议为 TCP
示例
EXPOSE 9000
EXPOSE 9001/tcp
EXPOSE 9002/udp
EXPOSE 20000 20001
EXPOSE 20003/tcp 20004/udp
ENTRYPOINT
启动时的默认命令,此指令设置的命令不可修改。与CMD是有区别的。此命令在Dockerfile只能有一个,若有多个,则以文件最后一个出现的才生效。
指令语法
ENTRYPOINT ["executable", "param1", "param2"]
示例
ENTRYPOINT ["nginx"]
CMD ["-g","daemon off;"]
如上,如果执行 docker run -d --name nginx -P nginx 则最终容器内执行的命令是nginx -g daemon off; ,如果你执行的命令是 docker run -d --name nginx -P nginx bash 则最终容器内执行的命令是nginx bash 注意区别,细心体会。
VOLUME
设置你的卷,在启动容器的时候Docker会在/var/lib/docker的下一级目录下创建一个卷,以保存你在容器中产生的数据。若没有申明则不会创建。
指令语法
VOLUME ["/path/to/directory"]
示例
VOLUME ["/data"]
VOLUME ["/data","/app/etc"]
USER
指定容器运行的用户是谁,前提条件,用户必须存在。此指令可以在构建镜像是使用或指定容器中进程的运行用户是谁。
指令语法
USER <user>[:<group>]
USER <UID>[:<GID>]
示例
USER root
相关文章:
Docker 摸门级简易手册
Docker 摸门级简易手册 文章目录 Docker 摸门级简易手册使用 Docker 构建 Java 项目镜像Docker 安装Install on MacInstall on WindowsInstall on Linux Dockerfile 说明FROMLABELENVWORKDIRCOPYADDRUNCMDEXPOSEENTRYPOINTVOLUMEUSER 使用 Docker 构建 Java 项目镜像 假设有个…...
Java类加载机制
简介 在Java的世界里,每一个类或者接口,在经历编译器后,都会生成一个个.class文件。 类加载机制指的是将这些.class文件中的二进制数据读入到内存中,并对数据进行校验,解析和初始化。最终,每一个类都会在…...
vue 自定义指令简单记录
自定义指令例子 // src/main.js import { createApp } from vue; import App from ./App.vue;const app = createApp(App);// 全局自定义指令 app.directive(color-directive, {mounted(el, binding) {// 当指令绑定到元素上时触发// el 是绑定的元素// binding 包含了指令的信…...
算法通关村-----快速排序的原理和实现
快速排序介绍 快速排序是一种经典高效的排序方法,是分治策略在排序上的具体体现。将一个大的待排序列分割成若干个小的有序序列,最终将各个小的有序序列合并成一个大的有序序列。 快速排序的实现原理 选择一个基准值,将小于基准值的元素放…...
百度抓取香港服务器抓取超时是什么情况?
网络延迟导致抓取超时 网络延迟是指从发送请求到接收响应之间的时间延迟。如果网络延迟过高,服务器可能无法及时响应请求,导致超时。在香港服务器上抓取数据时,如果网络延迟过高,可能会出现抓取超时的情况。 服务器负载过高可能…...
Springboot上传文件
上传文件示例代码: ApiOperation("上传文件") PostMapping(value "/uploadFile", consumes MediaType.MULTIPART_FORM_DATA_VALUE) public ApiResult<String> uploadFile(RequestPart("file") MultipartFile file) { //调用七…...
kafka教程
kafka教程 Kafka是一个分布式、分区的、多副本的、多订阅者,基于zookeeper协调的分布式日志系统,其主要特点为: 以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间的访问性能高吞吐率。即使在非常…...
JVM的故事—— 内存分配策略
内存分配策略 文章目录 内存分配策略一、对象优先在Eden分配二、大对象直接进入老年代三、长期存活的对象将进入老年代四、动态对象年龄判定五、空间分配担保 一、对象优先在Eden分配 堆内存有新生代和老年代,新生代中有一个Eden区和一个Survivor区(from space或者…...
21.CSS的动态圆形进度条
效果 源码 <!doctype html> <html><head><meta charset="utf-8"><title>Animated Circular Progress | CSS Only</title><link rel="stylesheet" href="style.css"></head><body><di…...
Linux_VMware_虚拟机磁盘扩容
来源文章 :VMware教学-虚拟机扩容篇_vmware虚拟机扩容_系统免驱动的博客-CSDN博客 由于项目逐步的完善,需要搭建的中间件,软件越来越多,导致以前虚拟机配置20G的内存不够用了,又不想重新创建新的虚拟机,退…...
中欧财富:分布式数据库的应用历程和 TiDB 7.1 新特性探索
原文来源: https://tidb.net/blog/ccbaeda2 作者:张政俊, 中欧财富数据库负责人 导读 中欧财富是中欧基金控股的销售子公司,旗下 APP 实现业内基金品种全覆盖,提供基金交易、大数据选基、智慧定投、理财师咨询等…...
树莓 LUMA-OLED.EXAMPLE使用
详细介绍在文件目录下的README.rst中 第一步 $ sudo usermod -a -G i2c,spi,gpio pi //好像没什么用 $ sudo apt install python3-dev python3-pip python3-numpy libfreetype6-dev libjpeg-dev build-essential //安装依赖包,树莓派中好像已经有了 $ sudo a…...
C#,《小白学程序》第十一课:双向链表(Linked-List)其二,链表的插入与删除的方法(函数)与代码
1 文本格式 /// <summary> /// 改进的车站信息类 class /// 增加了 链表 需要的两个属性 Last Next /// </summary> public class StationAdvanced { /// <summary> /// 编号 /// </summary> public int Id { get; set; } 0; ///…...
java IDEA文件路径分层级
如下图这样 在设置里找到Compact Middle Packages,去掉勾选就行了...
Spring AOP+Redis实现接口访问限制
目录 一、需求二、实现思路三、代码实现3.1 导入依赖3.2 配置redis3.3 自定义注解3.4 定义切面类3.5 自定义异常类3.6 全局异常处理器 一、需求 在我们程序中,有时候需要对一些接口做访问控制,使程序更稳定,最常用的一种是通过ip限制&#x…...
互联网后端技术大全!
互联网后端技术大全! 一. 系统开发 高内聚/低耦合 高内聚 高内聚指一个软件模块是由相关性很强的代码组成,只负责一项任务,也就是常说的单一责任原则。模块的内聚反映模块内部联系的紧密程度。 低耦合 模块之间联系越紧密,其…...
Android SDK 上手指南||第九章 Manifest文件
第九章 Manifest文件 到目前为止,我们已经熟悉了Android项目中的各个组成部分,包括其资源。在今天的文章中,我们将以项目Manifest文件作为核心内容。 对于一个项目来说,Manifest既可以很简单、也可以很复杂,其具体情…...
CVE-2023-3450:锐捷 RG-BCR860 命令执行漏洞复现
锐捷 RG-BCR860 命令执行漏洞(CVE-2023-3450)复现 0x01 前言 本次测试仅供学习使用,如若非法他用,与本文作者无关,需自行负责!!! 0x02 漏洞描述 Ruijie Networks RG-BCR860是中国锐捷网络(R…...
【ES】elasticsearch8.3.3
这里仅实践操作并根据实际问题进行记录笔记。 运行 ES8 我们需要在自己的电脑上安装好 Docker Desktop。接着我们运行如下的命令:出现两个异常,一个是需要使用winpty因为我使用win的docker desktop,另外一个问题是docker启动elasticsearchE…...
2023年下半年广州/深圳软考(中/高级)认证报名,当然弘博创新
软考是全国计算机技术与软件专业技术资格(水平)考试(简称软考)项目,是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试,既属于国家职业资格考试,又是职称资格考试。 系统集成…...
嵌入式C语言变量初始化技术详解
## 1. 嵌入式C语言变量初始化技术详解### 1.1 初始化的重要性与基本原则在嵌入式系统开发中,变量初始化是防止未定义行为的关键步骤。由于嵌入式编译器特性的差异,未初始化的变量可能包含随机值,导致系统出现不可预测的行为。根据变量类型的不…...
MacBook Pro本地部署OpenClaw:百川2-13B量化模型7×24小时运行方案
MacBook Pro本地部署OpenClaw:百川2-13B量化模型724小时运行方案 1. 为什么选择MacBook Pro部署OpenClaw? 去年冬天,当我第一次尝试在MacBook Pro上部署量化版百川2-13B模型时,身边的朋友都觉得我疯了。"M1芯片能跑得动13B…...
AntiDupl.NET:数字资产管理师的智能图片去重解决方案
AntiDupl.NET:数字资产管理师的智能图片去重解决方案 【免费下载链接】AntiDupl A program to search similar and defect pictures on the disk 项目地址: https://gitcode.com/gh_mirrors/an/AntiDupl 在当今视觉内容爆炸的时代,无论是专业摄影…...
终极指南:如何让2007年旧Mac运行最新macOS系统
终极指南:如何让2007年旧Mac运行最新macOS系统 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 还在为那台陪伴多年的老Mac无法升级最新系统而烦恼吗࿱…...
你的加密音乐文件,是否真的属于你?
你的加密音乐文件,是否真的属于你? 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地址: https://gitc…...
UEFI安全启动恢复流程文档:详细操作指南与故障排除
UEFI安全启动恢复流程文档:详细操作指南与故障排除 【免费下载链接】edk2 EDK II 项目地址: https://gitcode.com/gh_mirrors/ed/edk2 UEFI安全启动是现代计算机系统的重要安全功能,它通过数字签名验证确保只有受信任的操作系统和引导加载程序能够…...
vLLM-v0.17.1在专利分析系统中的应用:权利要求生成与比对
vLLM-v0.17.1在专利分析系统中的应用:权利要求生成与比对 1. 技术背景与需求分析 专利分析是知识产权领域的重要工作,其中权利要求书的生成与比对是核心环节。传统方法依赖人工撰写和比对,效率低下且一致性难以保证。随着大语言模型技术的发…...
Gemma-3 Pixel Studio镜像免配置:开箱即用的12B多模态推理工作站
Gemma-3 Pixel Studio镜像免配置:开箱即用的12B多模态推理工作站 1. 产品概览 Gemma-3 Pixel Studio是基于Google最新开源Gemma-3-12b-it模型构建的高性能多模态对话终端。这个预配置的Docker镜像消除了复杂的部署流程,让用户能够立即体验12B参数大模型…...
三步解锁QQ空间历史说说备份:数据留存与管理实用指南
三步解锁QQ空间历史说说备份:数据留存与管理实用指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory QQ空间数据备份是许多用户保存青春记忆和重要记录的需求。GetQzonehist…...
[特殊字符] 怕你停电的姐姐:UPS 还分 “直流” 和 “交流”? 今天一篇给你盘个透!
哈喽,我的老铁们!我是你们那个 “怕你停电” 的姐姐,也是专门卖 UPS 电源的姐姐!平时总有朋友问我:“姐姐,我看 UPS 有好多种,什么直流交流的,到底有啥区别?我该咋选&…...
