Docker 容器
容器镜像构建
镜像不包含任何动态数据,其内容在构建之后也不会被改变。
Docker 设计时,就充分利用 Union FS 的技术,将其设计为分层存储的架构 。镜像实际是由多层文件系统联合组成。
镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。 比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。
分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。
容器(Container):镜像运行时的实体
容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。前面讲过镜像使用的是分层存储,容器也是如此。
容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。
按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据 ,容器存储层要保持无状态化。所有的文件写入操作,都应该使用数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此, 使用数据卷后,容器可以随意删除、重新 run ,数据却不会丢失。
Docker 数据管理
在容器中管理数据主要有两种方式:
- 数据卷(Volumes)
- 挂载主机目录 (Bind mounts)
数据卷是由 Docker 管理的数据存储区域,有如下这些特点:
- 可以在容器之间共享和重用。
- 即使容器被删除,数据卷中的数据也不会被自动删除,从而确保数据的持久性。
- 对数据卷的修改会立马生效。
- 对数据卷的更新,不会影响镜像。
Docker 底层原理
首先,Docker 是基于轻量级虚拟化技术的软件,那什么是虚拟化技术呢?
简单点来说,虚拟化技术可以这样定义:
虚拟化技术是一种资源管理技术,是将计算机的各种实体资源)(CPU、内存、磁盘空间、网络适配器等),予以抽象、转换后呈现出来并可供分割、组合为一个或多个电脑配置环境。由此,打破实体结构间的不可切割的障碍,使用户可以比原本的配置更好的方式来应用这些电脑硬件资源。这些资源的新虚拟部分是不受现有资源的架设方式,地域或物理配置所限制。一般所指的虚拟化资源包括计算能力和数据存储。
Docker 技术是基于 LXC(Linux container- Linux 容器)虚拟容器技术的。
LXC,其名称来自 Linux 软件容器(Linux Containers)的缩写,一种操作系统层虚拟化(Operating system–level virtualization)技术,为 Linux 内核容器功能的一个用户空间接口。它将应用软件系统打包成一个软件容器(Container),内含应用软件本身的代码,以及所需要的操作系统核心和库。通过统一的名字空间和共用 API 来分配不同软件容器的可用硬件资源,创造出应用程序的独立沙箱运行环境,使得 Linux 用户可以容易的创建和管理系统或应用容器。
LXC 技术主要是借助 Linux 内核中提供的 CGroup 功能和 namespace 来实现的,通过 LXC 可以为软件提供一个独立的操作系统运行环境。
cgroup 和 namespace 介绍:
- namespace** 是 Linux 内核用来隔离内核资源的方式。** 通过 namespace 可以让一些进程只能看到与自己相关的一部分资源,而另外一些进程也只能看到与它们自己相关的资源,这两拨进程根本就感觉不到对方的存在。具体的实现方式是把一个或多个进程的相关资源指定在同一个 namespace 中。Linux namespaces 是对全局系统资源的一种封装隔离,使得处于不同 namespace 的进程拥有独立的全局系统资源,改变一个 namespace 中的系统资源只会影响当前 namespace 里的进程,对其他 namespace 中的进程没有影响。
- CGroup** 是 Control Groups 的缩写,是 Linux 内核提供的一种可以限制、记录、隔离进程组 (process groups) 所使用的物理资源 (如 cpu memory i/o 等等) 的机制。**
🌟****cgroup 和 namespace 两者对比:
两者都是将进程进行分组,但是两者的作用还是有本质区别。namespace 是为了隔离进程组之间的资源,而 cgroup 是为了对一组进程进行统一的资源监控和限制。
Windows安装使用docker与docker-compose
镜像加速器
针对安装了Docker for Windows的用户,您可以参考以下配置步骤:
在系统右下角托盘图标内右键菜单选择 Settings,打开配置窗口后左侧导航菜单选择 Docker Daemon。编辑窗口内的JSON串,填写下方加速器地址:
{
"registry-mirrors": ["https://4fsmmtu3.mirror.aliyuncs.com"]
}
中文补丁包
如何在Docker中创建和运行容器
安装并配置好Docker之后,你可以开始使用Docker创建和运行容器。
docker pull ubuntu
docker run -it ubuntu
docker ps
docker stop <container_id>
docker rm <container_id>
#其中<container_id>是容器的ID或名称
管理Docker镜像和容器
docker images
docker rmi <image_id>
docker container prune
#该命令会删除所有处于停止状态的容器
使用Docker Compose(用户在集群中部署分布式应用)
Docker Compose是一个用于定义和运行多容器Docker应用的工具。你可以通过Docker Compose定义多个服务,容器间的依赖关系,并且一键启动。
Docker Compose是一种编排服务,基于pyhton语言实现,是一个用于在 Docker 上定义并运行复杂应用的工具,可以让用户在集群中部署分布式应用。
用户可以很容易地用一个配置文件定义一个多容器的应用,然后使用一条指令安装这个应用的所有依赖,完成构建。解决了容器与容器之间如何管理编排的问题。
Docker Compose 中有两个重要的概念:
服务 (service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。
docker-compose --version
创建一个<font style="background-color:rgb(248, 248, 250);">docker-compose.yml</font>文件,定义多个容器服务:
version: '3'
services:
web:
image: nginx
db:
image: mysql
docker-compose up
Docker 命令大全
容器生命周期管理
- run - 创建并启动一个新的容器。
- start/stop/restart - 这些命令主要用于启动、停止和重启容器。
- kill - 立即终止一个或多个正在运行的容器
- rm - 于删除一个或多个已经停止的容器。
- pause/unpause - 暂停和恢复容器中的所有进程。
- create - 创建一个新的容器,但不会启动它。
- exec - 在运行中的容器内执行一个新的命令。
- rename - 重命名容器。
容器操作
- ps - 列出 Docker 容器
- inspect - 获取 Docker 对象(容器、镜像、卷、网络等)的详细信息。
- top - 显示指定容器中的正在运行的进程。
- attach - 允许用户附加到正在运行的容器并与其交互。
- events - 获取 Docker 守护进程生成的事件。
- logs - 获取和查看容器的日志输出。
- wait - 允许用户等待容器停止并获取其退出代码。
- export - 将容器的文件系统导出为 tar 归档文件。
- port - 显示容器的端口映射信息。
- stats - 实时显示 Docker 容器的资源使用情况。
- update - 更新 Docker 容器的资源限制,包括内存、CPU 等。
容器的root文件系统(rootfs)命令
镜像仓库
- login/logout - 管理 Docker 客户端与 Docker 注册表的身份验证。
- pull - 从 Docker 注册表(例如 Docker Hub)中拉取(下载)镜像到本地。
- push - 将本地构建的 Docker 镜像推送(上传)到 Docker 注册表(如 Docker Hub 或私有注册表)。
- search - 用于在 Docker Hub 或其他注册表中搜索镜像。
本地镜像管理
- images - 列出本地的 Docker 镜像。
- rmi - 删除不再需要的镜像。
- tag - 创建本地镜像的别名(tag)。
- build - 从 Dockerfile 构建 Docker 镜像。
- history - 查看指定镜像的历史层信息。
- save - 将一个或多个 Docker 镜像保存到一个 tar 归档文件中。
- load - 从由 docker save 命令生成的 tar 文件中加载 Docker 镜像。
- import - 从一个 tar 文件或 URL 导入容器快照,从而创建一个新的 Docker 镜像。
info|version
Docker Compose
- docker compose run - 启动一个新容器并运行一个特定的应用程序。
- docker compose rm - 启动一个新容器并删除一个特定的应用程序。
- docker compose ps - 从 docker compose 检查 docker 容器状态。
- docker compose build - 构建 docker compose 文件。
- docker compose up - 运行 docker compose 文件。
- docker compose ls - 列出 docker compose 服务。
- docker compose start - 启动 docker compose 文件创建的容器。
- docker compose restart - 重启 docker compose 文件创建的容器。
网络命令
**docker network ls**: 列出所有网络。**docker network create <network>**: 创建一个新的网络。**docker network rm <network>**: 删除指定的网络。**docker network connect <network> <container>**: 连接容器到网络。**docker network disconnect <network> <container>**: 断开容器与网络的连接。
详细内容查看:docker network 命令
卷命令
**docker volume ls**: 列出所有卷。**docker volume create <volume>**: 创建一个新的卷。**docker volume rm <volume>**: 删除指定的卷。**docker volume inspect <volume>**: 显示卷的详细信息。
详细内容查看:docker volume 命令