Docker 入门到精通系列一

在这里插入图片描述

简介

Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上 进行维护。Docker 自开源后受到广泛的关注和讨论,以至于 dotCloud 公司后来都改名为 Docker Inc。Redhat 已经在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 产品中广泛应用。Docker 项目的目标是实现 轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操 作一个快速轻量级的虚拟机一样简单。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植 的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不 会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。应用场景、优势以及基础架构。Docker就是一个虚拟化技术,将应用程序和应用程序需要的依赖环境一起打包,让部署无需担心环境问题。

一、 为什么要使用 Docker

1、 Docker 容器虚拟化的好处

在云时代,开发者创建的应用必须要能很方便地在网络上传播,也就是说应用必须脱离底层物理硬件的限制; 同时必须满足“任何时间任何地点”可获取可使用的特点。因此,开发者们需要一种新型的创建分布式应用程序 的方式,快速分发部署,而这正是 Docker 所能够提供的最大优势。Docker 提供了一种更为聪明的方式,通过 容器来打包应用、解耦应用和运行平台。这意味着迁移的时候,只需要在新的服务器上启动需要的容器就可以了, 无论新旧服务器是否是同一类别的平台。这无疑帮助我们节约了大量的宝贵时间,并降低部署过程出现问题的风 险。

2、 Docker 在开发和运维中的优势

对于开发和运维人员来说,最梦寐以求的效果可能就是一次创建和配置,之后可以在任意地方、任意时间让 应用正常运行,而 Docker 恰恰可以实现这一中级目标。具体来说,在开发和运维过程中,Docker 具有以下几 个方面的优势:
更快的交付和部署:使用 Docker,开发人员可以使用镜像来快速构建一套标准的开发环境;开发完之 后,测试和运维人员可以直接使用完全相同的环境来部署代码。只要是开发测试过的代码,就可以确保 在生产环境无缝运行。Docker 可以快速创建和删除容器,实现快速迭代,节约开发、测试及部署的时间。实现快速交付、测试和部署项目代码,大量减少编码和生产环境中运行代码之间的延迟。
更高效的利用资源:运行 Docker 容器不需要额外的虚拟化管理程序的支持,Docker 是内核级的虚拟化,可以实现更高的性能,同时对资源的额外需求很低,与传统的虚拟机方式相比,Docker 的性能要 提高 1 ~ 2 个数量级。
更轻松的迁移和扩展:Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私 有云、个人电脑等等,同时支持主流的操作系统发行版本。这种兼容性能让用户可以在不同的平台之间 轻松的迁移应用。
更轻松的管理和更新:使用 Dockerfile,只需要小小的配置修改,就可以替代以往大量的更新工作。所 有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的容器管理。

3、 Docker 与虚拟机的比较

作为一种轻量级的虚拟化方式,Docker 在运行应用上跟传统的虚拟机的方式相比具有如下显著优势:
 Docker 容器启动很快,启动和停止可以实现秒级,相比传统的虚拟机方式(分钟级)要快速很多。
 Docker 容器对系统资源需求很少,一台主机上可以同时运行数千个 Docker 容器。
 Docker 通过类似 git 设计理念的操作来方便用户获取、分发和更新应用镜像,存储复用,增量更新。
 Docker 通过 Dockerfile 支持灵活的自动化创建和部署机制,可以提高工作效率,并标准化流程。

在这里插入图片描述

二、 Docker 与虚拟化

Docker 以及其他容器技术,都属于操作系统虚拟化范畴,操作系统细腻化最大的特点就是不需要额外的 supervisor 支持。Docker 虚拟化方式之所以有众多优势,跟操作系统虚拟化技术自身的设计和实现分不开。

在这里插入图片描述

三、 Docker 三大概念和使用

Docker 中有三个核心概念:镜像、容器和仓库。因此,准确把握这三大概念对于掌握 Docker 技术尤为重 要。

1. 镜像(Image):

Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完 整的一套 Ubuntu16.04 最小系统的 root 文件系统。

2. 容器(Container):

镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静 态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

3. 仓库(Repository):

用来保存镜像的仓库。当我们构建好自己的镜像之后,需要存放在仓库中,当我们需要启动一个镜像时, 可 以在仓库中下载下来。Docker使用客户端-服务器架构模式(即CS架构)

四、 在 CentOS 系统上安装 Docker

Docker 目前支持 CentOS 7 及以后版本。系统的要求跟 Ubuntu 情况类似,64 位操作系统,内核至少是 3.10 以上。

1、 更换系统 yum 源

# 查看系统内核版本 
[root@alvin-test-os ~]# uname -a 
Linux alvin-test-os 3.10.0-1127.el7.x86_64 #1 SMP Tue Mar 31 23:36:51 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

# 备份原来 YUN 源
[root@alvin-test-os ~]# mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

# 刷新 yum 源缓存 
[root@alvin-test-os ~]# yum makecache

#1.1.2、 首先,为了方便我们需要更新一下系统:
root@alvin-test-os ~]# yum update -y --exclud=kernel*

#1.1.3、 安装所需的基础软件
[root@alvin-test-os yum.repos.d]# yum install -y yum-utils device-mapper-persistent-data lvm2

[root@alvin-test-os yum.repos.d]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo 

#1.1.4、 更换 YUM 源
[root@alvin-test-os yum.repos.d]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 更新并安装Docker-CE
[root@alvin-test-os yum.repos.d]# yum makecache fast

# 元数据缓存已建立
[root@alvin-test-os yum.repos.d]# yum -y install docker-ce

# 1.1.5、 启动并设置开机自启动
[root@alvin-test-os ~]# systemctl enable --now docker

# 开启Docker服务
[root@alvin-test-os yum.repos.d]# service docker start

# 1.1.6、 测试启动 出现下列信息表示安装成功
[root@alvin-test-os ~]# docker info

		Client: Debug Mode: false Server: Containers: 1 Running: 1 Paused: 0 Stopped: 0 Images: 1 Server Version: 19.03.13 Storage Driver: overlay2 Backing Filesystem: xfs Supports d_type: true Native Overlay Diff: true Logging Driver: json-file Cgroup Driver: cgroupfs Plugins: Volume: local Network: bridge host ipvlan macvlan null overlay Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog Swarm: inactive Runtimes: runc Default Runtime: runc Init Binary: docker-init containerd version: 8fba4e9a7d01810a393d5d25a3621dc101981175 runc version: dc9208a3303feef5b3839f4323d9beb36df0a9dd init version: fec3683 Security Options: seccomp Profile: default Kernel Version: 3.10.0-1127.el7.x86_64 Operating System: CentOS Linux 7 (Core) OSType: linux Architecture: x86_64 CPUs: 8 Total Memory: 15.67GiB Name: alvin-test-os ID: HR6P:IIZP:6CKH:N2L5:IQ2T:AJFP:CCAT:S2ZG:MWC4:DZBQ:XUZM:UKLC Docker Root Dir: /var/lib/docker Debug Mode: false Registry: https://index.docker.io/v1/ Labels: Experimental: false Insecure Registries: 127.0.0.0/8 Live Restore Enabled: false

1.1、 第一个 Docker 实例

root@alvin-test-os:~# docker run -d --rm --name nginx -p 80:80 nginx 

		Unable to find image 'nginx:latest' locally latest: Pulling from library/nginx bb79b6b2107f: Pull complete 5a9f1c0027a7: Downloading [==============> ] 7.457MB/26.49MB 5a9f1c0027a7: Downloading [======================> ] 12.17MB/26.49MB 166a2418f7e8: Download complete 1966ea362d23: Download complete

2、 使用 Docker 镜像

docker 镜像是 docker 中三大概念之一,其主要作用是作为启动容器的模板。

2.1、 获取镜像

镜像是运行容器的模板,官方 Docker Hub 仓库已经提供了许多镜像共开发者使用。如果我们需要获取某 个镜像则可以去 docker 仓库下载所需的镜像。
下载镜像的格式:docker pull [image_name][:image_version]
下载镜像实例:

[root@alvin-test-os ~]# docker pull nginx:1.17 
		
		1.17: Pulling from library/nginx afb6ec6fdc1c: Pull complete b90c53a0b692: Pull complete 11fa52a0fdc0: Pull complete Digest: sha256:6fff55753e3b34e36e24e37039ee9eae1fe38a6420d8ae16ef37c92d1eb26699 Status: Downloaded newer image for nginx:1.17 docker.io/library/nginx:1.17

下载的时候,我们可以看到有若干层组成,像 afb6ec6fdc1c 这样的字符串是层的唯一 ID(实际上,完整的 ID 包括 256 比特, 64 个十六进制字符组成)。使用 docker pull 命令下载中会获取并输出镜像的各层信息。当不 同的镜像包括相同的层的时候,本地仅存一份内容,减小存储空间。

2.2、 查看镜像信息

镜像主要包括镜像文件、镜像 tag 以及镜像详细信息等等。

2.2.1、 镜像列表 使用 docker images 或 docker images ls 命令可以列举本地主机上已有镜像的基本信息。
[root@alvin-test-os ~]# docker images 
	
	REPOSITORY TAG IMAGE ID CREATED SIZE registry.cn-hangzhou.aliyuncs.com/alvinos/teach 1000-teach-2020-10-28-13-40-27 22fdec3d9a6d 3 weeks ago 1.02GB nginx 1.17 9beeba249f3e 6 months ago 127MB

列举信息中,可以看到几个字段信息:
 镜像来源:来自哪个仓库,默认来自:hub.docker.com
 镜像标签:比喻 1.17、1000-teach-2020-10-28-13-40-27
 镜像 ID:例如 22fdec3d9a6d
 镜像创建时间:例如:3 weeks ago
 镜像大小:127MB

其中镜像的 ID 信息十分重要,它唯一标识了镜像。在使用镜像 ID 的时候,一般可以使用该 ID 的前若干个 字符组成的可区分串来替代完整的 ID。
TAG 信息用于标记来自同一个仓库的不同镜像。TAG 在同一个仓库中是唯一的。
镜像大小信息只是表示了该镜像的逻辑体积大小,实际上由于相同的镜像层本地只会存储一份,物理上占用 的存储空间会小于各镜像逻辑体积之和。 image 子命令主要支持如下选项:
 -a : 列出所有(包括临时文件)镜像文件

alvin@AlvindeMacBook-Pro: docker images -a 

	REPOSITORY TAG IMAGE ID CREATED SIZE registry.cn-hangzhou.aliyuncs.com/alvinos/teach 1000-teach-2020-10-22-19-03-16 d83921684085 3 weeks ago 1.05GB test v1 2047b4806990 3 weeks ago 1.05GB <none> <none> 85b0590cd234 3 weeks ago 1.05GB <none> <none> 611b48e08ec2 3 weeks ago 1.05GB <none> <none> 9fbe4fba95d2 3 weeks ago 1.05GB <none> <none> 31b4192b2e41 3 weeks ago 1GB <none> <none> 2c8ba419a512 3 weeks ago 1GB
	

 --digests=true|false:列出镜像的数字摘要值

[root@alvin-test-os ~]# docker images --digests 

	REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE registry.cn-hangzhou.aliyuncs.com/alvinos/teach 1000-teach-2020-10-28-13-40-27 sha256:1dd7db35cc9f3c2f0349806d05f93cbd18f1f583290c5bf2d513f942929bf068 22fdec3d9a6d 3 weeks ago 1.02GB nginx 1.17 sha256:6fff55753e3b34e36e24e37039ee9eae1fe38a6420d8ae16ef37c92d1eb26699 9beeba249f3e 6 months ago 127MB

 -q : 仅显示 ID 信息

[root@alvin-test-os ~]# docker images -q 

74d107221092 
22fdec3d9a6d 
9beeba249f3e
2.3、 为镜像添加 tag

为了方便后续工作中使用特定的镜像,还可以使用 docker tag 命令来为本地的镜像添加标签。

[root@alvin-test-os ~]# docker images 

	REPOSITORY TAG IMAGE ID CREATED SIZE redis latest 74d107221092 19 hours ago 104MB [root@alvin-test-os ~]# docker tag redis:latest myredis:latest [root@alvin-test-os ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE myredis latest 74d107221092 19 hours ago 104MB redis latest 74d107221092 19 hours ago 104MB
2.4、 使用 inspect 命令查看详细信息
使用 docker inspect 命令获取镜像的详细信息,包括 PID、作者、架构等等。
[root@alvin-test-os ~]# docker inspect redis
	
	 [ { "Id": "sha256:74d107221092875724ddb06821416295773bee553bbaf8d888ababe9be7b947f", "RepoTags": [ "myredis:latest", "redis:latest" ],"RepoDigests": [ "redis@sha256:5b98e32b58cdbf9f6b6f77072c4915d5ebec43912114031f37fa5fa25b032489" ], 
	 ... 此处略去千百行
2.5、 使用 history 命令查看镜像历史
[root@alvin-test-os ~]# docker history redis 

注意:有些构建信息过长,可以使用–no-trunc 选项来输出完整信息。

2.6、 搜索镜像

在docker中搜索镜像主要使用Search子命令,默认只搜索Docker Hub官方镜像仓库中的镜像。其语法为docker search [option] keyword。支持的命令选项主要包括:
 -f : 过滤输出内容

# 搜索官方提供的带有 Redis 关键字的镜像 [root@alvin-test-os ~]# docker search -f is-official=true redis 

NAME DESCRIPTION STARS OFFICIAL AUTOMATED redis Redis is an open source key-value store that … 8779 [OK] 

# 搜索被收藏超过 8000 个的并且关键词包括 Redis 的镜像 [root@alvin-test-os ~]# docker search -f stars=8000 redis 

NAME DESCRIPTION STARS OFFICIAL AUTOMATED redis Redis is an open source key-value store that … 8779 [OK]

# --limit: 限制输出结果
[root@alvin-test-os ~]# docker search -f stars=8 --limit 3 redis

# --no-trunc: 不截断输出结果
[root@alvin-test-os ~]# docker search -f stars=8 --limit 3 --no-trunc redis
2.7、 输出参数释义

 NAME: 镜像仓库源的名称
 DESCRIPTION: 镜像的描述
 OFFICIAL: 是否 docker 官方发布
 stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。
 AUTOMATED: 自动构建。

2.8、 删除和清理镜像

在 docker 中,删除镜像主要使用 rmi 子命令,清理镜像主要使用 prune 子命令。

2.8.1、 使用标签删除镜像

使用 docker rmi 或 docker image rm 命令可以删除镜像,命令格式为 docker rmi image

[root@alvin-test-os ~]# docker rmi redis

参数: -f : 强制删除镜像。 
[root@alvin-test-os ~]# docker rmi -f redis
2.8.2、 清理镜像

使用一段时间之后,docker 会产生很多临时文件,以及一些没有被使用的镜像,我们可以通过 docker image prune 命令来进行清理。
参数:  -a :删除所有无用的镜像,不光是临时镜像。

# 查看原来的镜像 
[root@alvin-test-os ~]# docker images

# 删除所有的未被使用的镜像 
[root@alvin-test-os ~]# docker image prune -a

# -f :强制删除镜像,而不进行提示。 
[root@alvin-test-os ~]# docker image prune -a -f
2.9、 构建镜像

构建镜像一般有三种情况,基于容器导入、基于本地模板导入、基于 Dockerfile 创建,本章主讲基于容器保 存镜像和本地保存镜像导入。

2.9.1、 基于容器保存

主要格式:docker [container id] commit

主要参数:
-a ---- 作者信息
-m ---- 提交信息
-p ---- 提交时,暂停容器运行

启动一个容器、修改并保存

[root@alvin-test-os ~]# docker run -d -it centos /bin/bash

# 查看容器信息
[root@alvin-test-os ~]# docker ps
#进入容器并创建文件
[root@alvin-test-os ~]# docker exec 820a17fe3935 touch test
#保存 
[root@alvin-test-os ~]# docker commit -m "Add a file" -a "Alvin" 820a17fe3935 centos:v1
2.9.2、 基于本地模板导入
 用户也可以将保存的镜像传到另一台机器上,另一台机器就可以直接导入。
[root@alvin-test-os ~]# cat ubuntu-18.04-x86_64-minimal.tar.gz | docker import - ubuntu:18.04
2.9.3、保存镜像

有时我们需要将一台电脑上的镜像复制到另一台电脑上使用,除了可以借助仓库外,还可以直接将镜像保存成一 个文件,再拷贝到另一台电脑上导入使用。
对于镜像的导出和导入,Docker 提供了两种方案,下面分别进行介绍。

2.9.4、 使用 export 和 import
  export 和 import 的针对点是容器,将本机的容器导出为镜像包。 
2.9.5、 使用 export 保存容器为镜像
   [root@instance-gvpb80ao docs]# docker export daf9c3656be3 > nginx.tar [root@instance-gvpb80ao docs]# ll | grep nginx.tar
	-rw-r--r-- 1 root root 135117824 924 20:51 nginx.tar 
2.9.6、 使用 import 导入包为镜像
  [root@instance-gvpb80ao docs]# docker import nginx.tar test/nginx:v1
2.9.7、 使用 save 和 load

save 和 load 的针对的点是镜像,将本机的镜像导入、导出为镜像包。

2.9.8、 使用 save 保存镜像
 [root@instance-gvpb80ao docs]# docker save 6858809bf669 > busybox.tar 
 [root@instance-gvpb80ao docs]# ll | grep busy 

	-rw-r--r-- 1 root root 1458176 924 21:01 busybox.tar 
2.9.9、 使用 save 保存多个镜像
[root@instance-gvpb80ao docs]# docker save -o test.tar busybox nginx:1.18.0 
[root@instance-gvpb80ao docs]# docker load < test.tar
 Loaded image: busybox:latest
 Loaded image: nginx:1.18.0 
3.0、 使用 load 导入镜像
[root@instance-gvpb80ao docs]# docker load < busybox.tar [root@instance-gvpb80ao docs]# docker load -i busybox.tar 	

Loaded image ID: sha256:6858809bf669cc5da7cb6af83d0fae838284d12e1be0182f92f6bd96559873e3 
[root@instance-gvpb80ao docs]# docker images | grep 685880 

	busybox latest 6858809bf669 2 weeks ago 1.23MB
3.1、 两种方案的差别
3.1.0、 文件大小不同 export 导出的镜像文件体积小于 save 保存的镜像
3.1.2、 是否可以对镜像重命名 docker import 可以为镜像指定新名称,docker load 不能对载入的镜像重命名。
3.1.3、 是否可以同时将多个镜像打包到一个文件中 docker export 不支持,docker save 支持。
3.1.4、 是否包含镜像历史

export 导出(import 导入)是根据容器拿到的镜像,再导入时会丢失镜像所有的历史记录和元数据信息(即仅 保存容器当时的快照状态),所以无法进行回滚操作。

save 保存(load 加载)的镜像,没有丢失镜像的历史,可以回滚到之前的层(layer)。

 [root@instance-gvpb80ao docs]# docker history 6858809bf669cc5da7cb6af83d0fae838284d12e1be0182f92f6bd96559873e3 

	IMAGE CREATED CREATED BY SIZE COMMENT 6858809bf669 2 weeks ago /bin/sh -c #(nop) CMD ["sh"] 0B <missing> 2 weeks ago /bin/sh -c #(nop) ADD file:72be520892d0a903d… 1.23MB
3.1.5、 应用场景不同

docker export 的应用场景:主要用来制作基础镜像,比如我们从一个 ubuntu 镜像启动一个容器,然后安 装一些软件和进行一些设置后,使用 docker export 保存为一个基础镜像。然后,把这个镜像分发给其他人使用, 比如作为基础的开发环境。

docker save 的应用场景:如果我们的应用是使用 docker-compose.yml 编排的多个镜像组合,但我们要部 署的客户服务器并不能连外网。这时就可以使用 docker save 将用到的镜像打个包,然后拷贝到客户服务器上使 用docker load 载入。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值