docker

容器

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

为什么需要容器

 容器使软件具备了超强的可移植能力。今天开发人员通常使用多种服务(比如 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

  • 14
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值