文章目录
- 前言
- 一、什么是Docker?
- 二、为什么选择Docker
- 三、Docker的基本组成
- 四、Docker的安装
- 五、Docker的常用命令
- 六、DockerFile
- 什么是DockerFile?
- 六、Docker volume
- 什么是Docker volume?
- 常用命令
- 总结
前言
随着云计算和微服务架构的兴起,软件开发和部署的方式正在经历一场革命。容器技术作为这场变革的关键驱动力之一,已经彻底改变了我们构建、部署和运行应用的方式。在众多容器技术中,Docker以其独特的优势和广泛的应用,成为业界的佼佼者。
Docker是一个开源的应用容器引擎,它允许开发者将应用及其依赖环境打包到一个轻量级、可移植的容器中,从而实现快速、一致地部署到任何流行的Linux机器上。Docker的核心优势在于其轻量级、快速部署、易于管理以及高度的可移植性。
一、什么是Docker?
2013年,Docker开源!
Docker是基于容器技术的轻量级虚拟化解决方案;
Docker 是一个用于开发、交付和运行应用程序的开放平台。 它使您能够将应用程序与基础架构分开,以便 您可以快速交付软件。使用Docker,您可以管理您的基础架构 以与管理应用程序相同的方式。通过利用 Docker 的 用于交付、测试和部署代码的方法,您可以 显著减少编写代码和在生产环境中运行代码之间的延迟。
二、为什么选择Docker
工作中大家一定遇到过这样的问题,我们开发环境、测试环境、生产环境需要保持一致性,传统方式需要我们花费大量的时间去维护,特别是涉及版本更新时,可能就会导致服务不可使用,后期我们维护多个环境的一致性就很繁琐;
在使用Docker之前,我们一般使用虚拟化技术进行维护,而不是一个个单独去维护;
虚拟化技术很多,如我们最常使用的VM,但是VM也有很多缺点,虚拟机的缺点:资源占用多,冗余步骤多,启动慢等;
这主要是由VM这类虚拟化技术的实现方式决定的,它通过软件模拟的具有完整、硬件、系统功能、运行在一个完全隔离环境中的完整计算机系统;而Docker是基于容器技术实现的虚拟化;
Docker与VM技术相比:
1.传统的虚拟机,可以虚拟出一条硬件,运行一个完整的操作系统,在这个操作系统上安装和运行所需的软件,容器内的应用可以直接运行在宿主 主机的内核中,容器没有自己的内核,也不用虚拟硬件,因此更加轻便;
2.Docker有着比虚拟机更少的抽象层,Docker利用的是宿主机的内核,vm需要是Guest OS。
3.每个容器是相互隔离的,每个容器内都有属于自己的文件系统,之间互不影响。
4.Docker在启动速度、性能、存储、可迁移性等多个方面具有较大优势,但是基于容器的虚拟化技术不会完全替代传统虚拟化技术,他们各有优势,只是在不同应用领域和场景的差别;
三、Docker的基本组成
下图是Docker的基本组成:
Docker 使用客户端-服务器体系结构(C/S架构)。
Docker 客户端与 Docker 守护程序,它负责构建、运行和 分发 Docker 容器。
Docker 客户端和守护程序可以 在同一系统上运行,也可以将 Docker 客户端连接到远程 Docker 守护 进程。
镜像(Image):
Docker镜像就想一个模板,与VM类比的理解,Docker镜像有点像我们使用VM时安装的系统镜像,我们可以通过这个模板来创建容器服务,ubuntu镜像==>ubuntu容器(提供服务器),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)。
容器(container):
Docker是基于镜像创建的实例,利用容器技术,独立运行一个或者一组应用 通过镜像来创建启动,停止,删除,基本命令!
仓库(registry):
仓库就是存放 镜像(image)的地方;
仓库又可以分为 公有仓库和私有仓库;
四、Docker的安装
Docker的目前支持Macos、Windows、Linux等不同系统,安装方法大致类似,这里不做赘述,大家可以通过如下链接进行安装
https://docs.docker.com/get-docker/
五、Docker的常用命令
5.1 帮助命令
1. docker version # 显示docker的版本信息
2. docker info #显示docker的系统信息,包括镜像和容器的数量
3. docker 命令 --help # 帮助命令
5.2 镜像命令
1.docker run (镜像名)# 加载镜像,创建容器
2.docker images -a # 显示所有镜像
3.docker search(要搜索镜像) #搜索镜像
4.docker pull(要下载镜像) #从registry上下载镜像
5.docker rmi -f (镜像id) #删除对应id的镜像
6.docker commit -m=“xxx“ 名称 #通过容器创建新的镜像
5.3 容器命令
1.docker ps -a #查看容器列表, 列出所有的容器
2.exit # 容器直接停止,并退出
3.ctrl+P+Q # 容器不停止,退出
4.docker rm 容器id # 删除容器(不能删除正在运行的容器)如果要强制删除:docker rm -f 容器id
5.docker start 容器id # 启动容器
6.docker restart 容器id # 重启容器
7.docker stop 容器id # 停止当前正在运行的容器
8.docker kill 容器id # 强制停止当前容器
9.docker exec -it 容器id #进入当前正在运行的容器
六、DockerFile
什么是DockerFile?
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
编写规则
- 文件名必须是 Dockerfile Dockerfile中所用的所有文件一定要和Dockerfile文件在同一级父目录下
- Dockerfile中相对路径默认都是Dockerfile所在的目录
- Dockerfile中一能写到一行的指令,一定要写到一行,因为每条指令都被视为一层,层多了执行效率就慢
- Dockerfile中指令大小写不敏感,但指令都用大写(约定俗成)
- Dockerfile 非注释行第一行必须是 FROM
- Dockerfile 工作空间目录下支持隐藏文件(.dockeringore),类似于git的.gitingore
当我们运行docker build命令时,docker 会为 dockerfile 中的每条指令构建一层。这些图像层是只读层。当我们运行docker run命令时,docker 会构建容器层,它们是读写层。
DockerFile中的指令会按照顺序执行,每条指令都会创建一个新的镜像层;
指令执行: Dockerfile 中的每条指令,如 FROM, RUN, COPY, ADD 等,都会创建一个新的层。
层的叠加: 这些层是只读的,并且是不可变的。当执行新的指令时,Docker 会在现有的镜像层之上添加新的层。
缓存机制: Docker 会缓存每一层的构建结果,如果后续的 Dockerfile 指令没有变化,Docker 会重用之前的层,这样可以节省大量的构建时间。
常用指令详解
解析一个DockerFile文件,构建了一个简单的Nginx服务器
# 使用官方nginx镜像作为基础镜像
FROM nginx:latest# 设置工作目录为容器内部的/var/www/html
WORKDIR /var/www/html# 将当前目录下的所有文件复制到工作目录中
COPY . .# 移除默认的nginx欢迎页面
RUN rm -f /etc/nginx/sites-enabled/default# 复制自定义的nginx配置文件
COPY nginx.conf /etc/nginx/conf.d/default.conf# 使自定义的index.html文件生效
RUN rm /var/www/html/index.html
COPY index.html /var/www/html/# 声明容器运行时监听的端口
EXPOSE 80# 启动nginx服务
CMD ["nginx", "-g", "daemon off;"]
这个Dockerfile的步骤解释如下:
FROM nginx:latest:指定基础镜像为nginx的最新版本。
WORKDIR /var/www/html:设置容器内的当前工作目录。
COPY . .:将当前目录下的所有文件复制到容器的工作目录。
RUN rm -f /etc/nginx/sites-enabled/default:删除nginx的默认配置文件。
COPY nginx.conf /etc/nginx/conf.d/default.conf:复制自定义的nginx配置文件到容器。
RUN rm /var/www/html/index.html:删除工作目录中的默认index.html文件。
COPY index.html /var/www/html/:复制自定义的index.html文件到容器的工作目录。
EXPOSE 80:声明容器需要暴露的端口,这里是80。
CMD [“nginx”, “-g”, “daemon off;”]:定义容器启动时执行的命令,这里启动nginx服务,并设置为前台运行。
请注意,你需要根据你的实际需求调整Dockerfile的内容。例如,如果你需要安装其他软件或服务,或者需要配置不同的环境变量,你需要添加相应的RUN指令来实现。此外,确保你的项目目录中包含nginx.conf和index.html文件,或者根据你的项目结构进行相应的调整。
六、Docker volume
什么是Docker volume?
Docker镜像被存储在一系列的只读层中。当我们创建一个容器时,Docker会读取镜像(只读),并在其顶部添加一层读写层。如果正在运行中的容器修改了现有文件,该文件将会被拷贝出底层的只读层,放到最顶层的读写层中。读写层中原来的旧版本文件(未被更改过的文件)仍然存在于镜像中。
所以当Docker容器被删除后,再基于原来的镜像创建容器时,将创建一个没有任何数据更改的容器,在之前那个容器中的数据更改会丢失掉。只读层和读写层的组合被Docker称为联合文件系统(Union File System)。
为了能够持久化这些更改过的数据,并且能够很容易实现容器间共享数据,Docker提出了Volume的概念。Volume是外部默认的联合文件系统或者是存在于宿主文件系统中正常的文件或文件夹。
常用命令
1. docker volume create <volume_name> #创建 Volume
2. docker volume ls #列出所有 Volume
3. docker volume inspect <volume_name> #查看 Volume 详细信息
4. docker volume rm <volume_name> #删除 Volume
5. docker run -d -v <volume_name>:<container_path> <image_name> #使用 Volume 运行容器
6. docker run --rm -v <volume_name>:/data -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /data #导出 Volume 内容到归档文件
7. docker run --rm -v <volume_name>:/data -v $(pwd):/backup ubuntu bash -c "tar xvf /backup/backup.tar -C /data" #从归档文件导入到 Volume
8. docker system df --volumes #查看 Volume 的使用情况
9. docker volume rm $(docker volume ls -q -f dangling=true) #清理 Volume 的未使用空间
总结
通过本文,给大家介绍了Docker的优势、基本原理、基本使用方法,dockerfile、docker volume等内容,帮助大家快速了解docker技术,大家需要在工作中多使用增进对docker的理解。