[docker]入门

本文章主要讲述的是,docker基本实现原理,docker概念的解释,docker的使用场景以及docker打包与部署的应用。

文章中docker所运行的系统:CentOS Linux release 7.9.2009 (Core)

目录

docker是什么,什么时候需要去使用

介绍

使用场景

部署多个环境

解决资源共享以及环境复杂的问题

快速上线与项目的回滚

docker相关概念

架构

client客户端

host主机

daemon守护进程

image镜像

contain容器

registry仓库

docker镜像的制作

编写dockerfile

生成依赖文件

docker容器的运行


docker是什么,什么时候需要去使用

介绍

docker是一个应用容器引擎,允许将一个应用程序和其所需的所有依赖打包到一个单元中,且底层架构以及其他单元进行隔离。

使用场景

部署多个环境

需要对同一个项目部署多个环境(像是有开发环境,测试环境,生产环境),在对一个项目打包之后就减少了很多手动配置管理的出错可能。

方便的进行部署,且不会出错。因为项目所需的所有依赖都打进了包中了,只需要下载再启动即可。

解决资源共享以及环境复杂的问题

docker当中会有一个叫仓库的概念,可以将打包好的程序和依赖上传到仓库中。不同服务器之间,只需要访问同一个仓库,对所需的包进行拉取即可。

++依赖:像是我在windows写好了一个java程序,想要部署到一个云服务器上进行运行,让外部人员进行访问。那我就还要在云服务器上下载java,然后再进行运行等操作++

而对于一些大型的项目,其环境往往是很复杂的。如果对于不同的操作系统,可能就要手动的将项目的依赖重新yum一遍,容易出错且耗时长。如果使用docker将项目和依赖打包后就不会出现这样的问题

快速上线与项目的回滚

在实际的开发中,可能需要常常的进行功能的优化或者版本的迭代。使用docker对项目进行打包就可以实现快速的安装。

docker支持对打包好的单元打上标签,

像是v1和v2,例如v2对于v1来说是一次大版本的迭代与更新,部署到生产环境上可能会有问题的出现。

那就可以使用docker将v1和v2版本都先部署起来,将v1暂停,v2对外开放。当v2出错接受到告警的时候可以直接将v2暂停,v1重新开放。实现快速的回滚也影响生产环境的使用。

docker相关概念

架构

docker使用c/s架构模式(客户端-服务器),使用远程API来管理和创建容器。容器则根据镜像而创建

下面的流程主要是(以run命令为例):

  1. 用户输入docker run hello-world,从客户端发送到主机的daemon中
  2. daemon在主机中查看本地镜像存储是否有hello-world这个镜像。如果有,则根据本地存储中的镜像去创建容器。
  3. 如果没有则去docker仓库中查看是否有hello-world这个镜像,有则把此镜像从仓库拉取到本地镜像存储当中
  4. 然后再去根据刚刚拉下来的hello-world去创建一个容器运行

client客户端

在本地使用dockerAPI与主机中daemon进行通信的工具

host主机

一个物理机或者虚拟机,用来执行docker-daemon与容器

daemon守护进程

docker服务的核心组件,docker最核心的后台进程

image镜像

用于创建容器的模板

contain容器

一个独立运行的一个或一组应用

镜像与容器的关系有点类似于java中的类与对象

registry仓库

用来保存与管理镜像的,类似于github或者gitee之类的代码管理平台。

有官方的,也有自己私人搭建的

docker镜像的制作

镜像的制作有两种方法:

  1. 对本地的镜像进行更新,再重新commit上去形成一个新的镜像
  2. 使用dockfile去创建一个新的镜像

这里说明的流程是直接去创建一个新的镜像。

以python中flask项目为例,制作一个镜像上传到docker image当中

首先是项目的文件结构

编写dockerfile

dockerfile是一个文本文件,没有后缀。是存放着参数与方法去指导docker daemon根据dockerfile创建一个镜像。

XML 复制代码
# FROM是使用一个基础镜像,此处选择的是带有python3.11版本的镜像
FROM python:3.11

# 将当前目录下的test复制到容器中的/docker_test目录下
COPY ./test/ /docker_test/

# 指定一个工作目录/docker_test. 工作目录:在容器当中,进入到某一个路径中去执行后面的指令
WORKDIR /docker_test

# 在工作目录/docker_test下执行run执行,run指令可以有多条
# 安装项目所需的依赖
RUN pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/

# 声明容器可能会使用的端口为5000与宿主机进行通信
EXPOSE 5000

# 使用CMD指令中的exec格式去运行下面的指令
# 运行python指令,参数为app.py
# 即在工作目录下执行python app.py指令
CMD ["python", "app.py"]

生成依赖文件

在pycharm的终端中执行pip freeze > requirement.txt生成依赖文件

连着虚拟环境一起打成压缩包上传到centos7当中 然后进行解压

使用docker build命令去创建一个镜像

对于下面docker build命令的解析

docker build是docker中创建镜像的命令

-t参数是对这个镜像进行命名,命名为my_flask_image

后面这个path参数是指dockerfile文件的参数,因为dockerfile就在当前目录下,所以我指定了"."

XML 复制代码
docker build -t my_flask_image .

执行后使用docker images命令查看镜像是否创建好了

可以看到host中的本地镜像存储中已经有了我们刚刚制作好的镜像了。

docker容器的运行

容器是根据镜像创建出来的,相互间独立的实体。

通过docker run 镜像名/镜像ID

-i 让容器可进行交互

-t 让容器指定出一个终端

-d 让容器以后台模式进行运行

-p 容器端口:宿主机端口 用于容器与宿主机间的端口映射

根据刚刚创建出的镜像去运行容器,将容器中5000端口映射到宿主机的5000端口中,这样路径为宿主机IP:5000的时候就可以访问这个flask项目创建出的页面了

相关推荐
wclass-zhengge34 分钟前
K8S篇(基本介绍)
云原生·容器·kubernetes
颜淡慕潇40 分钟前
【K8S问题系列 |1 】Kubernetes 中 NodePort 类型的 Service 无法访问【已解决】
后端·云原生·容器·kubernetes·问题解决
川石课堂软件测试3 小时前
性能测试|docker容器下搭建JMeter+Grafana+Influxdb监控可视化平台
运维·javascript·深度学习·jmeter·docker·容器·grafana
昌sit!9 小时前
K8S node节点没有相应的pod镜像运行故障处理办法
云原生·容器·kubernetes
追风林10 小时前
mac 本地docker-mysql主从复制部署
mysql·macos·docker
A ?Charis11 小时前
Gitlab-runner running on Kubernetes - hostAliases
容器·kubernetes·gitlab
城南vision12 小时前
Docker学习—Docker核心概念总结
java·学习·docker
wclass-zhengge12 小时前
Docker篇(Docker Compose)
运维·docker·容器
北漂IT民工_程序员_ZG12 小时前
k8s集群安装(minikube)
云原生·容器·kubernetes
梦魇梦狸º15 小时前
腾讯轻量云服务器docker拉取不到镜像的问题:拉取超时
docker·容器·github