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年下半年广州/深圳软考(中/高级)认证报名,当然弘博创新
软考是全国计算机技术与软件专业技术资格(水平)考试(简称软考)项目,是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试,既属于国家职业资格考试,又是职称资格考试。 系统集成…...
【免费下载】 MySQL Connector/Java 8.0.29 驱动包
MySQL Connector/Java 8.0.29 驱动包 【下载地址】MySQLConnectorJava8.0.29驱动包 本仓库提供了一个用于Java应用程序连接MySQL数据库的JDBC驱动包。具体文件为 mysql-connector-java-8.0.29.jar,适用于MySQL数据库版本8.0.29。 项目地址: https://gitcode.com/o…...
量子安全与后量子密码学:awesome-quantum-software中的加密工具
量子安全与后量子密码学:awesome-quantum-software中的加密工具 【免费下载链接】awesome-quantum-software Curated list of open-source quantum software projects. 项目地址: https://gitcode.com/gh_mirrors/aw/awesome-quantum-software 在后量子计算时…...
仅限专业影像团队内部流通的Perplexity摄影搜索矩阵(含ISO/快门/色温等8维结构化Prompt库)
更多请点击: https://codechina.net 第一章:Perplexity摄影技巧搜索的底层逻辑与架构设计 Perplexity 并非专为摄影设计的工具,但其搜索系统在处理“摄影技巧”类长尾、意图模糊、多模态关联的问题时,展现出独特的推理架构特征。…...
二维码识读设备选购全攻略:从核心需求到实战测试
1. 项目概述:为什么选对二维码识读设备这么重要?你可能觉得,不就是扫个码吗?手机摄像头都能搞定,专门的设备能有多大区别?我刚开始接触这个领域时也是这么想的,直到自己踩过几次坑,才…...
K8s安全加固实战:认证、授权、网络策略三维度解读
前言 Kubernetes已成为企业云原生基础设施的标准,但默认配置下的K8s集群存在诸多安全隐患。攻击者利用配置缺陷入侵集群后,可横向扩展到整个基础设施。本文从认证(Authentication)、授权(Authorization)、*…...
NewJob浏览器插件终极指南:3步解决求职信息过时难题
NewJob浏览器插件终极指南:3步解决求职信息过时难题 【免费下载链接】NewJob 一眼看出该职位最后修改时间,绿色为2周之内,暗橙色为1.5个月之内,红色为1.5个月以上 项目地址: https://gitcode.com/GitHub_Trending/ne/NewJob …...
2025最权威的十大AI科研工具推荐
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 学术研讨范畴正在历经深度的变动,人工智能论文工具现身,极大地提高了…...
从“消融”到“流动岩浆”:用Unity Shader的Tilling和Offset玩转动态纹理(URP/HDRP通用)
从“消融”到“流动岩浆”:用Unity Shader的Tilling和Offset玩转动态纹理(URP/HDRP通用) 想象一下:你的游戏场景中,炽热的岩浆在地表缓缓流动,水面泛起涟漪般的波纹,或是能量屏障表面流淌着神秘…...
如何用HTML5视频加速控制器提升学习效率:3步掌握时间管理新维度
如何用HTML5视频加速控制器提升学习效率:3步掌握时间管理新维度 【免费下载链接】videospeed HTML5 video speed controller (for Google Chrome) 项目地址: https://gitcode.com/gh_mirrors/vi/videospeed 在信息过载的数字时代,视频内容占据了网…...
QT中使用MFC的示例工程
QT中使用MFC的示例工程 【下载地址】QT中使用MFC的示例工程 本仓库提供了一个在QT中使用MFC的示例工程,展示了如何在QT项目中引入MFC库,并使用MFC中的CString类和MessageBox方法。该示例工程适用于QT4和VS2013,但同样适用于QT3、QT4、QT5以及…...
