Docker学习01:介绍与安装

一、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)运行具有“ 虚拟机管理程序”对主机资源的虚拟访问权的成熟“来宾”操作系统。
Docker学习01:介绍与安装_第1张图片

容器化与虚拟机对比

特性 容器 虚拟机
启动速度 秒级 分钟级
硬盘使用 一般为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学习01:介绍与安装_第2张图片

下面是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 访问测试

Docker学习01:介绍与安装_第3张图片

六、容器相关操作

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

你可能感兴趣的:(Docker)