为什么要引入docker?(项目部署的问题)
大型项目组件较多,运行环境也较为复杂,部署时会碰到一些问题:
Docker如何解决依赖的兼容问题的?
将应用的Libs(函数库)、Deps(依赖)、配置与应用一起打包
将每个应用放到一个隔离容器去运行,避免互相干扰
Docker是一种开源平台,用于自动化应用程序的部署、扩展和管理。它使用容器化技术,使开发人员能够将应用程序及其依赖项打包到一个称为容器的独立单元中。这个容器包含应用程序的所有必要组件,如代码、运行时、系统工具、库等,确保应用程序在任何环境中都能一致地运行。
Docker的核心概念包括:
容器: Docker容器是轻量级、可移植的执行单元,包含应用程序及其依赖项。容器隔离了应用程序和底层系统,确保应用程序能够在不同的环境中以相同的方式运行。
镜像: Docker镜像是容器的基础,它是一个只读的模板,包含了运行容器所需的文件系统、运行时、库等信息。镜像可以被共享、复制,用于创建容器实例。
仓库: Docker仓库是用于存储和分享Docker镜像的地方。它可以是公共的,如Docker Hub,也可以是私有的,由组织或个人管理。
Dockerfile: Dockerfile是一个文本文件,包含了一系列的指令,用于自动化构建Docker镜像。它描述了镜像的内容和配置。
Docker的优势包括快速部署、跨平台性、资源隔离、易于扩展等。它在开发、测试和生产环境中都得到了广泛的应用,为应用程序的交付和运维提供了更便捷、可靠的方式。
Docker如何解决不同系统环境的问题?
Q&A
1.Docker如何解决大型项目依赖关系复杂,不同组件依赖的兼容性问题?
2.Docker如何解决开发、测试、生产环境有差异的问题?
Docker和虚拟机的差异:
镜像(Image):Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。
容器(Container):镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器做隔离,对外不可见。
DockerHub:DockerHub是一个Docker镜像的托管平台。这样的平台称为Docker Registry。
国内也有类似于DockerHub 的公开服务,比如 网易云镜像服务、阿里云镜像库等。
Docker是一个CS架构的程序,由两部分组成:
服务端(server):Docker守护进程,负责处理Docker指令,管理镜像、容器等
镜像操作:
具体的操作细节可以使用–help命令查看
容器相关命令大致如下:
步骤一:去docker hub查看Nginx的容器运行命令
docker run --name containerName -p 80:80 -d nginx
命令解读:
docker run命令的常见参数:
– --name:指定容器名称
-p:指定端口映射
-d:让容器后台运行
查看容器日志的命令:
docker logs
添加 -f 参数可以持续查看日志
查看容器状态(添加-a参数查看所有状态的容器):
docker ps
删除容器:
docker rm
不能删除运行中的容器,除非添加 -f 参数
进入容器(exec命令可以进入容器修改文件,但是在容器内修改文件是不推荐的):
docker exec -it [容器名] [要执行的命令]
容器与数据耦合的问题
数据卷(volume)是一个虚拟目录,指向宿主机文件系统中的某个目录。
数据卷的作用:将容器与数据分离,解耦合,方便操作容器内数据,保证数据安全
数据卷与容器关联后又与宿主机文件系统关联,这样就能做到在宿主机文件系统的修改映射到容器内部的修改(数据卷相当于宿主机文件系统和容器的桥梁)
数据卷操作的基本语法如下:
docker volume [COMMAND]
docker volume命令是数据卷操作,根据命令后跟随的command来确定下一步的操作:
挂载数据卷
我们在创建容器时,可以通过 -v 参数来挂载一个数据卷到某个容器目录(具体要挂载在容器的哪个文件夹下需要去DockerHub查看)
数据卷挂载方式:
-v volumeName: /targetContainerPath
如果容器运行时volume不存在,会自动被创建出来
宿主机目录直接挂载到容器
目录挂载与数据卷挂载的语法是类似的:
-v [宿主机目录]:[容器内目录]
-v [宿主机文件]:[容器内文件]
数据卷挂载的方式对比
总结:
1.docker run的命令中通过 -v 参数挂载文件或目录到容器中:
2.数据卷挂载与目录直接挂载的
镜像结构
镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成。
具体包括:
入口(Entrypoint)
镜像运行入口,一般是程序启动的脚本和参数
层( Layer )
在BaseImage基础上添加安装包、依赖、配置等,每次操作都形成新的一层。
基础镜像(BaseImage)
应用依赖的系统函数库、环境、配置、文件等
什么是Dockerfile?
Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer。
基础镜像可以是基本操作系统,如Ubuntu。也可以是其他人制作好的镜像,例如:java:8-alpine
什么是DockerCompose?
Docker Compose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器!
Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。
常见镜像仓库服务
镜像仓库( Docker Registry )有公共的和私有的两种形式:
小结:
1.推送本地镜像到仓库前都必须重命名(docker tag)镜像,以镜像仓库地址为前缀
2.镜像仓库推送前需要把仓库地址配置到docker服务的daemon.json文件中,被docker信任
3.推送使用docker push命令
4.拉取使用docker pull命令