Docker01 - docker快速入门

news/2025/2/27 10:39:52

Docker快速入门

文章目录

  • Docker快速入门
    • 一:Docker概述
      • 1:虚拟机技术和容器化技术
      • 2:Docker名词解释
        • 2.1:Docker镜像(images)
        • 2.2:Docker容器(containers)
        • 2.3:Docker仓库(registry)
      • 3:Docker下载安装
        • 3.1:安装
        • 3.2:卸载
        • 3.3:ali云加速
    • 二:Docker基本命令
    • 三:基本安装部署演示
      • 1:Nginx测试
      • 2:Tomcat测试
        • 2.1:镜像拉取和容器启动
        • 2.2:阉割tomcat的处理
    • 四:镜像的仓库发布和获取
      • 1:本地镜像发布到docker hub(了解即可)
      • 2:本地镜像发布到阿里云
        • 2.1:打包容器为镜像
        • 2.2:进入阿里云开发者平台:
        • 2.3:进入容器镜像服务
        • 2.4:创建命名空间和仓库名称
        • 2.5:进入管理界面获得脚本
        • 2.7:镜像推送
          • 2.7.1:登录到阿里云registry
          • 2.7.2:将镜像推送到registry
        • 2.8:从阿里仓库下载别人的镜像
      • 3:本地镜像发布到私有docker仓库
        • 3.1:下载镜像Docker Registry
        • 3.2:运行私有库
        • 3.3:将指定容器构建成为镜像
        • 3.4:curl验证私服镜像
        • 3.5:推送到私服
          • 3.5.1:打标签
          • 3.5.2:http支持
          • 3.5.3:推送到私服
        • 3.6:从私有仓库拉取到本地
    • 五:DockerFile
      • 1:dockerFile指令集
        • 1.1:FROM
        • 1.2:MAINTAINER
        • 1.3:RUN
        • 1.4:CMD
        • 1.5:LABEL
        • 1.6:EXPOSE
        • 1.7:ENV
        • 1.8:ADD
        • 1.9:COPY
        • 1.10:ENTRYPOINT
        • 1.11:VOLUME
        • 1.12:USER
        • 1.13:WORKDIR
        • 1.14:ARG
        • 1.15:ONBUILD
      • 2:dockerFile示例

docker 使用的是 go 语言进行开发的

  • 官网: https://www.docker.com;
  • 文档地址:https://docs.docker.com;
  • 仓库地址:https://hub.docker.com

一:Docker概述

1:虚拟机技术和容器化技术

在这里插入图片描述
docker就是将程序和其需要的环境封装到了一起

虚拟机技术和Docker的不同

  • 传统的虚拟机技术,模拟出一个硬件,然后在上面安装一套完整的操作系统,然后在这个操作系统上运行和安装软件
  • 容器内的软件直接运行在宿主机上的内容,没有内核,也没有虚拟硬件
Docker容器虚拟机
性能等于物理机性能大概有5% ~ 20%的损耗
隔离性NS隔离
虚拟化类型操作系统虚拟化硬件虚拟化
安全性
GuestOS【子操作系统】只支持Linux全部

docker中每一个容器之间互相隔离,都有自己的文件系统,互相不影响

在这里插入图片描述

2:Docker名词解释

在这里插入图片描述

2.1:Docker镜像(images)
  • 好比是一个模板,可以通过这个模板来创建容器服务
  • tomcat的镜像 -> docker run -> tomcat1容器实例
  • 通过这个镜像可以创建多个实例,好比可以通过一个 java class 可以new多个这个类的实例一样

在这里插入图片描述

2.2:Docker容器(containers)
  • 容器技术独立运行一个或者一组应用, 通过镜像进行创建
  • 启动,停止,删除基本命令
  • 容器可以简单的理解为一个小型的linux系统

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Docker面向对象
容器 containers对象
镜像 images
2.3:Docker仓库(registry)
  • 仓库就是存放镜像的地方
  • 分为共有仓库和私有仓库
  • 最大的docker镜像仓库 -> Docker hub(默认是国外的,可以配置镜像进行加速)

在这里插入图片描述

3:Docker下载安装

3.1:安装
  1. 安装底层工具
# 这里我们安装docker的底层工具,会自动提示我们下载,很快就会完成了
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
  1. 加入阿里云yum仓库提速docker的下载过程
# 增加阿里云的docker下载仓库,默认情况下,Docker的官方是从国外的服务器上下载的,下载速度是非常慢的,甚至失败
# 所以在这里我们是使用yum-config-manager组件来指定一个新的下载资源,指向的是阿里云的应用服务器,以此提高下载速度
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  1. 更新一下仓库的源信息
sudo yum makecache fast # centos stream 9这个镜像没有fast参数,可以不要这个
  1. 安装docker客户端和docker引擎
sudo yum -y install docker-ce

在这里插入图片描述

  1. 启动和版本查看
# 启动docker
sudo service docker start

# 查看版本验证docker是否安装成功
docker version

在这里插入图片描述

  1. Aliyun镜像加速

https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

在这里插入图片描述

在这里插入图片描述

至此,docker安装部分结束

3.2:卸载

1:移除安装的软件

yum remove docker-ce docker-ce-cli containerd.io

2:移除相关文件夹

sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
3.3:ali云加速

注册一个属于自己的阿里云账户(可复用淘宝账号) -> 获得加速器地址连接 -> 登陆阿里云开发者平台 -> 进入控制台 -> 产品和服务 -> 弹性计算 -> 容器镜像服务

在这里插入图片描述
在这里插入图片描述

二:Docker基本命令

在这里插入图片描述

1:帮助命令

文档:https://docs.docker.com/engine/reference/commandline/docker/

在这里插入图片描述

systemctl start docker # 启动docker 
systemctl stop docker # 停止docker
systemctl restart docker # 重启docker
systemctl enable docker # 开机启动docker
systemctl status docker # 查看docker状态

docker info # 查看docker概要信息
docker --help # 查看docker总体帮助文档
docker 具体命令 --help # 查看docker命令帮助文档

2:镜像相关命令

在这里插入图片描述

docker_images_160">2.1:docker images

列出所有的本地的镜像

docker images [OPTIONS] [REPOSITORY[:TAG]]
Name, shorthandDefaultDescription
--all , -a列出所有的镜像
--filter , -f过滤
--quiet , -q只显示镜像的id

在这里插入图片描述

  • REPOSITORY -> 表示镜像的仓库源;
  • TAG -> 镜像的标签版本号;
  • IMAGE ID -> 镜像ID;
  • CREATED -> 镜像创建时间;
  • SIZE -> 镜像大小

同一仓库源可以有多个 TAG版本,代表这个仓库源的不同个版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。

如果你不指定一个镜像的版本标签,将默认使用最新版本 -> tag = lastest

docker_search_185">2.2:docker search

搜索指定的镜像

docker search [OPTIONS] TERM
Name, shorthandDefaultDescription
--filter , -f过滤保留符合条件的

在这里插入图片描述

参数说明
name镜像的名称
description镜像说明
stars点赞数量
offical是否官方
automated是否是自动构建的
docker_pull_206">2.3:docker pull

下载(拉取)镜像

docker pull [OPTIONS] NAME[:TAG|@DIGEST]
Name, shorthandDefaultDescription
--all-tags , -a在仓库中下载所有版本的镜像

在这里插入图片描述
在这里插入图片描述

docker_rmi_220">2.4:docker rmi

删除指定的镜像

docker rmi [OPTIONS] IMAGE [IMAGE...]

docker rmi -f [image_id] # 可以通过指定image id进行删除
docker rmi [name: tag] # 可以通过指定name : tag进行删除
docker rmi -f $(docker images -aq) # 删除全部的镜像
Name, shorthandDescription
--force , -f强制删除

在这里插入图片描述

2.5:镜像提交

对自己的镜像进行提交操作

docker commit  # 提交容器成为一个新的版本

# -m -> message -> 可以忽略
# -a -> author -> 可以忽略
docker commit -m[信息] -a[作者] [容器id] target_image_name[tag]

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
Name, shorthandDefaultDescription
--author , -aAuthor (e.g., “John Hannibal Smith hannibal@a-team.com”)
--change , -cApply Dockerfile instruction to the created image
--message , -mCommit message
--pause , -ptruePause container during commit

在这里插入图片描述

3:容器相关命令

有了镜像才能创建容器,(就是有了类才能创建实例)

在这里插入图片描述

docker_run_264">3.1:docker run【重中之重】

新建一个容器并启动

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

# 下面列出几个常用的[OPTIONS]参数
--name = "Name"  # 容器的名字,用来进行容器的区分
-d  # 后台方式进行运行
-e # 指定环境变量
-v # 挂载到宿主机指定的目录(宿主机目录:容器目录)
-it  # 通过交互的方式进行运行
-P  # 随机指定端口
-p  # 指定容器的端口,有下面四种使用方式
# 方式一 -> -p ip:主机端口:容器端口
# 方式二 -> -p 主机端口:容器端口 [最常用]
# 方式三 -> -p 容器端口
# 方式四 -> 容器端口

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
容器中退出到服务器

exit() 退出后停止

ctrl + p + q 退出后不停止依然运行

在这里插入图片描述
🎉 创建容器有两种方式:

在这里插入图片描述

docker_ps_298">3.2:docker ps

列出当前正在运行的容器

docker ps [OPTIONS]
Name, shorthandDefaultDescription
--all , -a列出当前正在运行的容器,带出历史运行过的容器
--filter , -f过滤列出
--last , -n-1显示最近创建的容器
--quiet , -q只显示容器的编号
--size , -s展示总的文价的大小
docker_rm_314">3.3:docker rm

删除容器

docker rm [OPTIONS] CONTAINER [CONTAINER...]
Name, shorthandDescription
--force , -f强制删除
docker rm 容器的id  # 不能删除正在运行的容器
docker rm $(docker ps -aq) # 删除所有的容器

# 列出所有的容器编号后重定向作为docker rm的参数进行删除,和docker rm $(docker ps -aq)同理
docker ps -a -q | xargs docker rm  # 删除所有的容器
docker_exec_334">3.4:docker exec

进入正在运行的容器的命令

docker exec -it container_id /bin/bash

exec和attach的区别

当多个窗口同是attach到同一个容器的时候,所有窗口都会同步显示;当某个窗口因命令阻塞时,其他窗口也无法执行操作

3.5:启动和停止容器
docker start [OPTIONS] CONTAINER [CONTAINER...]  # 启动容器
docker restart [OPTIONS] CONTAINER [CONTAINER...] # 重启容器
docker stop [OPTIONS] CONTAINER [CONTAINER...] # 停止容器
docker kill [OPTIONS] CONTAINER [CONTAINER...] # 杀掉容器
3.6:其他常用命令
docker_logs_361">3.6.1:docker logs

查看日志

docker logs -tf --tail [number] container_id
-tf  # 显示日志
--tail [number]  # 要显示的条数
docker_top_371">3.6.2:docker top

查看容器中的进程

docker top container_id
docker_inspect_379">3.6.3:docker inspect

查看镜像的元数据

docker inspect container_id
docker_cp_387">3.6.4:docker cp

容器和本地文件系统之间复制文件/文件夹

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH

在这里插入图片描述

4:总结

4.1:核心命令图

在这里插入图片描述

docker_403">4.2:docker是怎么工作的

docker是C/S的系统结构,守护线程运行在主机上,通过Socket从客户端访问

server接收到client的指令,就会开始执行

在这里插入图片描述

三:基本安装部署演示

在这里插入图片描述

1:Nginx测试

# 1:搜索docker镜像
docker search nginx

# 2:拉取最新nginx镜像
docker pull nginx

# 3:查看当前的所有的镜像,方便检查nginx是不是已下载成功
docker images

# =====> 下面是容器操作 <=====
# 4:启动镜像,创建容器
docker run 
	-d # 后台运行
	--name nginx01 # 容器命名 
	-p 3344:80  # 端口映射 3344是宿主机端口,映射容器的80端口
	nginx # 使用的镜像名称

# 5:查看当前的容器
docker ps

内部映射图

在这里插入图片描述

# 以后台的方式进入到容器
docker exec -it nginx01 /bin/bash

# 查看nginx01的相关的信息
whereis nginx
cd /etc/nginx

2:Tomcat测试

2.1:镜像拉取和容器启动
# 搜索docker镜像
docker search tomcat
# 拉取最新镜像
docker pull tomcat
# 查看当前的所有的镜像,方便检查tomcat是不是已下载成功
docker images

# 启动镜像,创建容器
# 起一个别名,通过公网端口号3355,访问内部的808端口(映射性)
docker run 
	-d 
	--name tomcat01 # 指定容器名称
	-p 3355:8080 # 端口映射 3355是宿主机端口,映射容器的8080端口
	tomcat # 指定使用的镜像

# 查看当前的容器
docker ps
# 进入容器
docker exec -it tomcat01 /bin/bash
2.2:阉割tomcat的处理

如果使用的是阿里云镜像加速,将会得到一个阉割版的Tomcat,很多内容都不支持

  • linux的命令少了,像什么ll都不支持
  • webapps中没有内容

在这里插入图片描述
如果发生这个问题可以将webapps.dist文件夹下的所有的内容都拷贝到webapps

# 将webapps下的dist中的所有的内容拷贝给webapps
cp -r webapps/dist/* webapps

# 查看容器状态,可以看到还是123456
docker ps

# 进行提交
docker commit 
	-a='author01' # auth
	-m='add webapps' # message
	123456 # 容器id
	tomcat01:1.0 

# 查看镜像,可以发现此时有tomcat01了
docker images

四:镜像的仓库发布和获取

docker_hub_507">1:本地镜像发布到docker hub(了解即可)

中国大陆访问太慢了且准备被阿里云取代的趋势,不太主流

docker login # 登录docker

# 进行给镜像命名
docker tag 
	java-demo:v1.0
	cuihaida/java-demo:v1.0

# 当前宿主机推送镜像到docker hub
docker push cuihaida/java-demo:v1.0

# 这样其他服务器就可以使用docker pull命令进行拉取了
docker pull cuihaida/java-demo:v1.0

2:本地镜像发布到阿里云

2.1:打包容器为镜像

在Docker中,你可以使用docker commit命令将一个正在运行的容器转换为镜像,或者使用docker savedocker load来导出和导入镜像。下面是一些具体的步骤和示例:

使用docker commit

  1. 首先,启动一个容器(例如,使用docker run命令)。

    docker run -d --name my_container ubuntu /bin/sleep infinity
    
  2. 然后,使用docker commit将该容器转换为镜像。

    docker commit my_container my_new_image
    
  3. 此时,你可以使用docker images查看新的镜像。

    docker images
    

使用docker savedocker load

  1. 首先,确保容器正在运行或已停止。

  2. 使用docker save导出容器

    docker save -o my_container.tar my_container
    
  3. 然后,可以使用docker load来加载这个镜像。

    docker load -i my_container.tar
    
  4. 加载后,你可以使用docker images查看新加载的镜像。

    docker images
    
2.2:进入阿里云开发者平台:

https://promotion.aliyun.com/ntms/act/kubernetes.html

在这里插入图片描述
创建仓库镜像

在这里插入图片描述

2.3:进入容器镜像服务

选择控制台,进入容器镜像服务

在这里插入图片描述

2.4:创建命名空间和仓库名称

个人版 -> 命名空间 -> 仓库名称

在这里插入图片描述

在这里插入图片描述

2.5:进入管理界面获得脚本

在这里插入图片描述

2.7:镜像推送
2.7.1:登录到阿里云registry
docker login 
	--username=[你的用户名] # 指定用户名
	registry.cn-hangzhou.aliyuncs.com # 阿里云registry
2.7.2:将镜像推送到registry
# 打上tag标签
docker tag 
	cea1bb40441c # 镜像id
	registry.cn-hangzhou.aliyuncs.com/atguiguwh/myubuntu:1.1 # 标签名称 & 版本

# 推送
docker push registry.cn-hangzhou.aliyuncs.com/atguiguwh/myubuntu:1.1

在这里插入图片描述

2.8:从阿里仓库下载别人的镜像
docker pull registry.cn-hangzhou.aliyuncs.com/atguiguwh/myubuntu:1.1

在这里插入图片描述

docker_625">3:本地镜像发布到私有docker仓库

Docker Registry是官方提供的工具,可以用于构建私有镜像仓库

3.1:下载镜像Docker Registry
docker pull registry

在这里插入图片描述

3.2:运行私有库
docker run 
	-d # 后台启动
	-p 5000:5000  # 端口映射
	-v /zzyyuse/myregistry/:/tmp/registry  # 数据卷挂载,宿主机目录/zzyyuse/myregistry/,容器目录/tmp/registry
	--privileged=true # 私有化
	registry

在这里插入图片描述

默认情况,仓库被创建在容器的/var/lib/registry目录下,建议自行用容器卷映射,方便于宿主机联调

3.3:将指定容器构建成为镜像
docker commit 
	-m="ifconfig cmd add" 
	-a="zzyy" 
	a69d7c825c4f  # 容器id
	zzyyubuntu:1.2 # 镜像名称:版本号

在这里插入图片描述

3.4:curl验证私服镜像
curl -XGET http://192.168.111.162:5000/v2/_catalog

在这里插入图片描述

3.5:推送到私服
3.5.1:打标签
docker tag  
	zzyyubuntu:1.2  
	192.168.111.162:5000/zzyyubuntu:1.2 # 换成自己的IP

在这里插入图片描述

3.5.2:http支持

修改守护线程的配置文件使之支持http

在这里插入图片描述
修改完之后注意重启docker

3.5.3:推送到私服
docker push 192.168.111.162:5000/zzyyubuntu:1.2

在这里插入图片描述

推送完成可以使用curl验证私服库是否有这个

3.6:从私有仓库拉取到本地
docker pull 192.168.111.162:5000/zzyyubuntu:1.2

在这里插入图片描述

五:DockerFile

一种命令脚本,可以使用docker build通过dockerfile脚本创建镜像。

Dockerfile 是定义 Docker 容器镜像构建过程的文件,包括容器镜像使用的基础环境、容器内的依赖和文件、容器的配置、启动命令等。

有了 Dockerfile,我们就能很轻松地制作出自己的容器镜像。

虽然 Dockerfile 的写法并不复杂,但还是建议尽量不要自己写,直接去网上找个差不多的项目,复制粘贴别人的 Dockerfile 就足够了!

dockerFile_719">1:dockerFile指令集

官方文档:https://docs.docker.com/engine/reference/builder/#dockerfile-reference

在这里插入图片描述

1.1:FROM

指定基础镜像,指定这个镜像的母亲是谁

支持三种格式:

  • FROM <image>
  • FROM <image>:<tag>
  • FROM <image>@<digest>

FROM指令必须指定需要在Dockerfile其他指令的前面

指定的基础image可以是官方远程仓库中的,也可以位于本地仓库。

后续的指令都依赖于该指令指定的image。

当在同一个Dockerfile中建立多个镜像时,可以使用多个FROM指令。

1.2:MAINTAINER

指定维护者的信息,告诉这个脚本谁在维护

格式为:

  • MAINTAINER <name>
1.3:RUN

镜像构建的时候需要运行的命令

支持两种格式:

  • RUN <command>
  • RUN ["executable", "param1", "param2"]

RUN <command> 在shell终端中运行命令

  • 在Linux中默认是/bin/sh -c
  • 在Windows中是 cmd /s /c

RUN ["executable", "param1", "param2"] 使用exec执行。

  • 指定其他终端可以通过该方式操作,例如:RUN ["/bin/bash", "-c", "echo hello"]
  • 该方式必须使用[“]而不能使用[‘],因为该方式会被转换成一个JSON 数组。
1.4:CMD

指定容器时要运行的命令,为执行的容器提供默认值主要是

CMD支持三种格式:

  • CMD ["executable","param1","param2"] (推荐使用)
  • CMD ["param1","param2"] (为ENTRYPOINT指令提供预设参数)
  • CMD command param1 param2 (在shell中执行)

CMD指令的主要目的是为执行容器提供默认值。

每个Dockerfile只有一个CMD命令,如果指定了多个CMD命令,那么只有一条会被执行

如果启动容器的时候指定了运行的命令,则会覆盖掉CMD指定的命令。

1.5:LABEL

为镜像添加元数据

格式为:

  • LABEL <key>=<value> <key>=<value> <key>=<value> ...

使用 “和 \ 转换命令行,示例:

dockerfile">LABEL "com.example.vendor"="ACME Incorporated"
LABEL com.example.label-with-value="foo"
LABEL version="1.0"
LABEL description="This text illustrates \
that label-values can span multiple lines."
1.6:EXPOSE

为Docker容器设置对外的端口号

格式为:

  • EXPOSE <port> [<port>...]

在启动时,可以使用-p选项或者-P选项。

# 映射一个端口示例
EXPOSE port1
# 相应的运行容器使用的命令
docker run -p port1 image
# 也可以使用-P选项启动
docker run -P image

# 映射多个端口示例
EXPOSE port1 port2 port3
# 相应的运行容器使用的命令
docker run -p port1 -p port2 -p port3 image
# 还可以指定需要映射到宿主机器上的某个端口号  
docker run -p host_port1:port1 -p host_port2:port2 -p host_port3:port3 image
1.7:ENV

指定环境变量

格式为:

  • ENV <key> <value>
  • ENV <key> = <value> ...

指定环境变量,会被后续RUN指令使用

容器启动后:

  • 可以通过docker inspect查看这个环境变量
  • 也可以通过docker run --env <key> = <value> 来修改环境变量
dockerfile">ENV JAVA_HOME /path/to/java # 设置环境变量JAVA_HOME
1.8:ADD

copy文件,会自动进行解压操作

格式为:

  • ADD <src>... <dest>
  • ADD ["<src>",... "<dest>"]

从src目录复制文件到容器的dest。

其中src可以是Dockerfile所在目录的相对路径,也可以是一个URL,还可以是一个压缩包

⚠️ 注意下面的事项:

  1. src必须在构建的上下文内,不能使用例如:ADD ../somethine /something ,因为docker build 命令首先会将上下文路径和其子目录发送到docker daemon
  2. 如果src是一个URL,同时dest不以斜杠结尾,dest将会被视为文件,src对应内容文件将会被下载到dest
  3. 如果src是一个URL,同时dest以斜杠结尾,dest将被视为目录,src对应内容将会被下载到dest目录
  4. 如果src是一个目录,那么整个目录其下的内容将会被拷贝,包括文件系统元数据
  5. 如果文件是可识别的压缩包格式,则docker会自动解压
1.9:COPY
  • COPY <src>... <dest>
  • COPY ["<src>",... "<dest>"] (shell中执行)

复制本地端的src到容器的dest。

和ADD指令类似,只是COPY不支持URL和压缩包。

1.10:ENTRYPOINT

指定Docker容器启动时执行的命令,可以多次设置,但是只有最后一个有效

格式为:

  • ENTRYPOINT ["executable", "param1", "param2"]
  • ENTRYPOINT command param1 param2
1.11:VOLUME

指定持久化的容器数据卷映射

格式为:

  • VOLUME ["/data"]

使容器中的一个目录具有持久化存储数据的功能,该目录可以被容器本身使用,也可以共享给其他容器

容器中的应用有持久化数据的需求时可以在Dockerfile中使用该指令。

1.12:USER

设置启动容器的用户,默认是root用户。

格式为:

  • USER 用户名
1.13:WORKDIR

切换目录指令

格式为:

  • WORKDIR /path/to/workdir

类似于cd命令,对RUN、CMD、ENTRYPOINT生效。

1.14:ARG

定义一个变量

格式为:

  • ARG <name>[=<default value>]
1.15:ONBUILD

指定当建立的镜像作为其他镜像的基础时,所执行的命令

格式为:

  • ONBUILD [INSTRUCTION]

dockerFile_934">2:dockerFile示例

上面命令比较多,比较常用的有下面这几个:

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

例如,要基于Ubuntu镜像来构建一个Java应用,其Dockerfile内容如下:

dockerfile"># 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录、容器内时区
ENV JAVA_DIR=/usr/local
ENV TZ=Asia/Shanghai
# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar
# 设定时区
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 安装JDK
RUN cd $JAVA_DIR \
 && tar -xf ./jdk8.tar.gz \
 && mv ./jdk1.8.0_144 ./java8
# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin
# 指定项目监听的端口
EXPOSE 8080
# 入口,java项目的启动命令
ENTRYPOINT ["java", "-jar", "/app.jar"]

有人提供了基础的系统加JDK环境,我们在此基础上制作java镜像,就可以省去JDK的配置了

dockerfile"># 基础镜像
FROM openjdk:11.0-jre-buster
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY docker-demo.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]

当Dockerfile文件写好以后,就可以利用命令来构建镜像了。

提前准备好一个demo项目及对应的Dockerfile:

在这里插入图片描述
首先,我们将docker-demo.jar包以及Dockerfile拷贝到虚拟机的/root/demo目录:

在这里插入图片描述
然后,执行命令,构建镜像:

# 进入镜像目录
cd /root/demo
# 开始构建
docker build -t docker-demo:1.0 .

命令说明:

  • docker build : 就是构建一个docker镜像
  • -t docker-demo:1.0-t参数是指定镜像的名称(repositorytag
  • . : 最后的点是指构建时Dockerfile所在路径,由于我们进入了demo目录,所以指定的是.代表当前目录,也可以直接指定Dockerfile目录:
# 直接指定Dockerfile目录
docker build -t docker-demo:1.0 /root/demo

结果:

在这里插入图片描述
查看镜像列表:

# 查看镜像列表:
docker images
# 结果
REPOSITORY    TAG       IMAGE ID       CREATED          SIZE
docker-demo   1.0       d6ab0b9e64b9   27 minutes ago   327MB
nginx         latest    605c77e624dd   16 months ago    141MB
mysql         latest    3218b38490ce   17 months ago    516MB

然后尝试运行该镜像:

# 1.创建并运行容器
docker run 
	-d 
	--name dd 
	-p 8080:8080 
	docker-demo:1.0
# 2.查看容器
dps
# 结果
CONTAINER ID   IMAGE             PORTS                                                  STATUS         NAMES
78a000447b49   docker-demo:1.0   0.0.0.0:8080->8080/tcp, :::8090->8090/tcp              Up 2 seconds   dd
f63cfead8502   mysql             0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   Up 2 hours     mysql

# 3.访问测试
curl localhost:8080/hello/count

http://www.niftyadmin.cn/n/5869964.html

相关文章

【多模态大模型学习】位置编码的学习记录

【多模态大模型学习】位置编码的学习记录 0.前言1. sinusoidal编码1.0 数学知识——复数1.0.1 复数乘法、共轭复数1.0.2 复数的指数表示 1.1 sinusoidal编码来历1.2 代码实现 2. Rotary Positional Embedding (RoPE) ——旋转位置编码2.1 RoPE来历2.2 代码实现2.2.1 GPT-J风格的…

二、IDE集成DeepSeek保姆级教学(使用篇)

各位看官老爷好&#xff0c;如果还没有安装DeepSeek请查阅前一篇 一、IDE集成DeepSeek保姆级教学(安装篇) 一、DeepSeek在CodeGPT中使用教学 1.1、Edit Code 编辑代码 选中代码片段 —> 右键 —> CodeGPT —> Edit Code, 输入自然语言可编辑代码&#xff0c;点击S…

java23种设计模式-观察者模式

观察者模式&#xff08;Observer Pattern&#xff09;学习笔记 编程相关书籍分享&#xff1a;https://blog.csdn.net/weixin_47763579/article/details/145855793 DeepSeek使用技巧pdf资料分享&#xff1a;https://blog.csdn.net/weixin_47763579/article/details/145884039 1.…

u3d使用图片字/渐变色字/艺术字详解

一.使用BMFont生成.fnt和.tga文件 1.1 下载安装bmfont Bitmap Font Generator 1.2 设置bit depth为32位 Options->Export options 1.3 清理选择字符 Edit->Clear all chars in fomt 1.4 导入艺术字图片 Edit->Open Image Manager Image->Import image 选择美术…

本地部署阿里的万象2.1文生视频(Wan2.1-T2V-1.3B)模型

文章目录 &#xff08;零&#xff09;在线体验&#xff08;一&#xff09;本地部署&#xff08;1.1&#xff09;克隆仓库&#xff08;1.2&#xff09;安装依赖&#xff08;1.2.1&#xff09;安装 flash-attention&#xff08;1.2.2&#xff09;重新安装依赖&#xff08;1.2.3&a…

深入理解高阶函数:提升JavaScript编程技巧

在JavaScript中&#xff0c;函数是一等公民&#xff0c;这意味着函数可以像其他数据类型一样被传递、赋值和返回。高阶函数&#xff08;Higher-Order Function&#xff09;是函数式编程中的一个核心概念&#xff0c;它能够极大地提升代码的灵活性和可重用性。本文将深入探讨高阶…

Nuxt.js 3【详解】敏感信息处理 -- 环境变量配置

部分敏感信息不便存在代码中&#xff0c;需在环境变量中配置 新建 .env NUXT_API_KEY123以 apiKey 为例&#xff0c;在 .env 中&#xff0c;必须以 NUXT_ 开头&#xff0c;全部大写&#xff0c;驼峰用 _连接 nuxt.config.ts 中添加运行时配置 runtimeConfig: {apiKey: "…

Kafka和Zookeeper的基本概念及使用方法

一、什么是Kafka和Zookeeper&#xff1f; Kafka概念&#xff1a; Kafka 是一种分布式流处理平台&#xff0c;最初由 LinkedIn 开发&#xff0c;后成为 Apache 开源项目。它主要用于构建实时数据管道和流应用&#xff0c;具有高吞吐量、低延迟和可扩展性。 Zookeeper概念&#x…