容器技术原理
计算机的本质
- 硬件资源管理(cpu、内存条、磁盘、显卡)
- 软件资源管理(系统软件、应用软件)
虚拟机和容器比较
虚拟机是一种虚拟化技术,它通过在物理计算机上模拟完整的计算机系统来运行多个独立的操作系统和应用程序。每个虚拟机都具有自己的操作系统、内存、CPU、硬盘和其他设备,因此它们可以运行不同的操作系统和应用程序。虚拟机需要在宿主机上运行一个虚拟化管理程序(hypervisor),它负责管理多个虚拟机的资源和访问权限。虚拟机通常需要更多的资源和较长的启动时间,但它们提供了更高的隔离性和安全性。
容器是一种操作系统级虚拟化技术,它利用操作系统的内核来隔离和管理多个应用程序。每个容器都共享主机操作系统的内核和其他系统资源,但具有独立的文件系统、网络接口、进程空间和其他系统资源。容器需要一个运行时环境来管理容器的生命周期,如启动、停止、暂停和删除。容器是开辟通独立的进程空间相互隔离,常需要较少的资源和更快的启动时间,其还有其他优点:
- 一致的运行环境-可以轻松的在不同的环境调试bug
- 更高效的利用系统资源
- 更轻松迁移和拓展
- 更便于CICD
- 更快的启动时间
但它的隔离性和安全性相对较低。
因此,虚拟机和容器各有优缺点,根据应用场景和需求选择适合的技术来部署应用程序。虚拟机适合运行需要高度隔离和安全性的应用程序,如数据库、安全服务等;而容器适合运行需要高度可移植性和灵活性的应用程序,如微服务、Web 应用程序等。
docker的核心概念
Docker 是一种容器化技术,是通过go语言开发的,它可以将应用程序及其依赖项打包成一个独立的容器,以便在不同的环境中进行部署和运行。下面是 Docker 的技术原理:
- 镜像
Docker 的镜像是容器的基础,包含了应用程序及其依赖项。镜像是以分层的方式构建的,每个分层都是只读的,可以共享。当容器启动时,Docker 会将这些分层堆叠在一起,形成一个可写的容器层,从而实现了容器的可变性,镜像是一个模板,类似于一个类 - 容器
容器是从镜像创建的额一个具体运行实例,具有生命周期,可以启动、停止、运行。类似于面向对象编程,实例或对象 - 仓库
仓库是镜像的载体,Docker HUb 是docker官方提供的docker 的镜像仓库,是目前最权威,最专业,最大的镜像仓库。
Docker是一开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。
Docker 的出现使得应用程序容器化成为了一个更加简单、可靠和普及的选择,被广泛应用于开发、测试和生产环境中。随着云计算、容器编排等技术的不断发展,Docker 也在不断演进和完善,为用户提供更加高效、安全、灵活的容器化解决方案。
docker架构组成
- Linux 命名空间
Docker 使用 Linux 命名空间来隔离进程、网络、文件系统等资源。每个容器都有自己独立的命名空间,不会互相影响。 - 控制组(Cgroups)
Docker 使用 Linux 控制组(Cgroups)来限制容器使用的资源,如 CPU、内存、磁盘等。这使得 Docker 可以保证每个容器使用的资源是可控的。 - 联合文件系统(UnionFS)
Docker 使用联合文件系统(UnionFS)来构建容器镜像。联合文件系统可以将多个文件系统(通常是只读文件系统)合并成一个虚拟的文件系统,使得容器可以共享相同的基础镜像,同时又能保证容器之间的隔离性。 - 镜像
Docker 的镜像是容器的基础,包含了应用程序及其依赖项。镜像是以分层的方式构建的,每个分层都是只读的,可以共享。当容器启动时,Docker 会将这些分层堆叠在一起,形成一个可写的容器层,从而实现了容器的可变性。 - Docker 守护进程
Docker 守护进程(dockerd)是 Docker 的核心组件,它负责管理容器、镜像、网络等。Docker 客户端通过与 Docker 守护进程通信来执行各种 Docker 命令。 - Docker Container
Docker Container 是由 Docker Image 运行而成的独立的、可执行的软件包。它是 Docker 应用程序运行的最小单元,包含了应用程序运行所需的所有文件、库和依赖项,以及容器的元数据和配置信息。Docker Container 可以快速、轻松地创建、启动、停止和删除,从而实现了应用程序的快速部署和交付。 - Docker containerd-shim 是 Docker 底层的一个组件,用于管理容器的生命周期和与宿主机之间的通信。它是 containerd 的插件之一,负责启动容器进程并在容器退出后清理相关资源。同时,containerd-shim 还实现了容器与宿主机之间的进程通信,使得 Docker 能够像运行本地进程一样运行容器。
containerd-shim 具有以下特点:- 容器生命周期管理:containerd-shim 负责启动容器进程并在容器退出后清理相关资源。它会监控容器进程的状态,并在需要时发送信号以结束进程。
- 进程间通信:containerd-shim 还实现了容器与宿主机之间的进程通信。它为容器提供了一个进程间通信的管道,使得容器能够像本地进程一样与宿主机进行通信。
- 轻量级:containerd-shim 是 Docker 底层的一个组件,它采用了轻量级的设计,使得它能够快速启动和运行,同时还能够保持低资源消耗。
Docker环境搭建
安装参考官方文档即可:https://docs.docker.com/engine/install/centos/
常用的docker命令
镜像(image)命令
- 拉取镜像,使用 docker pull 命令拉取远程仓库的镜像到本地;
- 重命名镜像,使用 docker tag 命令“重命名”镜像 ;
- 查看镜像,使用 docker image ls 或 docker images 命令查看本地已经存在的镜像;
- 删除镜像,使用 docker rmi 命令删除无用镜像 ;
- 构建镜像,构建镜像有两种方式。第一种方式是使用 docker build 命令基于 Dockerfile 构建镜像;第二种方式是使用 docker commit 命令基于已经运行的容器提交为镜像
$ docker build -t my-image
容器(container)命令
首先了解容器的生命周期
-
created
-
running
-
stopped
-
paused
-
deleted
-
docker build
:构建Docker镜像 -
docker run
:创建一个新的容器并运行一个命令。docker run [options] image [command][arg] 常用参数
- -d 后台命令
- -it 分配一个交互控制台
- --name 指定容器名称
- -P 指定容器暴漏的端口
- -e 向容器内传递环境变量,启动容器时用户可以动态传参
- -v 挂载文件,把该容器的数据保存到挂载文件上e
$ docker run -it nginx echo 'test'
docker ps
:列出当前正在运行的容器。
$ docker ps
docker start
:启动一个或多个已经停止的容器。docker stop
:停止一个或多个正在运行的容器。docker rm
:删除一个或多个容器。docker logs
:查看容器的日志输出。
$ docker logs my-container
docker exec
:在运行的容器中执行一个命令。
[root@iZwz92v9xcjopfp1ck14eaZ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cc1cc6a2fd13 busybox "sh" 3 hours ago Up 2 hours friendly_cannon
[root@iZwz92v9xcjopfp1ck14eaZ ~]# docker exec -it cc1cc6a2fd13 ls
bin dev etc home lib lib64 proc root sys tmp usr var
docker attach
:连接到正在运行的Docker容器
$ docker attach my-container
docker cp
:将文件或目录复制到运行中的Docker容器中
$ docker cp /path/to/local/file my-container:/path/to/container/file
docker export
:将运行中的Docker容器导出为tar文件
$ docker export my-container > my-container.tar
docker commit
:将修改后的Docker容器保存为新的Docker镜像
$ docker commit my-container my-image:latest
其他命令
docker version
:查看Docker版本信息
$ docker version
docker search
:搜索Docker镜像
$ docker search nginx
-. docker pull
:拉取Docker镜像
$ docker pull nginx