运行一个jar包

传送门

SpringMVC的源码解析(精品)
Spring6的源码解析(精品)
SpringBoot3框架(精品)
MyBatis框架(精品)
MyBatis-Plus
SpringDataJPA
SpringCloudNetflix
SpringCloudAlibaba(精品)
Shiro
SpringSecurity
java的LOG日志框架
Activiti(敬请期待)
JDK8新特性
JDK9新特性
JDK10新特性
JDK11新特性
JDK12新特性
JDK13新特性
JDK14新特性
JDK15新特性
JDK16新特性
JDK17新特性
JDK18新特性
JDK19新特性
JDK20新特性
JDK21新特性
其他技术文章传送门入口

前言

运行一个jar包很简单,本质最常见的就是 java -jar xxx.jar ,不过根据环境不同,有些细微不同,接下来就主要讲解Window环境、Linux环境、docker环境下的运行一个jar包。

下面文章不定期更新中。。。

Linux安装JDK17(精品)
Linux安装MySQL(精品)
Linux安装Nginx(精品)
Linux安装Maven(精品)
运行一个jar包(精品)
java -jar提示jar中没有主清单属性(no main manifest attribute)(精品)

Jenkins安装启动(JDK8/11/17)(精品)
Jenkins配置(插件/角色/凭证)(精品)
Jenkins的jdk和maven配置(精品)
Jenkins三种构建类型(精品)

一、Window环境

这种是基础知识了,首先电脑肯定得安装了jdk版本,作者这边是jdk17,jdk8等其他版本差不多。
在这里插入图片描述
Maven插件这边clean、pakage之后在左侧target目录下会有对应打包好的jar包。
在这里插入图片描述
鼠标右键可以直接打开电脑目录
在这里插入图片描述
在这里插入图片描述
进入cmd命令框
在这里插入图片描述
java -jar feBackEnd.jar
在这里插入图片描述
启动完成,我这边端口是83,浏览器访问http://localhost:83,搞定!!!
在这里插入图片描述
不过,这个只要ctrl+c或者关闭这个cmd框,程序就终止了,不是长久运行的,也就是不是后台运行的。

后台运行命令:javaw java -jar feBackEnd.jar &

这样ctrl+c以后,程序还在运行,没有终止,可以在当前cmd框干其他事情,不过这个cmd框肯定是不能关闭了。

如果想再多看一下springboot的一些输出日志文件等

带日志后台运行命令:javaw jar -jar feBackEnd.jar > fe.txt &
在这里插入图片描述

多个日志文件fe.txt文件。

二、Linux环境

1、第一步:环境配置好,安装好jdk

基础操作,linux服务器下面提前按照好jdk17,可以看作者之前写的文章 安装jdk17
一般我是在/usr/local下面放置我的jdk
在这里插入图片描述
jdk的环境变量该设置的都设置好。

2、第二步:打包jar包并上传到Linux服务器

作者这边用的xftp+xshell的组合软件,直接可以互相点击,非常方便
在这里插入图片描述
点击开xftp软件

在这里插入图片描述
这个是我放置jdk的目录

在这里插入图片描述
我个人非常喜欢创建一个java文件夹,然后把我在Linux服务器能控制的项目jar包,配置文件等都丢到这里面,以后很好找,维护方便。
在这里插入图片描述

这里把刚刚打包好的jar包拖进去就可以了(打包方式和window那边Maven打包一样),上传后就可以运行jar包了。

3、第三步:运行jar包

# 当前窗口运行jar包,还是ctrl+c以后程序就终止运行了
java -jar feBackEnd.jar
# 后台运行jar包,最佳实战,日志默认会到nohup.out文件中
nohup java -jar feBackEnd.jar &
# 带日志后台运行jar包,日志不到nohup.out文件中了改到指定的fe.txt里面了
nohup java -jar  feBackEnd.jar >fe.txt  &
# 实时查看日志命令
tail -n 100 -f fe.txt 
# 实时查看java进程,比如查出feBackEnd对应进程为12345
ps -ef | grep  java
# 停止jar包,后面为对应进程数
kill -9  12345

通常选择后台运行jar包,最佳实战。启动完成,我这边端口是83,浏览器访问http://Linux主机ip:83,搞定!!!

记得Linux系统安全组放行83端口。

三、docker环境

我这边依据Linux环境下,安装docker和docker compose,有两种方式运行jar包。我们常见的单体服务基本都是用Dockerfile的方式,如果有很多微服务和中间件使用,比如redis、kafka、MySQL等等,可以用docker compose一次编排成功,一次性启动所有中间件。当然现在企业级项目,不是特别庞大,每次更新jar包全都去启动也不是太好,compose很灵活,可以只弄一个jar包,也可以都弄来,具体看情况。个人推荐两种方式都会。

1、Linux下安装docker和docker compose

sudo yum install -y yum-utils

sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

sudo systemctl enable docker --now

# 一直输入y就可以了

#测试工作,不行的话就 再执行一下  sudo systemctl enable docker --now,是开机启动docker的意思
docker ps
#  批量安装所有软件,docker-buildx-plugin docker-compose-plugin能够批量安装的软件
docker compose

2、Dockerfile方式一运行jar包

在这里插入图片描述
大前提,保持jar包和Dockerfile文件或者docker-compose.yml文件都在同一个目录下面,保持文件命名一致,jar包名字可以跟着随便改。两个文件则最好固定命名。

2.1、编写最简单Dockerfile文件

先编写一个最少的Dockerfile文件,后面文章我会具体解释Dockerfile的编写语法,这里只弄最最简单的,也就是每个关键字(保留字)必须有,不能再少了的,你会发现至少得有3行。

vim Dockerfile

Dockerfile内容如下,注意必须首字母D大写,其余字母小写:

# 使用官方 OpenJDK 17 基础镜像;如果你是jdk8就把17改成8,这个FROM关键字必须有,而且必须是第一行,基于这个存在的 OpenJDK 17镜像来构建新的镜像。
FROM openjdk:17
# 复制本地jar包到容器中的/目录下;这行也必须有,发版jar包,得从宿主机拷贝jar包到你隔离的docker容器中,宿主机和docker容器是隔离环境,你可以认为是两个Linux系统(本质还是共享Linux内核的,还是一个系统,但是文件系统确实是两套了),docker容器是一套新的Linux系统,默认工作目录就是/。其实docker容器也是工作在你宿主机上面的,只是隔离一块单独的空间,通过 find /  -name feBackEnd.jar  命令,就可以找到COPY命令后,jar包在docker容器真正位置,例如 笔者是 /var/lib/docker/overlay2/userj3va1na7xo52f6jiraqqo/diff/feBackEnd.jar
COPY feBackEnd.jar  /
# 容器启动时执行的命令;docker容器本质是个Linux的迷你系统,其实看CMD就可以看出是  java -jar  xx.jar的样子,不过最后一个参数/feBackEnd.jar  指明了是在目录/下面的 feBackEnd.jar这个jar包,这个/目录也是由于上一条COPY拷贝到了/目录,所以这里/目录下才有jar包,这CMD里面第三个参数如果写成feBackEnd.jar是不行的,必须带上路径/。写成/java/feBackEnd.jar也是不行的,因为是docker容器里面找jar包执行,不是宿主机里面去找jar包执行的,而COPY命令只是拷贝jar包到了容器里面的/目录下,就只能写成/feBackEnd.jar"。
CMD ["java", "-jar", "/feBackEnd.jar"]

2.2、构建镜像

# .是表示当前操作命令的时候,必须在Dockerfile所在的目录进行操作, .表示当前相对路径, ..表示前一级目录
docker build -t fe_backend .
# 或者  -》  /java是宿主机存放Dockerfile的绝对物理路径,可以在其他目录操作该命令(推荐)
docker build -t fe_backend /java 
# 或者 -》 带上版本号,-t参数主要是给镜像打标签的
docker build -t fe_backend:3.3 /java 
# 如果Dockerfile文件没有严格命名,比如命名成了 xx1,可以通过-f参数指定具体文件
docker build  -f xx1 -t fe_backend:3.3 /java 

就一句命令,build后面必须至少包含一个参数,我这边用了-t,就是给生成的镜像打标签,镜像名称叫 fe_backend,只是我这边没有给打标签,只给了镜像名称,这里不支持驼峰,准确的说不支持大写字母。最后一个.表示Dockerfile所在的目录。也可以用/java,笔者这边宿主机是/java中放的Dockerfile。

2.3、运行镜像(也就是运行了jar包)

# 当前窗口运行jar包,还是ctrl+c以后程序就终止运行了
docker run -it -p 83:83 fe_backend
# 后台运行jar包,最佳实战,run进去容器,exit退出,容器停止  ctrl+p+q  退出容器不停止
docker run -d -p 83:83 fe_backend
# 后台运行jar包,镜像带了版本号的(最佳实战)
docker run -d -p 83:83 fe_backend:3.3
# 查看正在运行的镜像实例(容器实例),一查到fe_backend对应的容器id(docker ps),比如68bedbb27caf
docker ps
# 实时查看日志命令
docker logs --tail 10 -f 68bedbb27caf
# 查看镜像
docker images
# 查看正在运行加上历史运行过的容器实例
docker ps -a
# 停止docker容器实例,docker stop 容器id或者容器名称,例如上面查到fe_backend对应的容器id为68bedbb27caf
docker stop 68bedbb27caf
# 强制停止docker容器实例,docker kill容器id或者容器名称
docker kill 68bedbb27caf
# 也可以通过Linux原始方式去kill结束。实时查看java进程,比如查出feBackEnd对应进程为12345
ps -ef | grep  java
# 停止jar包,后面为对应进程数
kill -9  12345

通常选择后台运行jar包,最佳实战。启动完成,我这边端口是83,浏览器访问http://Linux主机ip:83,搞定!!!

记得Linux系统安全组放行83端口,而且docker run名称一定得用-p参数指定端口映射,:前面是宿主机端口,是需要安全组放行的端口,:后面是容器端口。两个端口映射可以不一样,按照自己需求来。

3、docker-compose.yml方式二运行jar包

3.1、编写最简单的docker-compose.yml文件

先编写一个最少的docker-compose.yml文件,后面文章我会具体解释docker-compose.yml的编写语法,这里只弄最最简单的,也就是每个关键字(保留字)必须有,不能再少了的,你会发现至少得有9行。

#  version版本号:指定 Docker Compose 文件的版本,如 version: '3',为什么是3,表示最新版本。后面文章详细提一下。
version: '3'
# services服务定义:在 services 部分定义要运行的各个服务,每个服务包含服务名及其配置信息。
services:
 # 一定要小心yml语法的缩进,多个空格,少个空格直接意思不一样。yml语法和java的application.yml语法一样。feBackEndService可以随便定义名字,叫aaa也可以,就是上面services这个复数多个service中的一个service,有点微服务的意思,这里具体指服务id,或者叫服务名称也行。
  feBackEndService:
    # 注意yml缩进,image表示镜像,这边和Dockerfile文件里面的FROM类似,是基于什么镜像来形成新镜像。jar包基于jdk17镜像。
    image: openjdk:17
    # volumes是容器数据卷的关键字,这边表示将宿主机/java/feBackEnd.jar的jar包  拷贝到目录为/的docker容器中。类似Dockerfile文件里面的COPY。
    # 凡是看到:,基本前面都是宿主机,后面是docker容器。比如数据卷,比如端口映射。
    volumes:
     # 注意yml缩进,有- 开头的,表示多个值,下面还可以再来一行-,是yml语法。可以一次性将多个jar包拷贝到docker容器中的目的目录。
      - /java/feBackEnd.jar:/feBackEnd.jar
     #  注意yml缩进,ports是对齐volumes的。表示端口映射,前面是宿主机端口,后面是docker容器端口。
	ports:
	  # 注意yml缩进,有-开头,没错,这里也可以多个值,映射多组接口。坑:注意有英文双引号,要加上双引号
	  - "81:81"
	 # 注意yml缩进, command是和ports对齐的。这边和Dockerfile文件里面的CMD类似。
    command: java -jar /feBackEnd.jar
    # 总结:有读者可能已经发现了。基于Dockerfile文件方式,主要是docker build,然后docker  run,而基于docker-compose.yml文件方式,其实把两种整合到一块了,命令也合并为一句docker compose up了。由于services关键字下面可以有多个服务,所以什么redis、mysql都能加入进来。一句命令全能给启动了。并且能通过关键字加入依赖关系,比如jar包启动之前,先启动数据库等。总之,docker-compose.yml文件方式非常强大和灵活。

纯净版

version: '3'
services:
  feBackEndService:
    image: openjdk:17
    volumes:
      - /java/feBackEnd.jar:/feBackEnd.jar
	ports:
	  - "81:81"
    command: java -jar /feBackEnd.jar

3.2、构建并启动应用

# 当前窗口启动所有docker-compose服务,还是ctrl+c以后程序就终止运行了
docker compose up
# 后台运行所有docker-compose服务,最佳实战
docker compose up -d
# 如果docker-compose.yml文件没有严格命名,比如命名成了 xxx1.yml,可以通过-f参数指定具体yml文件
docker compose -f xxx1.yml up -d
# 查看正在运行的docker-compose服务中的所有容器实例的一些信息,-a可以查看正在运行和历史运行过的
docker compose ps -a
# 查看服务运行的日志,feBackEndService就是文件里面命名的服务id或者服务名称
docker compose logs feBackEndService
# 实时查看日志命令(最佳实战)
docker compose  logs --tail 10 -f feBackEndService
# 停止所有docker-compose服务,但是不删除他们,down则会移除整个应用程序的容器、网络、卷等资源。
docker compose stop
# 强制所有docker-compose服务,但是不删除他们,docker compose kill 容器id或者容器名称
docker kill feBackEndService
# 也可以通过Linux原始方式去kill结束。实时查看java进程,比如查出feBackEnd对应进程为12345
ps -ef | grep  java
# 停止jar包,后面为对应进程数
kill -9  12345

我这边端口是81,浏览器访问http://Linux主机ip:81,搞定!!!

四、docker相关知识扩展(精简)

1、docker和虚拟机区别

宿主机:就是本地电脑,我的电脑,不管是你window电脑,或者Linux你远程登录那台机器,就是宿主机。宿主,就是被别人寄生的。比如宿主机安装了docker,感觉被docker寄生一样,叫了个宿主机。

跳板机:很多个Linux主机的时候,需要统一管理,因为安全和管理原因,只开放其中一台主机,这台主机给与运维或者开发人员账号密码,运维等人员登录进去的Linux主机不是直接宿主机,而是一个公共的主机,俗称跳板机,然后通过跳板机再远程链接到目的主机,可以用命令telnet连过去,也可以ssh连过去,有管理软件的,也可以通过软件连过去,二次链接过去的,才是真正的宿主机,通常在宿主机才去真正的安装redis等中间件,放置微服务等等。

虚拟机:就是一个普通文件,在宿主机上不需要了就删掉,对宿主机毫无影响。宿主机运行这个虚拟机文件以后,这个虚拟机就能全部复制一套宿主机的操作系统(当然也可以装其他操作系统),并且占用宿主机的一部分硬盘和内存,可以说虚拟机是基于硬件底层,完完全全一个新电脑,不过共享了原电脑的cpu、硬盘、内存、usb接口等等硬件,软件层面的操作系统、网络ip地址都是自己全新的。
虚拟机就是可以当做正儿八经的一台新电脑,有自己的ip地址,可以和宿主机友好通信等等。

Docker容器:基于操作系统层面上实现虚拟化,自己复用宿主机的操作系统,容器自己没有内核,并且也没有进行硬件虚拟,而虚拟机不止要虚拟出一套硬件还要运行一个完整的操作系统。容器只包含应用程序及其依赖,因此占用的资源更少,密度更高。

在这里插入图片描述

2、docker三大核心概念

镜像 Image、容器 Container、仓库 Repository

用java的例子说明:

People p1 = new People;
People p2 = new People;

People这种类模版就是镜像,镜像就是个模板;
p1、p2这种就是容器,就是实例对象,具体的镜像运行实例;
仓库就是个放镜像的地方,官方提供的叫Docker Hub。

docker体系中,镜像是分层文件,整个镜像有多层级的文件组成,这些文件本身就可以当一个镜像。要运行jar包,就得把jar包在已经有的镜像上面加一层新的内容柔和进入,形成了新镜像,这也是为什么Dockerfile编写的时候,是基于jdk17镜像,再写了一大堆执行,增加一些东西,形成新的镜像fe_backend,最后运行这个新生成的镜像,才有了实例,有了实例网站访问才正常。

用java的例子说明:
People就是我们的fe_backend镜像,People是默认继承Object类的,这个Object类就是类比与jdk17的基础镜像,将来想强化一个新的镜像,还可以让这个类继承Object类,也可以去继承People类,总之,新镜像一定是在老镜像基础上做了修改处理的,非常类似java的继承。

容器就是p1、p2这种实例,所以一个镜像对应的容器可以有非常多个。镜像一旦生成, 就不会再变,只能删除掉是无法修改的,后面同样docker build以后出来的新镜像,和前面镜像不是同一个。各是各的。

3、Dockerfile的简单语法

总共18个关键字。常用的其实不多,大概过一下熟悉一下概念,不是太难。

FROM(必须):第一条必须是from,而且必须指定一个已经存在的镜像作为模板,基于这个镜像;例如:FORM openjdk:8   或者  FORM openjdk:17
MAINTAINER(弃用):镜像维护者的姓名和邮箱,推荐使用LABEL代替;例如:MAINTAINER fe  或者  MAINTAINER zangtie
LABEL: 为镜像添加元数据。
RUN:docker build时执行的命令,有shell格式(CMD 命令)和exec格式(CMD [可执行文件,参数1,参数2...]);例如:RUN mkdir /usr/local/java  或者 RUN yum -y install net-tools
EXPOSE:当前容器对外暴露出的端口;例如:EXPOSE 81 或者  EXPOSE 8080
WORKDIR:创建容器后,终端默认登录进来的工作目录,默认/,后续COPY等命令默认复制到该目录,该工作目录与宿主机文件系统是隔离的,如果需要和宿主机打通,可以用数据卷或者绑定挂载;例如:WORKDIR /java 或者 WORKDIR /app
USER:指定该镜像以什么样的用户去执行,如果都不指定,默认是root,一般不用这个;例如: USER root  或者 USER zangtie
ENV;用来在构建镜像过程中设置环境变量,有点类比window中的环境变量,比如设置一个JAVA_HOME,在后续的RUN指令中可以使用;例如 ENV JAVA_HOME /usr/local/openjdk-8  或者 ENV JAVA_HOME /usr/local/openjdk-17
VOLUME:设置容器数据卷,比如VOLUME /tmp 指定临时文件目录为/tmp,在宿主机/var/lib/docker目录下创建了一个临时文件并连接到容器的/tmp;例如:VOLUME /tmp
COPY:将宿主机Dockerfile同目录的文件或者文件拷贝到镜像,只是简单复制,语法 COPY [原路径1,原路径2,目标路径];例如:COPY feBackEnd.jar /java  或者 COPY feBackEnd.jar xx.jar  将jar包重命名为xx并且拷贝到默认的工作目录下面,WORKDIR不指定就是容器中的/,并且和Linux的路径没有关系是隔离的。
ADD:将宿主机Dockerfile同目录的文件或者文件拷贝到镜像并且会自动处理URL(从url下载并复制到镜像)和解压tar压缩包,语法同COPY;
CMD:指定容器启动后docker run时执行的命令,也有shell格式(CMD 命令)和exec格式(CMD [可执行文件,参数1,参数2...]),Dockerfile中可以有多个CMD命令,只有最后一个生效,而且容易被docker run命令里面的参数命令覆盖;例如:CMD mkdir /usr/local/java 或者 CMD ["java", "-jar", "feBackEnd.jar"]
ENTRYPOINT:类似于CMD,但是不会被docker run后面的命令覆盖,可以和CMD结合使用;例如:ENTRYPOINT ["echo", "Hello"]  或者 ENTRYPOINT ["echo", "Hello"] 换行 CMD ["World"] 或者  ENTRYPOINT ["java", "-jar", "feBackEnd.jar"]
ARG: 定义构建镜像时的变量。
ONBUILD: 为镜像设置触发器,当作为基础镜像时执行。
STOPSIGNAL: 设置停止容器时发送的系统调用信号。
HEALTHCHECK: 告诉Docker如何测试容器是否还在正常运行。
SHELL: 设置执行命令时使用的默认shell。

4、docker build命令

docker build命令是Docker中用于创建Docker镜像的一个重要命令。通过这个命令,你可以将应用或服务打包成一个Docker镜像,然后运行在任何支持Docker的环境中。下面我会逐步深入地解释docker build命令的使用方法、参数以及一些最佳实践。

基本用法

docker build命令的基本用法是:

docker build [OPTIONS] PATH | URL | -
  • PATH指定了Dockerfile所在的目录。Docker会在这个目录下寻找名为"Dockerfile"的文件(除非使用了-f, --file选项指定了不同的文件名),并根据该文件中的指令构建镜像。
  • URL用于指定一个Git仓库的地址,Docker会克隆这个仓库并使用仓库中的Dockerfile进行构建。
  • -表示从标准输入中读取Dockerfile的内容进行构建,通常与管道命令一起使用。 常用选项

[OPTIONS]

  • -t, --tag:给镜像打标签,格式为name:tag。例如,docker build -t myimage:v1 .会创建一个标签为myimage:v1的镜像。
  • –build-arg:设置构建时的变量。例如,docker build --build-arg VERSION=1.2.3 .可以在Dockerfile中通过ARG指令接收VERSION变量。
  • -f, --file:指定要使用的Dockerfile路径。如果你的Dockerfile不在默认位置或不叫"Dockerfile",你需要用这个选项指定它的位置。
  • –no-cache:构建镜像时不使用缓存。这可以确保你每次都获取最新版本的基础镜像和依赖。

Dockerfile

docker build命令的核心是Dockerfile。Dockerfile是一个文本文件,包含了一系列的指令和参数,用于定义如何构建镜像。常见的Dockerfile指令包括:

FROM:指定基础镜像。
RUN:执行命令。
COPY和ADD:将文件从构建上下文复制到镜像中。
CMD:提供容器默认执行的命令。
EXPOSE:声明容器监听的端口。
ENV:设置环境变量。

最佳实践

  • 最小化镜像层数:尽量将相关的命令合并到一条RUN指令中,减少镜像层的数量,以减小镜像大小。

  • 多阶段构建:使用多阶段构建可以减小最终镜像的大小,只保留构建结果和必需的依赖。

  • 使用.dockerignore文件:类似于.gitignore,.dockerignore可以让你指定不应该复制到镜像中的文件和目录,以加快构建速度和减少镜像大小。

  • 避免安装不必要的包:只安装你的应用真正需要的依赖,以减小镜像大小。

  • 使用官方基础镜像:尽可能使用官方提供的基础镜像,因为它们通常更优化且安全。 通过理解和应用上述信息,你可以有效地使用docker

  • build命令来创建和管理Docker镜像,为你的应用或服务提供灵活、高效的部署方案。

实际开发中,你可以多次docker build,可以通过查看镜像、删除一些不用的镜像

# 查看镜像
docker images
# 直接删除镜像(rmi后面是镜像id,是IMAGE ID),直接删除可能提示这个镜像对应的一些容器正在运行,不能删除
docker rmi  ea7d66546286
# 查看正在运行加上历史运行过的容器实例
docker ps -a  
# 直接删除容器(rm后面是容器id,是CONTAINER ID),上面不能直接删除镜像,就先把镜像对应的容器实例删除了,再回去删镜像就可以了,可以空格隔开,直接删除多个
docker rm  68bedbb27caf
### 注意,慎用,坑,巨坑,物理删除,无法恢复,慎用
# 删除全部镜像(巨坑,最好不要用,自己服务器还可以玩下,公司服务器小心坐牢)
docker rmi -f $(docker images -qa)
# 删除全部容器(同上),-a表示查询历史的,-q表示强制删除,-q  -a 分别用,合起来-qa也可以。没有实例会提示其他信息。
docker rm -f $(docker ps -qa)

5、docker run命令

docker run命令是Docker中最常用也是最重要的命令之一,它用于创建一个新的容器实例并运行一个命令。这个命令的基本结构如下:

基本用法

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
  • IMAGE:指定要运行的镜像。
  • [COMMAND]:可选,替换容器默认的启动命令。
  • [ARG…]:可选,为COMMAND提供参数。

[OPTIONS]

  • -d, --detach:后台运行容器,并打印容器ID。
  • –name:为容器指定一个名称。
  • -p, --publish:发布容器的端口到宿主机上。格式为<宿主机端口>:<容器端口>。
  • -v, --volume:挂载卷。格式为<宿主机目录>:<容器目录>。
  • –rm:容器退出时自动清理容器文件系统。
  • -e, --env:设置环境变量。
  • –network:连接到指定的网络。
  • -it:同时使用-i和-t选项,通常用于交互式进程,如shell。

示例
以交互模式运行Ubuntu容器:

docker run -it ubuntu /bin/bash

这会启动一个Ubuntu容器,并给你一个bash会话。

后台运行Nginx并将端口映射到宿主机:

docker run -d -p 8080:80 --name mynginx nginx

这会以后台模式启动一个名为mynginx的Nginx容器,并将容器的80端口映射到宿主机的8080端口。

使用环境变量运行容器:

docker run -d --name myapp -e MY_ENV_VAR=myvalue myimage

这会设置环境变量MY_ENV_VAR为myvalue,并在容器中使用。

挂载卷到容器:

docker run -d --name myapp -v /my/host/directory:/my/container/directory myimage

这会将宿主机的/my/host/directory目录挂载到容器的/my/container/directory目录。

注意事项

  • 使用-d选项运行容器时,容器会在后台运行。可以通过docker ps查看正在运行的容器,通过docker logs查看容器的日志输出。
  • 如果不指定[COMMAND],容器会运行其镜像中定义的默认命令。
  • 使用-p或–publish选项时,如果宿主机端口已被占用,Docker会报错。可以只指定容器端口(如-p
    80),Docker将自动为宿主机选择一个未使用的端口。
  • 在生产环境中使用Docker时,考虑使用版本标签指定的镜像,而不是默认的latest标签,以确保环境的一致性和可预测性。

docker run命令是Docker操作的核心,掌握其使用方法对于有效地使用Docker至关重要。

6、docker logs命令

docker logs命令用于获取Docker容器的日志输出。这个命令非常有用,因为它可以帮助你理解正在运行或已停止的容器中发生了什么。当你运行的容器不按预期工作时,查看日志通常是排查问题的第一步。

基本用法
基本的docker logs命令格式如下:

docker logs [OPTIONS] CONTAINER
  • CONTAINER可以是容器的ID或名称。
  • [OPTIONS]是可选的参数,用于修改命令的输出。

[OPTIONS]

  • -f 或 --follow:跟踪日志输出。使用此选项后,命令不会立即返回到终端,而是持续输出新的日志条目,直到你中断它(例如,通过按Ctrl + C)。
  • –since:显示自某个时间点以来的日志。你可以指定相对时间(如42m表示42分钟前)或绝对时间(如2023-01-28T15:04:05)。
  • –until:与–since相反,这个选项用于显示直到某个时间点的日志。
  • -t 或 --timestamps:在每条日志前添加时间戳。
  • –tail:只显示最后N条日志。例如,–tail 50将只显示最后50条日志条目。

示例
获取容器的日志:

docker logs my-container

跟踪容器的日志输出:

docker logs -f my-container

获取过去30分钟内的日志:

docker logs --since 30m my-container

只显示最新的10条日志条目:

docker logs --tail 10 my-container

注意事项

  • docker
    logs命令仅适用于使用json-file或journald日志驱动的容器。这是Docker的默认配置,但如果你更改了日志驱动(通过Docker的–log-driver选项),则可能无法使用docker logs命令获取日志。
  • 对于生产环境,考虑使用集中式日志管理解决方案,以便更有效地存储、搜索和监控大量容器的日志。

通过docker logs命令,你可以快速访问容器的标准输出(STDOUT)和标准错误输出(STDERR),这对于调试和监控容器应用至关重要。

6、docker的容器数据卷

简单一句话,类似redis的rdb或者aof文件。docker容器产生的数据不备份,容器一删除,数据也没了,卷可以在容器之间共享数据,卷中的更改实时生效。

docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名

就是run命令的时候可以指定,也可以在Dockerfile通过VOLUME来指定。–privileged=true这个参数最好带上,是授权的。

有了-v参数以后,可以在宿主机绝对路径目录里面看到一些东西,而且改了,容器里面实时同步修改。数据卷可以被多个容器同时挂载,这使得不同容器之间可以方便地共享数据。此外,卷的内容可以在容器之间重用,例如,可以在一个容器中更新数据,然后在另一个容器中访问更新后的数据。

删除容器时,默认不会自动删除挂载的数据卷。需要手动管理和清理不再使用的数据卷,以释放存储空间。

像redis、MySQL等用docker镜像运行的时候,强烈建议指定容器数据卷,不然到时候容器实例一删除,数据都没了。

7、docker-compose.yml的简单语法

Docker Compose 使用 YAML(YAML Ain’t Markup Language)语法来定义 docker-compose.yml 文件,通过该文件可以配置 Docker 应用程序的服务、网络、卷等信息。以下是 docker-compose.yml 文件的详细语法说明:

7.1. 版本号

version: '3'
  • 指定 Docker Compose 文件的版本,目前常用的版本包括 '1', '2', '2.1', '3' 等。
  • Docker Compose 文件的版本号是用来指定 Docker Compose 文件格式和支持的特性。目前最新的版本是 3.x,而且大多数情况下,我们可以使用版本 3 来定义我们的 Docker Compose 文件。
  • 版本 3 的特性包括了对于服务扩展性的增强、更多网络选项、配置对象等。通过使用版本 3,我们可以利用较新的 Docker 引擎功能,例如 overlay 网络、秘密管理和配置管理等。
  • 版本 3 中还引入了一些特性,如 services、networks、volumes 等顶层关键字,以及服务健康检查、调整策略等新的服务配置选项。此外,版本 3 还支持使用较新的 Docker 引擎功能,并提供更好的可移植性和兼容性。
  • 因此,版本 3 成为默认版本主要是因为它提供了更多功能和更好的灵活性,同时也是 Docker
    官方推荐的版本。当然,在某些情况下,你可能需要根据特定的需求选择其他版本,但在大多数情况下,版本 3 是一个很好的选择。

7.2. 服务定义

services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
  • services 部分定义各个服务,每个服务包含服务名称及其配置信息。

7.3. 服务配置

services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
    environment:
      - ENV_VAR=value
    volumes:
      - /path/on/host:/path/in/container
    depends_on:
      - db
  • 每个服务的配置包括镜像、端口映射、环境变量、卷挂载、依赖关系等。

7.4. 网络配置

networks:
  my_network:
    driver: bridge
  • 可定义网络相关配置,如自定义网络、连接到现有网络等。

7.5. 数据卷配置

volumes:
  my_volume:
  • 定义数据卷以持久化数据。

7.6. 其他配置

other_config:
  ...
  • 还可以包括其他配置项,如 volumes, networks, secrets, configs 等。

请注意,YAML 是大小写敏感的,缩进格式必须严格遵循。以上是 docker-compose.yml 文件的基本语法结构和常见配置选项,你可以根据具体需求自定义更多配置内容。

8、docker compose相关命令

类比Dockerfile文件那边的命令,会发现很相似。

Docker Compose 是用于定义和运行多容器 Docker 应用程序的工具,它使用一个单独的 docker-compose.yml 文件来配置应用程序的服务、网络和卷等信息。以下是一些常用的 Docker Compose 命令:

  1. docker-compose up: 构建并启动整个应用程序。

    • 示例:docker-compose up
  2. docker-compose down: 停止并移除整个应用程序的容器、网络、卷等资源。

    • 示例:docker-compose down
  3. docker-compose build: 构建或重新构建服务。

    • 示例:docker-compose build
  4. docker-compose start: 启动已经创建但停止的服务容器。

    • 示例:docker-compose start
  5. docker-compose stop: 停止正在运行的服务容器,但不删除它们。

    • 示例:docker-compose stop
  6. docker-compose restart: 重启服务容器。

    • 示例:docker-compose restart
  7. docker-compose logs: 查看服务容器的日志输出。

    • 示例:docker-compose logs
  8. docker-compose ps: 列出所有服务容器的状态。

    • 示例:docker-compose ps
  • 26
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 要运行一个jar包,可以使用以下命令: ``` java -jar yourJarFile.jar ``` 其中,`yourJarFile.jar`是你要运行jar包文件名。确保在运行命令时,你已经切换到了包含jar文件的目录下。另外,你需要已经安装了Java运行环境。 ### 回答2: 在cmd中运行jar包,首先需要确定Java的环境变量配置是否正确。可以通过在cmd中输入“java -version”来确认是否找到了Java的安装路径。 假设我们要运行一个名为test.jarjar包,在cmd中输入以下命令: ``` java -jar test.jar ``` 其中,“java”是Java的命令,"-jar"表示要运行一个jar包,"test.jar"是要运行jar包文件名。 如果需要指定jar包的路径,可以在上述命令中加上jar包所在的路径: ``` java -jar C:\path\to\test.jar ``` 在运行jar包时,还可以传递参数给jar包的主类。假设主类的名称为“Main”,并且需要传递两个参数"param1"和"param2",命令如下: ``` java -jar test.jar param1 param2 ``` 运行jar包时,可以使用绝对路径或者相对路径指定jar包的位置。如果使用相对路径,在cmd中的当前工作目录将会影响到jar包的查找位置。 需要注意的是,在运行jar包时,必须保证jar包文件的路径不包含中文或者空格等特殊字符,否则会导致运行失败。 以上就是在cmd中运行jar包的基本命令和注意事项。 ### 回答3: 在CMD中运行jar包命令是通过使用Java运行环境来执行Java程序的。首先,确保电脑上已经安装了Java运行环境(JRE)或Java开发工具包(JDK)。然后,按照以下步骤执行jar包命令: 1. 打开CMD终端:在Windows系统中,点击开始按钮,输入“cmd”并按下回车键来打开CMD终端。 2. 切换到jar包所在目录:使用“cd”命令来切换到jar包所在的目录。例如,如果jar包在D盘的“myjar文件夹下,可以输入以下命令: ``` cd D:\myjar ``` 3. 运行jar包命令:在CMD终端中,输入以下命令来执行jar包: ``` java -jar yourjarfile.jar ``` 其中,“yourjarfile.jar”是你要运行jar包文件名。如果你的jar包在其他位置,需要指定jar包的完整路径。 4. 按下回车键运行命令后,CMD终端将会执行你的jar包。你可以在终端中看到程序的输出信息和运行结果。 注意事项: - 确保所输入的命令中jar包的名称和路径是正确的。 - 如果你的jar包依赖于其他库或文件,请确保这些依赖项也位于正确的位置。 - 在某些情况下,可能需要使用其他参数来运行jar包,如指定堆内存大小等。可以在命令后添加相应的参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝影铁哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值