目录
1、Docker概念
Docker 是一个开源的容器运行时软件(容器运行时是负责运行容器的软件),基于 Go 语言编写,并遵从 Apache2.0 协议开源。
Docker可以让开发者打包自己的应用以及依赖到一个轻量的容器中,然后发布到任何流行的Linux系统上(docker主要理念:一次封装随处运行)。
Docker的思想来源于集装箱,让容器与容器之间相互隔离,与系统相互隔离提高程序之间的安全,更重要的是容器性能开销极低。
2、为什么需要容器?
2.1、面临的问题
在项目迭代开发和部署过程中,运维人员不可避免会遇到这些情况:同样的代码需要被 部署到不同的运行环境中;由于运行环境不同导致项目部署失败,无法正常运行。
导致上述问题的原因可能不同。下面列举几种比较典型的原因。
- 运行环境发生了变化。例如,在开发阶段,代码是运行在程序员的本地环境 或测试环境中的;而在生产环境中,代码则被切换到集群环境或云平台上了。
- 代码的依赖发生了变化。例如,在开发阶段使用的是 JDK 1.7,而在生产环 境中使用的是JDK 1.8。
- 操作系统发生了变化。例如:在开发阶段使用的是Redhat Linux,而在生产 环境中使用的是CentOS。
- 随着系统架构不断变复杂,微服务架构得到了广泛的应用,这就要求每个功 能模块需要单独进行部署。图1-1展示了一个典型的微服务架构。
图1-1
- 对于开发人员而言,除需要关注业务代码本身的实现外,还需要额外花费精 力去处理这种底层执行环境的问题。
- 对于运维人员而言,需要考虑如何将开发人员新开发的业务代码不断集成与 发布。
有没有一种办法能使得开发人员和运维人员只要关注他们需要关注的问题,而不需要关 注其他的问题呢?答案是有的——使用虚拟化容器技术。
有了虚拟化容器技术,开发人员在业务开发过程中只需要关注业务代码的实现;而运维人 员也可以很方便地实现项目的持续集成与持续发布( CI/CD)。Docker是虚拟化容器技术中的 典型代表,也是云计算中的重点。
2.2、Docker虚拟化容器的价值
- 从系统的架构层面上看:Docker 可以方便地支持并实现微服务架构,从而更 方便灵活地实现架构的变化和系统的扩展。同时,Docker虚拟化容器有助于DevOps 的落地,可以大大提升开发效率,加速迭代。
- 从底层基础层面上看:利用Docker 虚拟化容器技术可以方便地实现系统的移 植,,帮助实现企业应用上云,让应用在自有数据中心和云端之间实现动态迁移。
随着云计算技术的不断发展,在产生Docker 虚拟化容器技术后,一批相关的虚拟化容 器管理技术也随之诞生,例如Kubernetes ( K8s)等。这样的工具极大地推动了技术的分工, 也极大地促进了技术和业务的创新。
3、Docker的组成部分
- Docker客户端:通常指Docker 提供的命令行工具,是Docker 最基本的用户接口。用户通过 Docker 客户端提交Docker指令,Docker守护进程接收并执行该指令。Docker 也有图形化的客户端工具
- Docker守护进程(Daemon):在Docker宿主机上运行Docker,实际上运行的是 Docker守护进程。用户并不 直接和Docker守护进程交互,而是通过 Docker客户端的命令来和它进行交互
- Docker镜像(images):一个Docker镜像是一个只读的模板。例如,一个Docker镜像可以包含一个 CentOS的操作系统、一个MySQL的数据库和一个Tomcat的应用服务器。 Docker镜像被用来创建Docker容器.Docker提供了一个简单的方式来构建一个 新的镜像或更新一个已经存在的镜像。用户也可以从镜像仓库下载其他人已经创 建好的Docker 镜像
- Docker容器(container):通过Docker镜像可以创建Docker容器。Docker的容器可以保存任何东西,而这 些东西是运行一个应用所必需的。可以把.Docker 容器看成是一个虚拟机。 Docker容器可以被运行、开启、停止、移动和删除。每一个容器都是一个分离 的、安全的应用平台。Docker容器是Docker的运行组件
- 镜像仓库(Repository):Docker的镜像仓库用于保存Docker镜像,它可以是公共的存储地方,也可以是 私有的存储地方。 1、公共的镜像仓库由Docker Hub提供,它提供了一个用户可以使用的已有镜 像的集合。这些集合中的镜像可以是你自己创建的,也可以是别人创建的。 2、私有的镜像仓库需要自己在私有环境中搭建,例如在企业内网中自行搭建。 Harbor是一个典型的私有的镜像仓库
最大的公开仓库为docker hub:https://hub.docker.com
国内的公开仓库包括:阿里、网易、中科大
4、Docker的体系架构
Docker是一个客户端服务器(Client-Server)架构。Docker 客户端和Docker守护进 程交流,而Docker守护进程是运作Docker 的核心,起着非常重要的作用(如构建、运行和分 发Docker容器等)。
我们在使用Docker 创建容器时需要有镜像。镜像是一个只读的模板。而存放镜像的地 方叫作“镜像仓库”。镜像仓库,可以是公有镜像仓库(例如官方提供的公有镜像仓库 Docker Hub),也可以是私有镜像仓库(例如 Harbor)。
下图展示了Docker的体系架构
5、容器的应用场景
容器非常适合持续集成和持续交付(CI / CD)工作流程,开发人员在本地写代码推送到仓库,通过集成服务器拉取代码后并使用 Docker 封装成镜像,镜像推送到测试环境中,并执行自动或手动测试。测试完成后,将镜像推送到生产环境部署
6、Docker资源汇总
- Docker 官方主页:https://www.docker.com
- Docer 官方博客::https://blog.docker.com/
- Docker 官方文档:https://docs.docker.com/
- Docker Cloud(云平台文档): https://cloud.docker.com
- Docker Hub: https://hub.docker.com
- Docker Hub备用地址:https://hub-stage.docker.com/
- Docker 常见问题:https://docs.docker.com/engine/faq/
7、Docker版本介绍
Docker 从 1.17.0 版本之后分为:
- CE(Community Edition: 社区版)免费,功能有限,不提供官方技术支持。
- EE(Enterprise Edition: 企业版)收费,功能全面,提供官方技术支持。
8、安装Docker
Docker 实现虚拟化的本质是:在已经运行的Linux中创建了一个逻辑隔离的运行环境。 因此,其执行效率几乎等同于宿主机的 Linux主机。
Docker必须部署在Linux系统上。如果想在其他系统(如Windows)上部署Docker,则 需要先安装一个虚拟 Linux环境。下图列举了本案例所使用的实验环境。
8.1、安装Linux操作系统
略...
8.2、使用YUM方式安装Docker
YUM的全称是Yellow dogUpdater Modified。利用YUM方式可以很方便地添加、删 除和更新Linux系统的程序包,并且能够自动解决包的依赖性问题。使用 YUM也能够方便地 管理大量的系统更新问题。一般使用YUM方式需要连接外部的网络。
(1)为了验证虚拟机是否可以访问外部的网络,这里输入以下的命令访问百度主页。
[root@centos7-6 ~]# ping www.baidu.com
PING www.a.shifen.com (183.2.172.42) 56(84) bytes of data.
64 bytes from 183.2.172.42 (183.2.172.42): icmp_seq=29 ttl=128 time=9.29 ms
64 bytes from 183.2.172.42 (183.2.172.42): icmp_seq=30 ttl=128 time=10.5 ms
64 bytes from 183.2.172.42 (183.2.172.42): icmp_seq=31 ttl=128 time=10.6 ms
(2)执行以下命令使用YUM方式安装Docker。
[root@centos7-6 ~]# yum -y install docker
(3)安装完成后的界面如下所示。
已安装:
docker.x86_64 2:1.13.1-209.git7d71120.el7.centos
作为依赖被安装:
atomic-registries.x86_64 1:1.22.1-33.gitb507039.el7_8 container-selinux.noarch 2:2.119.2-1.911c772.el7_8
container-storage-setup.noarch 0:0.11.0-2.git5eaf76c.el7 containers-common.x86_64 1:0.1.40-11.el7_8
docker-client.x86_64 2:1.13.1-209.git7d71120.el7.centos docker-common.x86_64 2:1.13.1-209.git7d71120.el7.centos
fuse-overlayfs.x86_64 0:0.7.2-6.el7_8 fuse3-libs.x86_64 0:3.6.1-4.el7
oci-register-machine.x86_64 1:0-6.git2b44233.el7 oci-systemd-hook.x86_64 1:0.2.0-1.git05e6923.el7_6
oci-umount.x86_64 2:2.5-3.el7 python-dmidecode.x86_64 0:3.12.2-4.el7
python-pytoml.noarch 0:0.1.14-1.git7dea353.el7 python-syspurpose.x86_64 0:1.24.53-1.el7.centos
slirp4netns.x86_64 0:0.4.3-4.el7_8 subscription-manager.x86_64 0:1.24.53-1.el7.centos
subscription-manager-rhsm.x86_64 0:1.24.53-1.el7.centos subscription-manager-rhsm-certificates.x86_64 0:1.24.53-1.el7.centos
完毕!
[root@centos7-6 ~]#
(4)执行以下命令启动Docker服务和开机自启。
[root@centos7-6 ~]# systemctl start docker.service
[root@centos7-6 ~]# systemctl enable docker.service
(5)执行以下命令确定Docker的版本。
[root@centos7-6 ~]# docker version
Client:
Version: 1.13.1
API version: 1.26
Package version: docker-1.13.1-209.git7d71120.el7.centos.x86_64
Go version: go1.10.3
Git commit: 7d71120/1.13.1
Built: Wed Mar 2 15:25:43 2022
OS/Arch: linux/amd64
Server:
Version: 1.13.1
API version: 1.26 (minimum version 1.12)
Package version: docker-1.13.1-209.git7d71120.el7.centos.x86_64
Go version: go1.10.3
Git commit: 7d71120/1.13.1
Built: Wed Mar 2 15:25:43 2022
OS/Arch: linux/amd64
Experimental: false
从上面信息可以看到,Docker分为Client 端和 Server端,当前安装的Docker是1.13.1版 本。
8.3、使用二进制包方式安装Docker
使用YUM方式安装Docker非常简单,但需要连接外部的网络。而在实际的企业生产环 境中,通常不能直接访问外部的网络。这时可以使用Docker 官方提供的二进制包进行Docker 的离线安装。下图展示的是Docker官方提供的二进制包下载网页。
(1)安装wget下载工具。
[root@centos7-6 ~]# yum -y install wget
(2)下载Docker安装包。
- 地址:https://download.docker.com/linux/static/stable/x86_64/
[root@centos7-6 ~]# wget https://download.docker.com/linux/static/stable/x86_64/docker-20.10.9.tgz
(3)使用tar命令解压缩Docker二进制安装包。
[root@centos7-6 ~]# tar -zxvf docker-20.10.9.tgz
(4)查看Docker二进制包提供的执行命令。
[root@centos7-6 ~]# ls docker
containerd containerd-shim containerd-shim-runc-v2 ctr docker dockerd docker-init docker-proxy runc
(5)将Docker的可执行命令复制到“/usr/bin”目录下。
[root@centos7-6 ~]# cp docker/* /usr/bin/
(6)执行以下命令启动Docker服务。启动成功后输出日志信息如下所示。
[root@centos7-6 ~]# /usr/bin/dockerd
INFO[2023-11-20T15:41:28.369015828+08:00] Starting up
WARN[2023-11-20T15:41:28.381360490+08:00] could not change group /var/run/docker.sock to docker: group docker not found
INFO[2023-11-20T15:41:28.389154362+08:00] libcontainerd: started new containerd process pid=10317
INFO[2023-11-20T15:41:28.389270573+08:00] parsed scheme: "unix" module=grpc
INFO[2023-11-20T15:41:28.389311029+08:00] scheme "unix" not registered, fallback to default scheme module=grpc
INFO[2023-11-20T15:41:28.389358570+08:00] ccResolverWrapper: sending update to cc: {[{unix:///var/run/docker/containerd/containerd.sock <nil> 0 <nil>}] <nil> <nil>} module=grpc
INFO[2023-11-20T15:41:28.389378858+08:00] ClientConn switching balancer to "pick_first" module=grpc
INFO[2023-11-20T15:41:28.608666397+08:00] starting containerd revision=5b46e404f6b9f661a205e28d59c982d3634148f8 version=v1.4.11
(7)新开启一个命令窗口,执行以下语句查看 Docker 的版本信息(包括 Docker 客 户端与Docker服务器端的版本),可以看到Docker的版本为20.10.9
[root@centos7-6 ~]# /usr/bin/docker version
Client:
Version: 20.10.9
API version: 1.41
Go version: go1.16.8
Git commit: c2ea9bc
Built: Mon Oct 4 16:03:22 2021
OS/Arch: linux/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.9
API version: 1.41 (minimum version 1.12)
Go version: go1.16.8
Git commit: 79ea9d3
Built: Mon Oct 4 16:07:30 2021
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: v1.4.11
GitCommit: 5b46e404f6b9f661a205e28d59c982d3634148f8
runc:
Version: 1.0.2
GitCommit: v1.0.2-0-g52b36a2d
docker-init:
Version: 0.19.0
GitCommit: de40ad0
(8)在“/etc/systemd/system/docker.service”文件中输入以下内容:
[root@centos7-6 ~]# vim /etc/systemd/system/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
(9)在创建“/etc/systemd/system/docker.service”文件后,需要给该文件添加可 执行权限。
[root@centos7-6 ~]# chmod u+x /etc/systemd/system/docker.service
(10)启动Docker,并设置Docker为开机自启模式。
[root@centos7-6 ~]# systemctl daemon-reload
[root@centos7-6 ~]# systemctl start docker.service
[root@centos7-6 ~]# systemctl enable docker.service
至此,通过使用二进制包完成了Docker安装。不管使用YUM方式还是二进制包方式, 在安装完成后,Docker的使用方式是完全一样的。