一、Docker 介绍
1.1 Docker 由来
Docker 使用 Google 公司推出的 Go 语言进行开发实现(k8s也是Go语言),基于 Linux 内核的cgroup,namespace,以及 AUFS 类的 Union FS 等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。最初实现是基于 LXC,从 0.7 版本以后开始去除 LXC,转而使用自行开发的 libcontainer,从 1.11 开始,则进一步演进为使用 runC 和 containerd。
1.2Docker 概述
Docker是供开发人员和系统管理员 使用容器构建,运行和共享应用程序的平台。
Docker是一个用于开发,交付和运行应用程序的开放平台。Docker使您能够将应用程序与基础架构分开,从而可以快速交付软件。借助Docker,您可以以与管理应用程序相同的方式来管理基础架构。通过利用Docker的快速交付,测试和部署代码的方法,您可以大大减少编写代码和在生产环境中运行代码之间的延迟。
容器化越来越受欢迎,因为容器是:
- 灵活:即使最复杂的应用程序也可以容器化。
- 轻量级:容器利用并共享主机内核,在系统资源方面比虚拟机更加有效。
- 可移植性:您可以在本地构建,部署到云并在任何地方运行。
- 松散耦合:容器是高度自给自足并封装的容器,使您可以在不破坏其他容器的情况下更换或升级它们。
- 可扩展:您可以在数据中心内增加并自动分发容器副本。
- 安全:容器将积极的约束和隔离应用于流程,而无需用户方面的任何配置。
1.3 docker 底层技术
Docker用Go编写,并利用Linux内核的多个功能来交付其功能。
docker容器本质上是宿主机的**进程**. 可以把docker容器内部跑的进程看作是宿主机的线程。
Docker通过namespace实现了资源隔离
Docker通过cgroups实现了资源限制
1.4 容器化 VS 虚拟化对比
容器在Linux上本地运行,并与其他容器共享主机的内核。它运行一个离散进程,不占用任何其他可执行文件更多的内存,从而使其轻巧。
相比之下,虚拟机(VM)运行具有“ 虚拟机管理程序”对主机资源的虚拟访问权的成熟“来宾”操作系统。
容器化与虚拟机对比
特性 | 容器 | 虚拟机 |
---|---|---|
启动速度 | 秒级 | 分钟级 |
硬盘使用 | 一般为MB | 一般为GB |
性能 | 接近原生 | 弱于 |
系统支持量 | 单机支持上千个容器 | 一般几十个 |
管理效率 | 管理简单 | 概念里复杂 |
二、为什么要使用 docker
更高效的利用系统资源
由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。
更短的启动时间
传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用是直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。
一致的运行环境
开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 「这段代码在我机器上没问题啊」 这类问题。
持续交付和部署
对开发和运维(DevOps)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 Dockerfile 来进行镜像构建,并结合持续集成(Continuous Integration) 系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合持续部署(Continuous Delivery/Deployment) 系统进行自动部署。而且使用 Dockerfile 使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。
更轻松的迁移
由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。
更轻松的维护和扩展
Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。
三、Docker 架构说明
Docker使用C/S架构。Docker client与Docker daemon进行对话,该daemon完成了构建,运行和分发Docker容器的繁重工作。Docker客户端和守护程序可以 在同一系统上运行,或者您可以将Docker客户端连接到远程Docker守护程序。Docker客户端和守护进程使用REST API通过unix套接字或网络接口进行通信。
下面是Docker核心组件及元素说明:
-
Docker Daemon
dockerd,用来监听Docker API的请求和管理Docker对象,比如镜像、容器、网络和Volume。 -
Docker Client
docker,docker client是我们和Docker进行交互的最主要的方式方法,比如我们可以通过docker run 命令来运行一个容器,然后我们的docker client会把命令发送给上面的Dockerd,主它来负责处理。 -
Docker Registry
用来存储Docker镜像的仓库,Docker hub是官方提供的一个公共仓库,而且Docker默认也是从Docker Hub上查找镜像的。当然你也可以很方便的运行一个私有仓库,当我们使用docker pull或者docker run命令时,就会从我们配置的docker镜像仓库中去拉取镜像,使用docker push时,会将我们构建的镜像推送到对应的镜像仓库中。 -
Docker objects
使用Docker时,您正在创建和使用映像,容器,网络,卷,插件和其他对象。
-
Images
镜像,镜像是一个只读模板 ,带有创建docker容器的说明。一般来说,镜像会基于另外的一些基础镜像构建并加上一些额外的自定义功能。比如你可以构建一个基于centos的镜像,然后在这个基础镜像上面安装一个Nginx应用,这样就可以构建成属于我们自己的镜像了。 -
Containers
容器,容器是一个镜像的运行实例。可以使用Docker REST API或者CLI来操作容器。容器的实质是进程,但与直接在宿主机执行的进程不同,容器进行运行于属于自己独立的命名空间。因此容器可以拥有自己的root文件系统、自己的网络配置、自己的进程空间,甚至自己的用户id空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主机运行更加案例。 -
SERVICES
服务,允许您跨多个Docker守护进程扩展容器,这些守护进程与多个管理器和工作人员一起工作。集群中的每个成员都是一个Docker守护进程,这些守护进程都使用Docker API进行通信。服务允许您定义所需的状态,例如在任何给定时间必须可用的服务副本的数量。默认情况下,服务跨所有工作节点进行负载平衡。对于使用者来说,Docker服务似乎是一个单独的应用程序。Docker引擎在Docker 1.12及更高版本中支持集群模式。
-
四、Docker 环境安装
1. 配置 docker-ce的yum源
- 下载docker官方ce版(地址在国外,下载速度非常慢)
wget https://download.docker.com/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
- 使用国内源(这里以Aliyun为例)
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
2. 安装 docker-ce
注意:要安装docker-ce版,不要安装docker(否则可能安装1.13老版本)
yum install -y docker-ce
3. 启动 docker
systemctl start docker
systemctl enable docker
4. 查看 docker 版本
[root@docker ~]# docker -v
Docker version 19.03.8, build afacb8b
[root@docker ~]# docker version
Client: Docker Engine - Community
Version: 19.03.8
API version: 1.40
Go version: go1.12.17
Git commit: afacb8b
Built: Wed Mar 11 01:27:04 2020
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 19.03.8
API version: 1.40 (minimum version 1.12)
Go version: go1.12.17
Git commit: afacb8b
Built: Wed Mar 11 01:25:42 2020
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.2.13
GitCommit: 7ad184331fa3e55e52b890ea95e65ba581ae3429
runc:
Version: 1.0.0-rc10
GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd
docker-init:
Version: 0.18.0
GitCommit: fec3683
5.配置docker 镜像加速
五、运行第一个容器
5.1 拉取镜像
[root@docker ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
c499e6d256d6: Already exists
74cda408e262: Already exists
ffadbd415ab7: Already exists
Digest: sha256:282530fcb7cd19f3848c7b611043f82ae4be3781cb00105a1d593d7e6286b596
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
5.2 运行容器
[root@docker ~]# docker run --name app -d -p 8080:80 nginx
751e1cdc6e261f59aaba21ea893571076bbc33372137077c4b1ca94794f1dcfb
# --name 指定名称
# -d 后台运行
# -p 暴露端口
5.3 查看运行的容器
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
751e1cdc6e26 nginx "nginx -g 'daemon of…" 26 seconds ago Up 26 seconds 0.0.0.0:8080->80/tcp app
5.4 访问测试
六、容器相关操作
6.1 查看容器日志
[root@docker ~]# docker logs app
10.4.7.1 - - [01/Apr/2020:12:17:42 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36" "-"
6.2 停止容器
[root@docker ~]# docker stop app
6.3 启动容器
[root@docker ~]# docker start app
6.4 查看容器详细信息
[root@docker ~]# docker inspect app
6.5删除容器
[root@docker ~]# docker rm -f app
app