Docker入门

本文从虚拟机技术引入,详细介绍了容器虚拟化技术的优势,特别是Docker的背景、作用、架构和底层原理。接着,展示了Docker在CentOS7和MacOS上的安装过程,以及常用命令的使用。重点讲解了Docker容器数据卷的概念和案例,以及如何通过容器和Dockerfile制作镜像。最后,阐述了Docker镜像的发布流程,包括构建SpringBoot应用镜像并将其推送到阿里云镜像仓库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 前言

1.1 虚拟机技术

  虚拟机(virtual machine),对于我们来说并不陌生,我们通常会在windows系统中,利用VMvare软件,安装其他我们需要的系统环境如Linux,它是带环境安装的一种解决方案。
  在一种操作系统里面运行另一种操作系统,应用程序对此毫无感知,因为虚拟机看上去与真实系统一样。而对于本机的底层系统来说,虚拟机就是一个普通文件,若不需要可直接删除,对其他部分毫无影响。这类虚拟机完美的运行了另一套系统,能够使应用程序、操作系统和硬件三者之间的逻辑不变。
在这里插入图片描述
  由于一个虚拟机中运行着一套系统,导致占用资源多,且启动较慢,创建一个VM冗余步骤比较多。因此,Linux 发展出了另一种虚拟化技术即Linux 容器(Linux Containers,缩写为 LXC)。

1.2 容器虚拟化技术

  Linux 容器(LXC)并不是模拟一个完整的操作系统,而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。
  容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件在工作时所需的库资源和相关设置。
在这里插入图片描述
相较于传统虚拟机技术,容器有非常明显的优势:

  • 传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便
  • 每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。

基于Linux容器技术,Docker应运而生。

2. Docker初识

2.1 概念

2.1.1 背景

  一款产品从开发到上线,从操作系统,到运行环境,再到应用配置,开发与运维之间需要相互协作,尤其是各种版本的迭代之后,不同版本环境的兼容,对运维人员也是较大的考验。
  环境配置很麻烦,更换机器时又要重复进行。基于此,软件可以带环境安装的方案就出现了,即安装的时候可以将原始环境同时复制。
  Docker之所以发展如此迅速,也是因为它对此给出了一个标准化的解决方案。开发人员利用 Docker 可以消除协作编码时,更换机器但应用无法正常工作的问题。Docker镜像的设计,使得Docker得以打破过去「程序即应用」的观念,通过镜像(images)将运作应用程式所需要的系统环境(作业系统核心除外),由下而上打包,达到应用程式跨平台间的无缝接轨运作。

2.1.2 作用

  Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等)及其运行环境能够做到“一次封装,到处运行”。
  将应用运行在 Docker 容器上面,而 Docker 容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,更换机器就可以一键部署完毕,大大简化了操作。

2.2 架构

Docker使用C/S架构,Client通过接口与Server进程通信实现容器的构建、运行和发布。
在这里插入图片描述
  Docker客户端(Client):Docker命令行工具,用户通过Docker Client与Docker Daemon进行通信并返回结果给用户。也可使用其他工具通过Docker Api与Docker Daemon通信。
  Docker宿主机(Host):安装了Docker程序,并运行着Docker Daemon的主机。
  Docker守护进程(Daemon):运行在宿主机上的进程,用户通过Docker Client使用Docker命令与Docker Daemon交互。
  Docker 镜像(Image):是一个只读的模板,镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。
  Docker 容器(Container):是用镜像创建的运行实例,可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序,它可以被启动、开始、停止、删除。每个容器都是相互隔离、保证安全的平台。容器的定义和镜像几乎一模一样,唯一区别在于容器的最上层是可读可写的。
  仓库(Repository):是集中存放镜像文件的场所。仓库注册服务器(Registry)上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。

2.3 底层原理

  Docker是一个Client-Server结构的系统,Docker守护进程运行在主机上, 然后通过Socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。 容器,是Docker的运行组件,它是一个运行时环境。
  Docker是Linux容器技术的体现,它有着比VM更少的抽象层,运行在Docker容器上的程序直接使用的都是实际物理机的硬件资源,这就使Docker在CPU、内存利用率上有明显优势;再者,Docker利用的是宿主机的内核,而不需要Guest OS,因此,当新建一个容器时,Docker省去了重新加载操作系统内核的过程,

3. Docker安装

3.1 CentOS7安装Docker

3.1.1 安装

CentOS安装Docker前,首先查看系统版本信息,确认是否支持Docker,并选择相应安装步骤。

  • cat /etc/redhat-release 查看已安装的CentOS版本;
  • uname -r 命令确定系统内核版本号;
    在这里插入图片描述

Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上,由以上查看的系统信息,确定本机符合Docker安装条件。
CentOS7安装Docker步骤,建议参考官网安装步骤:https://docs.docker.com/engine/install/centos/
在这里插入图片描述

安装完成,docker -v可查看本机已安装Docker版本。
在这里插入图片描述

3.1.2 配置镜像加速

阿里云容器镜像服务网址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors。利用淘宝、支付宝或钉钉账号扫码授权登录即可。
在这里插入图片描述

配置镜像加速器后,选择CentOS操作文档,输入下方给出的命令,即在/etc/docker/daemon.json文件中写入镜像加速器地址,然后重新加载daemon配置,再重启docker服务即可。
在这里插入图片描述
也可配置网易镜像加速器:{“registry-mirrors”: [“http://hub-mirror.c.163.com”] }

3.2 MacOS安装Docker

3.2.1 安装

MacOS安装Docker步骤,参考菜鸟教程:https://www.runoob.com/docker/macos-docker-install.html。我这里通过Homebrew安装Docker,建议安装一下Homebrew,通过Homebrew可便捷的安装很多软件。
安装完成,docker -v可查看本机已安装Docker版本。
在这里插入图片描述

3.2.2 配置镜像加速

以上通过Homebrew安装的Docker app,点击运行后,可发现docker状态为running。
在这里插入图片描述

点击Preferences选项,进行镜像加速的配置,镜像加速器地址的json串写入后,点击Apply & Restart按钮,应用并重启。
在这里插入图片描述
通过命令docker info,查看本机安装docker详细信息,可查看到镜像加速器配置成功。
在这里插入图片描述

4. Docker常用命令

4.1 帮助命令

  • 查看指令用法
docker --help 
  • 查看已安装docker信息
docker -v
docker version
docker info

4.1 镜像命令

  • 查找镜像
docker search [OPTIONS] 关键词
# 搜索docker hub网站镜像的详细信息。OPTIONS说明如下,可以选择性给定:
# --no-trunc	显示完整的镜像描述
# -s 指定数值	列出收藏数不小于指定值(如500)的镜像
# --automated	只列出automated build类型的镜像
  • 下载镜像
docker pull 镜像名:TAG
# TAG表示版本,最新的版本为latest,若不指定,则默认下载最新版本
  • 查看镜像
docker images [OPTIONS]
# 列出本地主机上的镜像。OPTIONS说明如下,可以选择性给定:
# --no-trunc	显示完整的镜像描述
# --digests		显示镜像的摘要信息
# -a			列出本地所有镜像(包括中间映像层) 
# -q			只显示镜像ID
  • 删除镜像
docker rmi -f 镜像ID或镜像名:TAG
# 强制删除单个镜像,TAG若不指定,则默认删除latest
docker rmi -f 镜像ID或镜像名1:TAG 镜像ID或镜像名2:TAG
# 强制删除多个镜像
docker rmi -f $(docker images -qa)
# 强制删除全部镜像
  • 获取镜像元信息
docker inspect 镜像ID或镜像名:TAG
# 获取镜像的元信息,详细信息

4.2 容器命令

  • 查看容器列表
docker ps [OPTIONS]
# 查看正在运行的容器列表。OPTIONS说明如下,可选择性给定:
# -a			查看所有已创建的容器(已运行+未运行)
# -q			静默模式,只显示容器编号
# -l			显示最近创建的一个容器
# -n 个数		显示最近创建的几个容器
# --no-trunc	不截断输出
  • 新建并启动容器
docker run [OPTIONS] 镜像ID或镜像名:TAG
# 根据已经存在的镜像,新建并运行一个容器。OPTIONS说明如下,可选择性给定:
# --name="容器新名字"		为新建的容器指定一个名称
# -i					以交互模式运行容器,通常与 -t 同时使用
# -t					为容器重新分配一个伪输入终端,通常与 -i 同时使用
# -d					后台运行容器,并返回容器ID,也即启动守护式容器
# -P					随机端口映射
# -p 主机端口:容器端口		指定端口映射
# -v 主机目录:容器目录:ro	指定挂载主机目录到容器目录,默认为rw读写模式,ro表示只读
  • 退出容器
exit
# 退出容器,并停止容器
ctrl/control+P+Q
# 退出容器,但容器在后台运行
  • 进入运行中的容器
docker exec -it 容器ID或容器名 /bin/bash
# 进入正在运行的容器且开启交互模式终端,可以启动新的进程
docker attach 容器ID或容器名
# 直接进入容器启动命令的终端,不会启动新的进程
  • 启动容器
docker start 容器ID或容器名
# 启动容器
docker restart 容器ID或容器名
# 重启容器
  • 停止容器
docker stop 容器ID或容器名
# 停止容器
docker kill 容器ID或容器名
# 强制停止容器
  • 删除容器
docker rm -f 容器ID或容器名
# 强制删除容器
docker rm -f $(docker ps -a -q)
# 强制删除所有容器
  • 查看日志
docker logs [OPTIONS] 容器ID或容器名
# 查看容器日志。OPTIONS说明如下,可选择性给定:
# -t			加入时间戳
# -f 			跟谁最新的时间打印
# --tail 条数	显示最后多少条
  • 查看容器内运行的进程
docker top 容器ID或容器名
# 查看指定容器内部运行的进程
  • 拷贝文件
docker cp 主机文件路径 容器ID或容器名:容器路径
# 将主机指定路径下的文件拷贝到容器指定路径下
docker cp 容器ID或容器名:容器路径 主机文件路径
# 将容器指定路径下的文件拷贝到主机指定路径下
  • 获取容器元信息
docker inspect 容器ID或容器名
# 查看容器详细信息

5. Docker容器数据卷

5.1 数据卷

5.1.1 概念

  Docker容器是用镜像创建的运行实例,它的定义与镜像几乎一模一样,唯一区别在于容器的最上层是可读可写的。因此,在容器中可产生数据(如自定义配置、日志等),若该容器不保存成新的镜像,则在容器被删除后,数据也同时被删除。基于此,可使用数据卷来保存数据。
  所谓数据卷,就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,它的设计目的在于数据的持久化,完全独立于容器的生存周期,因此docker不会在容器删除时删除其挂载的数据卷。
  此外,数据卷除了数据持久化,还具备容器间继承与共享数据的功能。容器之间可通过--volumes-from实现继承的效果,容器间传递共享时,数据卷的生命周期一直到没有容器使用它为止。

5.1.2 案例演示

以下以镜像centos为例,创建容器并挂载数据卷。

  • 下载centos镜像,版本为默认即最新latest:docker pull centos
  • 执行挂载数据卷命令:docker run -it -v 宿主机目录:容器目录 镜像名。指定的宿主机目录与容器目录均已自动生成。
    在这里插入图片描述
  • 查看数据卷是否挂载成功: docker inspect 容器ID。容器ID在上一步创建容器时生成。在返回的容器元数据Json数据串中,key为"Mounts"的value中可以看到数据卷已挂载成功。
    在这里插入图片描述
  • 进入以上创建好的容器,在容器中的共享目录下新建文件,可在宿主机同步。
    在这里插入图片描述
  • 在宿主机共享目录下新建文件,进入容器,可发现文件已可共享。
    在这里插入图片描述
  • 创建一个只读的容器数据卷:docker run -it -v 宿主机目录:容器目录:ro 镜像名 。可以发现,在新建的容器的指定目录中已自动同步了宿主机目录的内容。注:ro表示read only只读,即本次挂载的数据卷只具备读取的权限。
    在这里插入图片描述
  • 查看数据卷是否挂载成功: docker inspect 容器ID。容器ID在上一步创建容器时生成。在返回的容器元数据Json数据串中,key为"Mounts"的value中可以看到数据卷已挂载成功,且读写属性为只读。
    在这里插入图片描述
  • 验证数据卷的读写属性。可发现数据卷指定为ro模式时,无法执行写的操作,但可同步宿主机的内容。
    在这里插入图片描述
  • 运行一个容器命名为con01,再运行容器名为con02、con03均继承自con01,再运行一个容器名为con04继承自con03,可发现其中数据均可实现传递共享。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

6. Docker镜像

6.1 概念

  Docker镜像的技术基础是Union文件系统,镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。

在这里插入图片描述
  bootfs(boot file system):主要包含bootloader和kernel。 bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统。这一层与典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
  Image:镜像层。镜像是分层的,最下层为Base Image,即基础镜像,不依赖其他镜像,从 scratch 构建,且可以作为其他镜像构建的基础。由下至上包含若干个Image,依次提供依赖而构建镜像,镜像层都是只读的。
  Container:容器层。位于Docker镜像的最上层,可读写。所有对容器的改动(添加、删除、修改文件等)都只会发生在容器层中。因此,容器层下面的所有镜像层都是只读的,只有容器层是可写的。可以理解为:容器=镜像层+读写层

  Docker镜像的分层结构设计,最大的好处是实现了资源共享。多个Container可以共享父Image存储,避免部署时的重复拷贝,节省存储空间,提高部署效率。

6.2 Docker镜像制作

6.2.1 使用容器制作镜像

  运行的容器内可能会发生变化(自定义配置、日志等),如果想保存下来以便下次直接使用,可以使用docker commit指令,提交该容器副本,使之成为一个新的镜像。
  以下以tomcat为例,演示效果。由于仓库中下载的tomcat镜像,集成系统功能较少,这里只简单演示镜像制作的效果:删除tomcat主页的文档,在浏览器进入已部署的tomcat页面上访问Documentation出现404即可。

  • 下载tomcat镜像,版本为默认最新latest:docker pull tomcat
  • 运行一个tomcat镜像实例:docker run -d -p 8090:8080 tomcat。注:-p表示自己指定端口,如此处指定8090为访问端口,8080表示tomcat容器开放的端口。-d表示后台运行,与-it不同,不会进入容器的交互式界面。执行成功可查看容器已在成功运行。
    在这里插入图片描述
  • 在浏览器访问tomcat:http://localhost:8090,此时可能会出现404。
    在这里插入图片描述
    此时首先确认:防火墙是否开启。
    开启防火墙后若还是出现404,再进入容器:docker exec -it eb57629df294 /bin/bash。可以发现,webapps目录下内容为空,而tomcat主页的内容在webapps.dist目录下。
    在这里插入图片描述
    此时,只需要将webapps.dist目录下的内容,复制到webapps目录下即可:cp -r webapps.dist/. webapps
    在这里插入图片描述
    再次访问http://localhost:8090,可正常显示。
    在这里插入图片描述
    点击Documentation选项,可正常进入文档页面。
    在这里插入图片描述
  • 删除容器中tomcat的docs目录:rm -rf docs/
    在这里插入图片描述
    再次点击Documentation选项,或者直接输入地址:http://localhost:8090/docs/。可发现文档界面404。
    在这里插入图片描述
  • 将删除docs文档的容器保存为一个镜像:docker commit -a="chavaer" -m="del tomcat docs" eb57629df294 chava/tomcat:1.0 。查看本地镜像,刚才制作的tomcat镜像提交成功。
    在这里插入图片描述
  • 运行刚才制作的tomcat镜像:docker run -d -p 7070:8080 chava/tomcat:1.0。这里指定访问端口为7070。
    在这里插入图片描述
    在浏览器访问:http://localhost:7070,可正常访问,不需要再去容器内复制webapps.dist的内容。
    在这里插入图片描述
    点击Documentation选项,或者直接输入地址:http://localhost:7070/docs/。可发现文档界面404。
    在这里插入图片描述

6.2.2 使用Dockerfile制作镜像

6.2.2.1 概念

  Dockerfile是用来构建Docker镜像的文件,是由一系列命令和参数构成的脚本。定义了进程需要的一切东西,包括执行代码或文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等。

  从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段:Dockerfile(软件的原材料,面向开发),通过docker build指令生成Docker镜像(软件的交付品,成为交付标准),再通过docker run指令生成Docker容器(软件的运行态,涉及部署运维)。这三者缺一不可,共同充当Docker体系的基石。
在这里插入图片描述
Docker执行Dockerfile的大致流程如下:

  1. Docker从基础镜像运行一个容器;
  2. 执行一条指令并对容器作出修改;
  3. 执行类似docker commit的操作,提交一个新的镜像层;
  4. docker再基于刚才提交的镜像运行一个新容器;
  5. 执行Dockerfile中的下一条指令直到全部完成。
6.2.2.2 Dockerfile保留字指令
指令名称指令释义
FROM基础镜像,指当前新镜像基于哪个镜像
MAINTAINER镜像维护者的姓名和邮箱地址
RUN容器构建时需要运行的命令
EXPOSE当前容器对外暴露的端口
WORKDIR指定在容器创建后,终端默认登陆成功进入的工作目录
ENV用来在构建镜像过程中设置环境变量
ADD将宿主机目录下的文件拷贝进镜像,且ADD命令会自动处理URL及解压tar包
COPY拷贝文件和目录到镜像中。两种写法:COPY src dest或COPY[“src”,“dest”]
VOLUME容器数据卷,用于数据保存和持久化工作
CMD指定一个容器启动时要运行的命令。Dockerfile中可有多个CMD指令,但只有最后一个生效,CMD会被docker run后面指定的参数替换
ENTRYPOINT指定一个容器启动时要运行的命令。它的目的和CMD一样,都是在指定容器启动程序及参数
ONBUILD当构建一个被继承的Dockerfile时运行的命令,父镜像在被子继承后,父镜像的OBBUILD被触发
6.2.2.3 案例演示

以下以centos为基础镜像,自定义一个tomcat镜像,主要实现功能:安装vim编辑器、修改登陆成功默认进入目录、配置环境变量等。

  • 首先在本地宿主机,新建目录~/mydocker/tomcat8,用于放置本次构建镜像需要的内容;
  • 准备jdk1.8-linux版本、tomcat-linux版本的tar包放置于上一步新建的目录下;
  • 新建test_copy.txt文件,用于测试COPY指令,再新建一个Dockerfile文件:
    在这里插入图片描述
  • 在Dockerfile中添加内容:
    FROM centos
    MAINTAINER chavaer<njchen_08@126.com>
    
    # 把宿主机当前上下文的test_copy.txt拷贝到容器/usr/local/路径下
    COPY test_copy.txt /usr/local/test_copy.txt
    
    #把jdk与tomcat添加到容器中
    ADD jdk-8u11-linux-x64.tar.gz /usr/local/
    ADD apache-tomcat-8.5.54.tar.gz /usr/local/
    
    # 安装vim编辑器
    RUN yum -y install vim
    
    # 设置工作访问时候的WORKDIR路径,登录后默认进入的目录
    ENV MYPATH /usr/local
    WORKDIR $MYPATH
    
    #配置jdk与tomcat环境变量
    ENV JAVA_HOME /usr/local/jdk1.8.0_11
    ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.54
    ENV CATALINA_BASE /usr/local/apache-tomcat-8.5.54
    ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
    
    # 设置容器运行时监听的端口
    EXPOSE 8080
    
    # 容器启动时运行tomcat
    CMD /usr/local/apache-tomcat-8.5.54/bin/startup.sh && tail -f /usr/local/apache-tomcat-8.5.54/logs/catalina.out
    
  • 在Dockerfile同级目录下执行构建镜像的指令:docker build -t chava/tomcat8:2.0 .。注:-t后参数表示生成新镜像的名称及版本,"."表示当前路径,这里实际需要一个上下文路径。Dockerfile中的指令都执行完成后,查看本地镜像docker images,自定义tomcat已构建成功。
    在这里插入图片描述
    在这里插入图片描述
  • 运行上一步构建成功的容器:docker run -d -p 8081:8080 --name mytomcat8 -v ~/mydocker/tomcat8/test:/usr/local/apache-tomcat-8.5.54/webapps/test -v ~/mydocker/tomcat8/logs/:/usr/local/apache-tomcat-8.5.54/logs --privileged=true chava/tomcat8:2.0。注:–privileged=true用于解决可能出现的cannot open directory .: Permission denied问题。查看容器已在正常运行,端口8081也可正常访问:http://localhost:8081。
    在这里插入图片描述
    在这里插入图片描述
  • 进入容器,查看自定义的功能均已实现。
    在这里插入图片描述
  • 测试:在宿主机的共享目录test下,新建WEB-INF目录,然后新建web.xml文件,完成配置:
    在这里插入图片描述
    <?xml version="1.0" encoding="UTF-8"?>
    
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    
      xmlns="http://java.sun.com/xml/ns/javaee"
    
      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    
      id="WebApp_ID" version="2.5">
    
      <display-name>test</display-name>
    
     </web-app>
    
  • 在test目录下新建index.html:
    在这里插入图片描述
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    
    <html>
      <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Insert title here</title>
      </head>
      <body>
        <h3>Hello World!</h3>
      </body>
    </html>
    
  • 从浏览器访问:http://localhost:8081/test/index.html。刚刚在宿主机中新添加的页面直接可以访问。
    在这里插入图片描述
  • 直接编辑index.html文件,再次访问,修改内容可直接同步更新。
    在这里插入图片描述
    在这里插入图片描述

7. Docker镜像发布

7.1 构建SpringBoot应用镜像

7.1.1 准备

  • 将SpringBoot项目打包成可执行jar包:
    在这里插入图片描述
  • 将该jar包放入~/mydocker/demo目录下,便于后面进行镜像的构建。

7.1.2 构建

  • 新建Dockerfile文件,并写入内容:
    # 指定基础镜像,本地没有会从dockerHub pull下来 
    FROM java:8
    
    # 将可执行jar包复制到基础镜像的根目录下
    ADD docker_demo-0.0.1-SNAPSHOT.jar /docker_demo-0.0.1-SNAPSHOT.jar
    
    # 镜像要暴露的端口,若要使用,在执行docker run命令时使用-p生效 
    EXPOSE 80
    
    # 在镜像运行为容器后执行的命令
    ENTRYPOINT ["java","-jar","/docker_demo-0.0.1-SNAPSHOT.jar"]
    
  • Dockerfile放在~/mydocker/demo目录下,与可执行jar包同级:
    在这里插入图片描述
  • 使用docker build命令构建镜像:docker build -f Dockerfile -t chava/docker-demo:1.0 .。注:-f指定Dockerfile的路径与名称,-t指定生成镜像的名称与TAG,"."表示当前目录,这里实际需要指定一个上下文路径。构建完成,查看本地镜像docker images,发现构建成功。
    在这里插入图片描述

7.1.3 运行

  • 执行运行指令:docker run -d --name docker-demo -p 7070:8080 chava/docker-demo:1.0
    在这里插入图片描述
  • 浏览器访问:http://localhost:7070/
    在这里插入图片描述

7.2 发布镜像

7.2.1 本地镜像推送阿里云

  • 创建镜像仓库:https://cr.console.aliyun.com/cn-hangzhou/instances/repositories。淘宝或支付宝授权登录。
    在这里插入图片描述
    这里代码源选择本地仓库,可以通过命令行推送镜像到镜像仓库。也可选择GitHub,绑定GitHub账号。
    在这里插入图片描述
    创建镜像仓库完成后,可以查看该仓库的基本信息,以及推送镜像的操作指南。
    在这里插入图片描述
    在这里插入图片描述
  • 登录阿里云Docker Registry:docker login --username=chavaer registry.cn-hangzhou.aliyuncs.com。username是阿里云的登录用户名,输入密码,阿里云服务的登录密码,即可登陆成功。
    在这里插入图片描述
  • 打一个上传阿里云的tag:docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/chava/docker-demo:[镜像版本号]。镜像ID可以在本地查询后指定。后面的地址为“阿里云地址/命名空间/仓库名称:tag”。
    在这里插入图片描述
    确认打tag成功:
    在这里插入图片描述
  • 推送到阿里云远程仓库:docker push registry.cn-hangzhou.aliyuncs.com/chava/docker-demo:[镜像版本号]
    在这里插入图片描述
    查看推送成功:
    在这里插入图片描述

7.2.2 下载镜像

  • 首先将上一节生成的本地镜像删除:docker rmi -f 镜像ID。查看删除成功。
    在这里插入图片描述
  • 拉取阿里云上已上传的镜像:docker pull registry.cn-hangzhou.aliyuncs.com/chava/docker-demo:1.0。本地仓库有镜像层缓存,因此拉取较快。可查看拉取成功。
    在这里插入图片描述
  • 运行:docker run -d --name ali-docker-demo -p 7777:8080 3e39466a3803
    在这里插入图片描述
    查看运行成功,可在浏览器访问:http://localhost:7777/,可以正常访问。
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值