Docker官方文档

项目部署的问题

  • 大型项目组件多、依赖多,运行环境复杂
  • 开发、测试、生产环境有差异

解决:

  • 将应用的Libs函数库、Deps(依赖库)、配置与应用一起打包,形成可移植镜像
  • 使用沙箱机制将每个应用放到单独的隔离容器中运行,避免相互干扰

解决跨系统部署的问题:

  • 将用户与所需要调用的系统函数库一起打包
  • 运行时直接调用打包好的函数库,基于同一个内核,如Linux进行运行
  • 该方式仅限于同一内核下的跨系统部署,如Linux的不同发行版

相关概念

  • 镜像:Docker将应用程序及其所需要的依赖、函数库、配置等文件打包在一起,称为镜像
  • 容器:镜像中的应用程序运行后形成的进程就是容器,Docker会给容器做隔离,对外不可见

Docker架构

  • 服务端:Docker守护进程,负责处理Docker指令,管理镜像、容器等
  • 服务端:通过命令或RestAPI向Docker服务器发送指令

Docker基本操作

镜像相关命令

镜像命令由两部分组成[respository]:[tag],其中tag表示版本

在没有指定tag时默认为latest,表示最新版本的镜像

  • 查看帮助docker --help

  • 构建镜像docker build

  • 从服务器拉取镜像docker pull

  • 查看镜像docker images

  • 删除镜像docker rmi

  • 推送镜像到服务器docker push

  • 将镜像保存为压缩包docker save

  • 加载保存的镜像压缩包docker load

  • 删除容器docker rm

  • 查看所有容器状态docker ps -a

创建并运行一个容器

docker run --name containerName -p 80:80 -d nginx

  • docker run:创建并运行一个容器
  • --name:给容器起一个名字
  • -p:端口映射,左侧为宿主机端口,右侧为容器端口
  • -d:后台运行

进入容器并修改内容

docker exec -it containerName bash

  • docker exec:进入容器内部,执行一个命令
  • -it:给当前要进入的容器创建一个终端
  • containerName:要进入的容器的名称
  • bash:进入容器后要执行的命令,bash是linux终端交互命令

数据卷

数据卷(volume)是一个虚拟目录,指向宿主机文件系统中的某个目录。修改宿主机的文件内容时该修改会同时反映到容器中,同理在容器中的修改也会反到指定的宿主机文件中。大大提高了对容器中文件或配置的修改性,而且多个容器可以挂载同一个数据卷。

删除容器时不会删除数据卷。

命令

docker volume [COMMAND]

  • create:创建数据卷
  • inspect:显示一个或多个数据卷的信息
  • ls列出所有的数据卷
  • prune删除未使用的数据卷
  • rm删除一个或指定的数据卷

挂载数据卷

docker run \
	--name test \
	-v html:/root/htm \
	-p 8080:80 \
	nginx \
  • docker run:创建并运行容器

  • --name test:容器名称为test

  • -v html:root/htm:将名称为html的数据卷挂载到容器内的/root/html这个目录中

  • -p 8080:80:将宿主机的8080端口映射到容器的80端口上

  • nginx:镜像名称

  • \:命令换行符

自定义镜像

镜像的结构

镜像由入口、若干层和基础镜像组成

image-20230109200611868

Dockerfile

Dockerfile是一个文本文件,其中包含一个个指令,用指令来说明执行什么操作来构建镜像。每个指令形成一个layer。

Dockerfile指令说明

docker build -t name:1.0 .

  • docker bulid:构建镜像
  • -t:tag
  • name:镜像名称
  • 1.0:版本号
  • .:dockerfile目录

DockerCompose

可以基于Compose文件快速部署分布式应用,无需手动一个个创建和运行容器

Compose是一个文本文件,通过指令定义集群中的每个容器如何运行

DockerCompose文档