Docker镜像的制作

316 阅读8分钟

一、应用部署的演化

1、最初的应用部署

部署一个应用;安装配置依赖的环境;运行应用程序。

出现的问题:

  1. 要部署多个应用,但是依赖有冲突;
  2. 某些应用自身的问题影响到别的应用等等需要隔离运行环境的场景。

2、使用虚拟机技术

支持部署多个应用;应用间互不影响;解决了不同应用间需要进行隔离的问题。

出现的问题:

  1. 每台虚拟机依旧需要准备应用所依赖的环境;

  2. 虚拟机资源消耗大,需要分配单独的内存与磁盘空间;

  3. 部署简单地应用也得安装完整的操作系统,资源浪费,启动停止速度慢;

3、使用容器技术

使用容器或者将容器与虚拟机配合使用的形式,为应用的部署和管理提供极大的灵活性。容器技术作为云原生的基石,其早在20年前就已诞生,近些年经历了飞速发展的黄金时期。而Docker容器作为容器家族的一员,目前占有极大地市场份额,是目前最流行的容器,而且它还将流行很长一段时间。

二、Docke简介

1、Docker是什么

Docker公司:

原名dotCloud,起初是一家Paas提供商,于2013年初开发出Docker相关技术及产品。 公司于2013年底改名为Docker Inc,目前是全球最大的Docker容器服务提供商。公司网站www.docker.com。

Docker开源项目:

Docker也用于指代开源Docker项目,该项目是基于Go语言实现的容器项目。目前已形成了由多个开源项目(Swarm、Moby等)围绕Docker容器的完整生态体系。

Docker引擎:

技术人员在谈到Docker时,一般是指Docker引擎。也可以简单地理解为一种运行在Linux、Windows上的软件,用于创建、编排和管理Docker容器。 Docker引擎主要有两个版本:企业版(EE)和社区版(CE)

2、为什么使用Docker

更快速的交付和部署:

开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。

更高效的资源利用:

运行Docker容器不需要额外的虚拟化管理程序,对系统资源的利用率更高,无论是应用执行速度,内存消耗以及文件存储速度,都要比传统虚拟机技术更高效。

更轻松的迁移和扩展:

由于Docker确保了执行环境的一致性,Docker容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑等,同时支持主流的操作系统发行版本。这种兼容性可以让用户在不同的平台间轻松完成迁移

与虚拟机比较的优势:

优势
资源消耗少Docker在操作系统级别进行虚拟化,Docker容器和内核交互,几乎没有性能损耗,性能优于通过Hypervisor层与内核层的虚拟化。
先进的设计理念Docker通过类似Git的设计理念来方便用户获取、分发和更新应用镜像、存储复用、增量更新
速度快Docker容器的启动停止可以在秒级实现,相较于传统的虚拟机方式(数分钟)要快很多。

三、Docker核心概念

Docker镜像:

镜像是Docker容器创建的基础,是一个只读的文件和文件夹的组合

Docker容器:

容器可以看作是镜像的运行实体,镜像是静态的只读文件,而容器运行着真正的应用进程

Docker仓库:

类似于代码仓库,镜像仓库用于存储和分发Docker镜像。镜像仓库有公有和私有两种类型

镜像、容器和仓库之间的关系

image.png

四、Docker安装

以下是Windows桌面版安装步骤

下载地址:www.docker.com/products/do…

下载完成后双击进入安装界面

image-20211019174432761

点击OK,进入安装过程,等待安装完成

image-20211019174644836

安装完成后,需要重启系统

image-20211019174713793

运行docker desktop

首次运行需要安装WSL2升级。根据引导的链接网页步骤安装即可。完成后,使用CMD命令行窗口即可运行docker命令。

image-20211019174823284

配置私有镜像仓库地址

image-20211019174844210

五、Dockerfile

1、Dockerfile简介

什么是Dockerfile:

Dockerfile是一个文本格式的配置文件,其内容由若干指令和注释说明构成,用户可以使用Dockerfile开快速创建自定义的镜像

Dockerfile的基本结构:

一个典型的Dockerfile应当包含四个部分:基础镜像信息、维护者信息、镜像操作指令、容器启动指令

2、Dockerfile指令说明

配置指令

指令说明
ARG定义创建镜像过程中使用的变量
FROM指定所创建镜像的基础镜像
LABEL为生成的镜像添加元数据标签信息
EXPOSE声明镜像内服务监听的端口
ENV指定环境变量
ENTRYPOINT指定镜像的默认入口命令
VOLUME创建一个数据卷挂载点
USER指定运行容器时的用户名或者UID
WORKDIR配置工作目录
ONBUILD创建子镜像时指定自动执行的操作指令
STOPSIGNAL指定退出的信号值
HEALTHCHECK配置所启动容器如何进行健康检查
SHELL指定默认的shell类型

操作指令

指令说明
RUN运行指定命令
CMD启动容器时指定默认执行的命令
ADD添加内容到镜像
COPY复制内容到镜像

参考资料(Dockerfile详解):

www.runoob.com/docker/dock…

www.jianshu.com/p/11acd4036…

zhuanlan.zhihu.com/p/90437739

六、Docker镜像制作

1、docker build命令

使用dockerfile制作镜像

docker build [参数选项] 镜像名:标签

demo:

docker build --no-cache -f mydemo_dockerfile -t mydemo_images:20211019 

参数说明:

  • --no-cache:创建镜像的过程不使用缓存

  • -f:指定要使用的Dockerfile路径,不指定默认寻找当前目录下的Dockerfile

  • -t:--tag的简写,构建镜像时为镜像指定名称和标签

PS:注意命令末尾有一个点号,这个点号的作用是指定镜像构建过程中的上下文环境的目录

参考资料:www.runoob.com/docker/dock…

2、docker images命令

列出本地镜像列表

docker images

列表展示信息说明:

image-20211019181006370

参考资料:www.runoob.com/docker/dock…

七、Docker容器的操作

1、docker run命令

使用镜像生成并启动容器

docker run [参数选项] 镜像名:标签

demo:

docker run -p 8008:8080 -d --name mydemo_container mydemo_images:20211019 

命令解释:

使用镜像`mydemo_images:20211019`运行一个名为`mydemo_container`的容器,并将该容器的`8080`端口映射到宿主机的`8008`端口

参数说明:

  • -p:指定端口映射,格式为:主机(宿主)端口**:**容器端口
  • -d:后台运行容器,并返回容器ID
  • --name:为容器指定名称
  • -v:挂载文件夹或者文件

参考资料: www.runoob.com/docker/dock…

2、docker ps命令

查看(运行中的)容器列表

docker ps

参数说明:

  • -a:查看所有容器列表,包括未运行的

列表展示说明:

image-20211019183034713

参考资料: www.runoob.com/docker/dock…

3、docker logs命令

查看指定容器的日志

docker logs [参数选项] 容器ID

参数说明:

  • --tail:仅列出最新的N条日志。示例:--tail=10 列出最新的10条日志

参考资料: www.runoob.com/docker/dock…

4、docker exec 命令

进入指定容器

docker exec [参数选项] 容器ID COMMAND [ARG...]

demo示例:

docker exec -it 875f4ff0e597 /bin/bash

PS:退出容器可以使用命令exit或者快捷键:先Ctrl+P再Ctrl+Q。两种方式都可以退出并保持容器的运行

参考资料: www.runoob.com/docker/dock…

5、docker start/stop/restart 命令

启动/停止/重启 一个或者多个容器

docker start/stop/restart 容器ID1 容器ID2 容器ID3 

参考资料: www.runoob.com/docker/dock…

6、docker rm命令

删除一个或多个容器

docker rm  [参数选项] 容器ID1 容器ID2...

参数说明:

  • -f:强制删除(运行中的)容器,不加该参数删除运行时的容器会提示错误
  • -l : 移除容器间的网络连接,而非容器本身。
  • -v : 删除与容器关联的卷。

参考资料: www.runoob.com/docker/dock…

7、docker rmi命令

删除本地一个或多个镜像

docker rmi [参数选项] 镜像ID1 镜像ID2...

参数说明:

  • -f:强制删除
  • --no-prune : 不移除该镜像的过程镜像,默认移除;

参考资料: www.runoob.com/docker/dock…

Docker命令大全: www.runoob.com/docker/dock…