容器(Docker)学习心得

容器(Docker)学习心得

一、容器是什么

顾名思义,容器可以称之为一种箱子,或者是称之为集装箱。箱子的主要功能有两个,隔离箱子内外的环境、将箱子内的物品完整传输到另一个地方,Docker的作用同样如此,隔离容器内外的环境、将容器内的程序完整传输到另一个地方

1、隔离容器内外的环境

隔离容器内外的环境是指对于同一台主机中不同Docker中的程序,其资源独立且不能共享,包括文件资源、CPU资源、内存资源等。因此,每个Docker会给应用程序造成一种运行在真是主机中环境的假象。

举个例子,如果有学过Python的同学,应该了解对于不同的程序,每个程序都有自己的依赖环境。假如说现在有个A程序依赖一个Http组件,该版本为2.0版本,当我们运行时下载安装即可完成对应的功能。但是当我们需要运行另一个程序B时,该程序也依赖于Http组件,不过与A程序不同的是,B程序依赖的Http组件是3.0版本。那么问题就来了,当我们运行B程序时,需要将2.0版本卸载,重新安装3.0版本,当运行A程序时,需要将3.0版本卸载,重新安装2.0版本才能保证程序的正常运行。

此时Docker的作用就体现出来了,他可以从系统级别隔离两个程序(当然不是真正的隔离,从物理角度来说,这些只是主机中的两个进程,只不过使用虚拟化的技术使这些程序误以为自己都是在真实的环境中)。因此当我们使用Docker时,只需在对应的Docker中安装程序即可。当需要安装A程序时,我们启动一个Docker,并在其中安装好对应Http2.0版本。当需要安装B程序时,启动另一个Docker,安装对应的Http3.0版本。这样一来,每个程序都可以在自己的Docker中完成自己的业务,而不需要考虑环境混乱的问题。

因此,容器的一个重要作用就是隔离容器内外的环境。

2、将容器内的物品完整传输到另一个地方

同样举个例子,当我们需要在集群中进行程序部署时(即在100台机器上同时部署A程序,达到高可用的目的),正常的操作应该是,对于第一台机器安装Http2.0环境、安装A程序,对于第二台机器安装Http2.0环境、安装A程序…,如果我们有一百台机器的话,我们需要重复100遍这样的操作,而且操作中还极有可能出错。

如果使用容器的思想,我们只需在Docker中安装好Http2.0环境、安装好A程序,然后将该镜像Push到仓库中,在其他99台机器中,执行Pull命令,拉取到该镜像并运行,即可达到我们前面所需的功能。

因此,容器的另一个重要的作用就是将容器内的物品完整传输到另一个地方。

二、Image(镜像)与Container(容器)的概念

当我们准备好容器内所用的资源时,使用docker build命令将资源打包成一份镜像,同时可以将此镜像上传到仓库中,在有需求的地方拉取镜像。当每台主机都拥有这份镜像后,使用docker run命令将镜像运行起来,此时就会有对应的一个Container。

Image(镜像)与Container(容器)的概念可以类比面向对象语言中类与对象的关系,Image对应类,Container对应对象,Container是Image的实例,一个Image可以有多个Container。

三、Docker与虚拟机的对比

VM(VMware)在宿主机器、宿主机器操作系统的基础上创建虚拟层、虚拟化的操作系统、虚拟化的仓库,然后再安装应用;

Container(Docker容器),在宿主机器、宿主机器操作系统上创建Docker引擎,在引擎的基础上再安装应用。

那么问题来了,没有操作系统,怎么运行程序?

可以在Docker中创建一个ubuntu的镜像文件,这样就能将ubuntu系统集成到Docker中,运行的应用就都是ubuntu的应用。

img

四、DockerFile

当我们需要构建一个Image时,那Docker怎么知道我们需要那个操作系统的镜像或者是这么在操作系统镜像中部署我们的应用程序呢?这个时候需要一份文件来告诉Docker我们需要的镜像怎么操作,这份文件就是DockerFile。也可以将它理解为一个脚本文件,既在容器创建时,需要执行那些操作。

#使用jdk8作为基础镜像
FROM java:8
#指定作者
MAINTAINER Hkkkk
#暴漏容器的8091端口
EXPOSE 8091
#将复制指定的ruoyi-admin.jar为容器中的job.jar,相当于拷贝到容器中取了个别名
ADD ruoyi-admin.jar /ruoyi.jar
#创建一个新的容器并在新的容器中运行命令
RUN bash -c 'touch /ruoyi.jar'
#设置时区
ENV TZ=PRC
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
#相当于在容器中用cmd命令执行jar包  指定外部配置文件
CMD ["java","-jar","ruoyi.jar"]

这就是一份较为简单的Java SpringBoot的部署文件,从中可以看出主要是指定了jdk1.8的版本、作者、该容器对外暴露的端口号(应该与程序暴露的端口号一致),然后将对应.jar资源文件复制到容器中,最后使用cmd命令运行该jar包。

DockerFile的基本命令。

在Dockerfile中用到的命令有
FROM
    FROM指定一个基础镜像, 一般情况下一个可用的 Dockerfile一定是 FROM 为第一个指令。至于image则可以是任何合理存在的image镜像。
    FROM 一定是首个非注释指令 Dockerfile.
    FROM 可以在一个 Dockerfile 中出现多次,以便于创建混合的images。
    如果没有指定 tag ,latest 将会被指定为要使用的基础镜像版本。
MAINTAINER
    这里是用于指定镜像制作者的信息
RUN
    RUN命令将在当前image中执行任意合法命令并提交执行结果。命令执行提交后,就会自动执行Dockerfile中的下一个指令。
    层级 RUN 指令和生成提交是符合Docker核心理念的做法。它允许像版本控制那样,在任意一个点,对image 镜像进行定制化构建。
    RUN 指令缓存不会在下个命令执行时自动失效。比如 RUN apt-get dist-upgrade -y 的缓存就可能被用于下一个指令. --no-cache 标志可以被用于强制取消缓存使用。
ENV
    ENV指令可以用于为docker容器设置环境变量
    ENV设置的环境变量,可以使用 docker inspect命令来查看。同时还可以使用docker run --env <key>=<value>来修改环境变量。
USER
    USER 用来切换运行属主身份的。Docker 默认是使用 root,但若不需要,建议切换使用者身分,毕竟 root 权限太大了,使用上有安全的风险。
WORKDIR
    WORKDIR 用来切换工作目录的。Docker 默认的工作目录是/,只有 RUN 能执行 cd 命令切换目录,而且还只作用在当下下的 RUN,也就是说每一个 RUN 都是独立进行的。如果想让其他指令在指定的目录下执行,就得靠 WORKDIR。WORKDIR 动作的目录改变是持久的,不用每个指令前都使用一次 WORKDIR。
COPY
    COPY 将文件从路径 <src> 复制添加到容器内部路径 <dest>。
    <src> 必须是想对于源文件夹的一个文件或目录,也可以是一个远程的url,<dest> 是目标容器中的绝对路径。
    所有的新文件和文件夹都会创建UID 和 GID 。事实上如果 <src> 是一个远程文件URL,那么目标文件的权限将会是600。
ADD
    ADD 将文件从路径 <src> 复制添加到容器内部路径 <dest>。
    <src> 必须是想对于源文件夹的一个文件或目录,也可以是一个远程的url。<dest> 是目标容器中的绝对路径。
    所有的新文件和文件夹都会创建UID 和 GID。事实上如果 <src> 是一个远程文件URL,那么目标文件的权限将会是600。
VOLUME
    创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。
EXPOSE
    EXPOSE 指令指定在docker允许时指定的端口进行转发。

CMD
    Dockerfile.中只能有一个CMD指令。 如果你指定了多个,那么最后个CMD指令是生效的。
    CMD指令的主要作用是提供默认的执行容器。这些默认值可以包括可执行文件,也可以省略可执行文件。
    当你使用shell或exec格式时,  CMD 会自动执行这个命令。
ONBUILD
    ONBUILD 的作用就是让指令延迟執行,延迟到下一个使用 FROM 的 Dockerfile 在建立 image 时执行,只限延迟一次。
    ONBUILD 的使用情景是在建立镜像时取得最新的源码 (搭配 RUN) 与限定系统框架。
ARG
    ARG是Docker1.9 版本才新加入的指令。
    ARG 定义的变量只在建立 image 时有效,建立完成后变量就失效消失
LABEL
    定义一个 image 标签 Owner,并赋值,其值为变量 Name 的值。(LABEL Owner=$Name )

ENTRYPOINT
    是指定 Docker image 运行成 instance (也就是 Docker container) 时,要执行的命令或者文件。
    我自己的Dockerfile文件内容如下:

五、Docker的基本命令与使用Docker发布一个SpringBoot应用

1.Docker安装

访问Get Started with Docker | Docker下载对应的Docker桌面版。

点击下一步一致安装即可。这里使用windos下的Docker,Linux下同理。

2.打开CMD

输入docker --version查看是否安装成功。

3.构建Image镜像

3.1 将打包好的jar包与上述DockerFile文件放在同一个目录下。

在这里插入图片描述

3.2 从目录进入cmd。

在这里插入图片描述

3.3 键入docker build -t javademo .构建一个tag为javademo的镜像。

在这里插入图片描述

3.4 docker images 查看构建好的镜像

在这里插入图片描述

4.将构建好的iamges push到远程仓库。

4.1 点击Docker Hub注册一个DockerHub账号。

4.2 使用docker login -u <username> - p <password>登录到远程仓库。(因为这个仓库是官方的镜像仓库在国外,所以可能push pull都会很慢甚至失败,可以使用科技上网或者上传到国内的仓库。)

在这里插入图片描述

4.3 修改镜像名字为username/javademo,因为上传镜像需要加上前缀,否则会失败

docker image tag javademo kai2000922/javademo 这里需替换成自己的用户名

4.4 push

docker push kai2000922/javademo

在这里插入图片描述

这里有些是Mounted是因为之前有些镜像已经push到了docker hub所以会直接使用本地的。

5.从所需要的地方拉取image

这里演示从远程服务器拉取该镜像并运行。

5.1 查看本地镜像。

在这里插入图片描述

可以看到是没有我们Hub里的镜像的

5.2 登录到docker hub

docker login -u <username> - p <password>

5.3 拉取镜像

docker pull kai2000922/javademo

在这里插入图片描述

docker images

在这里插入图片描述

可以看到已经有了该镜像。

6.运行该镜像

6.1 运行镜像

docker run --name javacontainer -d kai2000922/javademo

运行命名为 kai2000922/javademo 的镜像,并重命名为javacontainer,-d代表在后台运行。

docker ps查看所有运行中的镜像。

在这里插入图片描述

可以看到 这些信息都与我们所预期一致。

6.2 进入到镜像内部

docker exec -it 0692f302dc0a bin/bash //其中0692xxx对应运行起来的container id。

在这里插入图片描述

可以看到其实docker的内部相当于也是一个操作系统,只不过比虚拟机小得多,这也与我们一开始所描述的相一致。

至此,一个完整的java应用使用docker部署成功!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值