容器
容器是一种轻量级、可移植、自包含的软件打包技术,使应用程序可以在几乎任何地方以相同的方式运 行。 简单来说,一个容器包含了完整的运行时环境:除了应用程序本身之外,这个应用所需的全部依赖、 类库、其他二进制文件、配置文件等,都统一被打入一个称为容器镜像的包中。通过将应用程序本身,和 其依赖容器化,操作系统发行版本和其他基础环境造成的差异,都被抽象掉了。

为什么需要容器
容器使软件具备了超强的可移植能力。今天开发人员通常使用多种服务(比如 MQ,Cache,DB) 构建和组装应用,而且应用很可能会部署到不同的环境,比如虚拟服务器,私有云和公有云

一方面应用包含多种服务,这些服务有自己所依赖的库和软件包;另一方面存在多种部署环境,服务 在运行时可能需要动态迁移到不同的环境中。这就产生了一个问题:如何让每种服务能够在所有的部署环 境中顺利运行?于是我们得到了下面这个矩阵,各种服务和环境通过排列组合产生了一个大矩阵。开发人 员在编写代码时需要考虑不同的运行环境,运维人员则需要为不同的服务和平台配置环境。对他们双方而 言,这都是一项困难而艰巨的任务。

如何解决这个问题呢?每一次运输,货主与承运方都会担心因货物类型的不同而导致损失,比如几个铁 桶错误地压在了一堆香蕉上。另一方面,运输过程中需要使用不同的交通工具也让整个过程痛苦不堪:货物 先装上车运到码头,卸货,然后装上船,到岸后又卸下船,再装上火车,到达目的地,最后卸货。一半以上 的时间花费在装、卸货上,而且搬上搬下还容易损坏货物

这同样也是一个NxM的矩阵

集装箱的发明解决这个难题。任何货物,无论钢琴还是保时捷,都被放到各自的集装箱中。 集装箱在整个运输过程中都是密封的,只有到达最终目的地才被打开。标准集装箱可以被高效 地装卸、重叠和长途运输。现代化的起重机可以自动在卡车、轮船和火车之间移动集装箱。

容器的标准化
在2015年,由Google,Docker、CoreOS、IBM、微软、红帽等厂商联合发起的OCI(Open Container Initiative)组织成立了,并于2016年4月推出了第一个开放容器标准。标准主要包括runtime spec标准和image format spec标准。标准的推出,有助于替成长中市场带来稳定性,让企业能放心采用容 器技术,用户在打包、部署应用程序后,可以自由选择不同的容器Runtime;同时,镜像打包、建立、认 证、部署、命名也都能按照统一的规范来做。 Runtime是容器真正运行的地方,Runtime需要跟操作系统kernel紧密协作,为容器提供运行环境。目 前主流的三种容器Runitme有:lxc、runc、rkt。 1、Lxc是Linux上的老牌runtime。Docker最初也是使用lxc作为runtime。 2、Runc是Docker自己开发的容器runtime,符合OCI规范,也是现在Docker的默认runtime。 3、rkt是CoreOS开发的容器runtime,符合OCI规范,因而能够运行Docker的容器
什么是docker
Docker最初是dotCloud公司创始人Solomon Hykes在法国期间发起的一个公司内部项目,它是基于 dotCloud公司多年云服务技术的一次革新,并于2013年3月以Apache 2.0授权协议开源,Docker是用Go编 写,主要项目代码在GitHub上进行维护。 Docker是一个用于开发,交付和运行应用程序的开放平台。Docker使用户能够将应用程序与基础架构 分开,从而可以快速交付软件。借助Docker,用户可以以与管理应用程序相同的方式来管理基础架构。通过 利用Docker的快速交付,测试和部署代码的方法,用户可以大大减少编写代码和在生产环境中运行代码之间 的延迟
docker的优势
容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高。传统虚拟机方式运行10个不同的应用就要起10个虚拟机, 而Docker只需要启动10个隔离的应用即可。 具体说来,Docker在如下几个方面具有较大的优势。
1、更快速的交付和部署 开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。 Docker可 以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。 Docker容器很轻很快,容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。
2、更高效的虚拟化 Docker容器的运行不需要额外的hypervisor支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。
3、更轻松的迁移和扩展 Docker容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让 用户把一个应用程序从一个平台直接迁移到另外一个。
4、更简单的管理 使用Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动 化并且高效的管理
docker架构结构
Docker使用了C/S体系架构,Docker客户端与Docker守护进程通信,Docker守护 进程负责构建,运行和分发Docker容器。Docker客户端和守护进程可以在同一个系统上 运行,也可以将Docker客户端连接到远程Docker守护进程。Docker客户端和守护进程 使用REST API通过UNIX套接字或网络接口进行通信
Docker核心组件包括五种:
1、Docker客户端
2、Docker服务器
3、Docker镜像
4、Docker容器
5、Registry

docker架构结构
1、Docker客户端: 最常用的Docker客户端是docker命令。通过docker我们可以方便地在宿主机上构建和运行容器。除了 docker命令行工具,用户也可以通过REST API与服务器通信。
2、Docker服务器: Docker daemon是服务器组件,以Linux后台服务的方式运行。Docker daemon运行在Docker host 上,负责创建、运行、监控容器,构建、存储镜像。默认Docker daemon只能响应来自本地host的客户端 请求。
3、Docker镜像: 可以将Docker镜像看成只读模板,通过它可以创建Docker容器。
4、Docker容器: Docker容器就是Docker镜像的运行实例。用户可以通过CLI(docker)或是API启动、停止、移动或删 除容器。可以这么认为,对于应用软件,镜像是软件生命周期的构建和打包阶段,而容器则是启动和运行阶 段。
5、Registry: Registry是存放Docker镜像的仓库,Registry分私有和公有两种。 公有仓库:最大的公有仓库是官方提供的Docker Hub,其中存放着数量庞大的镜像供用户下载。国内 如:腾讯云、阿里云也提供了仓库的本地源,可以提供稳定的国内访问。 私有仓库:用户不希望公开分享镜像文件,Docker也支持用户在本地网络内创建一个只能自己访问的私 有仓库
docker部署
# step 1:
安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2:
添加软件源信息 sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# Step 4: 更新并安装Docker-CE
sudo yum makecache fast sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start
Step 1: 查找Docker-CE的版本:
yum list docker-ce.x86_64 --showduplicates | sort -r
Step2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.0.ce.1-1.el7.centos)
我们这里直接下载最新版本的docker
yum -y install docker
配置docker加速器
vim /etc/docker/daemon-json
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn"
]
}
systemctl daemon-reload 一下
再次重启docker
systemctl restart docker
docker部署完成
docker镜像基本操作
docker镜像概述
Docker 镜像类似于虚拟机镜像,可以将它理解为一个只读的模板。例如:一个镜像可以包含一个基 本的操作系统环境,里面仅安装了 Apache 应用程序(或用户需要的其他软件),可以把它称为一个 Apache 镜像。镜像是创建 Docker 容器的基础,通过版本管理和增量的文件系统,Docker 提供了一套 十分简单的机制来创建和更新现有的镜像,用户甚至可以直接从网上下载一个已经做好的应用镜像,并直 接使用。
当运行容器时,使用的镜像如果在本地中不存在,Docker就会自动从Docker镜像仓库中下载,默认 是从 Docker Hub公共镜像源下载,也可以通过其他的公共仓库中下载,或者自己创建镜像,下面学习如 果获取镜像与镜像的相关操作。
docker镜像操作
列初镜像列表
[root@node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd latest 9cb0a2315602 7 weeks ago 148MB
REPOSITORY:表示镜像的仓库源
TAG:镜像的标签
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小-
搜索镜像
[root@node1 ~]# docker search httpd
NAME DESCRIPTION STARS OFFICIAL
httpd The Apache HTTP Server Project 4789 [OK]
jitesoft/httpd Apache httpd on Alpine linux. 0
hipache DEPRECATED (upstream); use "traefik", "nginx… 85 [OK]
openquantumsafe/httpd Demo of post-quantum cryptography in Apache … 14
openeuler/httpd 0
vulhub/httpd 0
paketobuildpacks/httpd 0
betterweb/httpd 0
dockette/apache Apache / HTTPD 1
skyven/httpd httpd(buysbox httpd) 0
sohampatil08/httpd httpd images >> httpd containers 0
zarra/httpd httpd 0
rogerlino94/httpd httpd 0
casus71/httpd HTTPD 0
ardeshir/httpd httpd 0
umyoooon/httpd httpd 0
lichnelei/httpd httpd 0
sanjay8939/httpd httpd 0
1543777187/httpd httpd 0
manojmane1294/httpd httpd 0
medolika/httpd httpd 0
sjlife/httpd httpd 0
nasoym/httpd httpd 0
447523269/httpd httpd 0
yrx2010/httpd httpd 0
NAME: 镜像仓库源的名称
DESCRIPTION: 镜像的描述
OFFICIAL: 是否docker官方发布
STARS: 类似Github 里面的star,表示点赞、喜欢的意思。
AUTOMATED: 自动构建
获取镜像
[root@node1 ~]# docker pull httpd
Using default tag: latest
latest: Pulling from library/httpd
a2318d6c47ec: Pull complete
62dd86107c65: Pull complete
4f4fb700ef54: Pull complete
22871f73faed: Pull complete
ca061a523d1f: Pull complete
509789394c2a: Pull complete
Digest: sha256:ae1124b8d23ee3fc35d49da35d5c748a2fce318d1f55ce59ccab889d612f8be8
Status: Downloaded newer image for httpd:latest
docker.io/library/httpd:latest
使用tag命令添加镜像标签
[root@node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd latest 9cb0a2315602 7 weeks ago 148MB
打上新的标签
[root@node1 ~]# docker tag httpd:latest myhttpd:latest
[root@node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd latest 9cb0a2315602 7 weeks ago 148MB
myhttpd latest 9cb0a2315602 7 weeks ago 148MB
镜像历史
[root@node1 ~]# docker history httpd
IMAGE CREATED CREATED BY SIZE COMMENT
9cb0a2315602 7 weeks ago CMD ["httpd-foreground"] 0B buildkit.dockerfile.v0
<missing> 7 weeks ago EXPOSE map[80/tcp:{}] 0B buildkit.dockerfile.v0
<missing> 7 weeks ago COPY httpd-foreground /usr/local/bin/ # buil… 138B buildkit.dockerfile.v0
<missing> 7 weeks ago STOPSIGNAL SIGWINCH 0B buildkit.dockerfile.v0
<missing> 7 weeks ago RUN /bin/sh -c set -eux; savedAptMark="$(a… 62.4MB buildkit.dockerf
。。。。。。。。。。。。。。。。。。。。。。。
删除镜像
删除镜像时,后面接镜像名称
[root@node1 ~]# docker rmi httpd
Untagged: httpd:latest
Untagged: httpd@sha256:0954cc1af252d824860b2c5dc0a10720af2b7a3d3435581ca788dff8480c7b32
Deleted: sha256:dabbfbe0c57b6e5cd4bc089818d3f664acfad496dc741c9a501e72d15e803b34
Deleted: sha256:0e16a5a61bcb4e6b2bb2d746c2d6789d6c0b66198208b831f74b52198d744189
........................................
........................................
删除镜像时,后面接镜像ID。如果该镜像没有被打标签,可直接删除
[root@node1 ~]# docker rmi dabbfbe0c57b
Untagged: httpd:latest
Untagged: httpd@sha256:0954cc1af252d824860b2c5dc0a10720af2b7a3d3435581ca788dff8480c7b32
Deleted: sha256:dabbfbe0c57b6e5cd4bc089818d3f664acfad496dc741c9a501e72d15e803b34
Deleted: sha256:0e16a5a61bcb4e6b2bb2d746c2d6789d6c0b66198208b831f74b52198d744189
Deleted: sha256:f79670638074ff7fd293e753c11ea2ca0a2d92ab516d2f6b0bac3f4c6fed5d86
Deleted: sha256:189d55cdd18e4501032bb700a511c2d69c82fd75f1b619b5218ea6870e71e4aa
.............
如果该镜像被重新打了标签,是无法删除的,那么想一并删除该镜像和此镜像设置的标签后的镜像,可在后面跟 -f选项,该选项是强制的意思。
[root@node1 ~]# docker rmi dabbfbe0c57b
Error response from daemon: conflict: unable to delete dabbfbe0c57b (must be forced) - image is referenced
in multiple repositories
[root@node1 ~]# docker rmi dabbfbe0c57b -f // 强制删除
Untagged: httpd:latest
Untagged: httpd@sha256:0954cc1af252d824860b2c5dc0a10720af2b7a3d3435581ca788dff8480c7b32
Untagged: myhttpd:latest
Deleted: sha256:dabbfbe0c57b6e5cd4bc089818d3f664acfad496dc741c9a501e72d15e803b34
Deleted: sha256:0e16a5a61bcb4e6b2bb2d746c2d6789d6c0b66198208b831f74b52198d744189
Deleted: sha256:f79670638074ff7fd293e753c11ea2ca0a2d92ab516d2f6b0bac3f4c6fed5d86
清理镜像
使用docker一段时间后,系统可能会遗留一些临时的镜像文件,以及一些没有被使用的镜像,可以通 过docker image prune命令来进行清理。支持的选项包括:
-a,-all:删除所有无用的镜像,不仅仅是临时镜像;
-f,-force:强制删除镜像,而不进行提示确认
例如,如下命令会自动清理临时的遗留镜像文件层,最后会提示释放的存储空间:
[root@node1 ~]# docker image prune -f
Total reclaimed space: 0B
导出镜像
可以使用docker image save将一个镜像导出到一个压缩包中,便于在其他主机上运行。
[root@node1 ~]# docker images save httpd > 911-httpd-tar.gz
"docker images" requires at most 1 argument.
See 'docker images --help'.
Usage: docker images [OPTIONS] [REPOSITORY[:TAG]]
List images
[root@node1 ~]# ll 911-httpd-tar.gz
-rw-r--r-- 1 root root 0 Sep 11 16:10 911-httpd-tar.gz
导入镜像
可以使用docker image load导入我们需要的镜像压缩包(为了实验效果,首先我们把之前的httpd镜 像删除)。
[root@node1 ~]# docker image load -i 911-httpd.tar.gz
1da636a1aa95: Loading layer 3.072kB/3.072kB
15e4bf5d0804: Loading layer 2.72MB/2.72MB
9cff3206f9a6: Loading layer 61.08MB/61.08MB
deefaa620a71: Loading layer 3.584kB/3.584kB
Loaded image: httpd:latest
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd latest dabbfbe0c57b 5 months ago 1
使用 inspect 命令查看信
使用 docker [image] inspect 命令可以获取该镜像的详细信息,包括制作者、适应架构、各层的数字摘要等。
[root@node1 ~]# docker image inspect httpd:latest
[
{
"Id": "sha256:9cb0a231560203a9b46325ef6dfe0d21d524813acb74447fd276b9813a9fdd44",
"RepoTags": [
"httpd:latest"
],
"RepoDigests": [
"httpd@sha256:ae1124b8d23ee3fc35d49da35d5c748a2fce318d1f55ce59ccab889d612f8be8"
],
"Parent": "",
"Comment": "buildkit.dockerfile.v0",
"Created": "2024-07-17T23:31:14Z",
"DockerVersion": "",
"Author": "",
...............................
上面代码返回的是一个 JSON 格式的消息,如果我们只要其中一项内容时,可以使用-f 来指定
[root@node1 ~]# docker image inspect -f {{".Architecture"}} httpd:latest
amd64
[root@node1 ~]# docker image inspect -f {{".Os"}} httpd:latest
linux
[root@node1 ~]# docker image inspect -f {{".Size"}} httpd:latest
148177949