传送门
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 命令:
-
docker-compose up: 构建并启动整个应用程序。
- 示例:
docker-compose up
- 示例:
-
docker-compose down: 停止并移除整个应用程序的容器、网络、卷等资源。
- 示例:
docker-compose down
- 示例:
-
docker-compose build: 构建或重新构建服务。
- 示例:
docker-compose build
- 示例:
-
docker-compose start: 启动已经创建但停止的服务容器。
- 示例:
docker-compose start
- 示例:
-
docker-compose stop: 停止正在运行的服务容器,但不删除它们。
- 示例:
docker-compose stop
- 示例:
-
docker-compose restart: 重启服务容器。
- 示例:
docker-compose restart
- 示例:
-
docker-compose logs: 查看服务容器的日志输出。
- 示例:
docker-compose logs
- 示例:
-
docker-compose ps: 列出所有服务容器的状态。
- 示例:
docker-compose ps
- 示例: