Docker06:Docker理解(网络资源整合)

一、为什么使用Docker?Docker到底是什么?

1.环境配置难题

软件开发最大的麻烦事之一,就是环境配置。用户计算机的环境都不相同,你怎么知道自家的软件,能在那些机器跑起来?

用户必须保证两件事:操作系统的设置,各种库和组件的安装。只有它们都正确,软件才能运行。举例来说,安装一个 Python 应用,计算机必须有 Python 引擎,还必须有各种依赖,可能还要配置环境变量。

如果某些老旧的模块与当前环境不兼容,那就麻烦了。开发者常常会说:"它在我的机器可以跑了"(It works on my machine),言下之意就是,其他机器很可能跑不了。

环境配置如此麻烦,换一台机器,就要重来一次,旷日费时。很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说,安装的时候,把原始环境一模一样地复制过来。

2.虚拟机

虚拟机(virtual machine)就是带环境安装的一种解决方案。它可以在一种操作系统里面运行另一种操作系统,比如在 Windows 系统里面运行 Linux 系统。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。

虽然用户可以通过虚拟机还原软件的原始环境。但是,这个方案有几个缺点。

(1)资源占用多

虚拟机会独占一部分内存和硬盘空间。它运行的时候,其他程序就不能使用这些资源了。哪怕虚拟机里面的应用程序,真正使用的内存只有 1MB,虚拟机依然需要几百 MB 的内存才能运行。

(2)冗余步骤多

虚拟机是完整的操作系统,一些系统级别的操作步骤,往往无法跳过,比如用户登录。

(3)启动慢

启动操作系统需要多久,启动虚拟机就需要多久。可能要等几分钟,应用程序才能真正运行。

3.Linux容器

由于虚拟机存在这些缺点,Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)。

Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。

由于容器是进程级别的,相比虚拟机有很多优势。

(1)启动快

容器里面的应用,直接就是底层系统的一个进程,而不是虚拟机内部的进程。所以,启动容器相当于启动本机的一个进程,而不是启动一个操作系统,速度就快很多。

(2)资源占用少

容器只占用需要的资源,不占用那些没有用到的资源;虚拟机由于是完整的操作系统,不可避免要占用所有资源。另外,多个容器可以共享资源,虚拟机都是独享资源。

(3)体积小

容器只要包含用到的组件即可,而虚拟机是整个操作系统的打包,所以容器文件比虚拟机文件要小很多。

总之,容器有点像轻量级的虚拟机,能够提供虚拟化的环境,但是成本开销小得多。

4.Docker是什么?

Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。

Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。

总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。

5.Docker的用途

Docker 的主要用途,目前有三大类。

(1)提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。

(2)提供弹性的云服务。因为 Docker 容器可以随开随关,很适合动态扩容和缩容。


(3)组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。

二、Docker基础

1.Docker的引擎

Docker的是基于Linux自带的(Linux。 Containers,LXC)技术,在LXC上,Docker进行了近一步封装。

2.Docker的原理

容器有效的将单个操作系统管理的资源划分到孤立的组中,以便更好的在孤立的组之间平衡有冲突的资源使用需求。与虚拟化相比,这样既不需要指令级模拟,也不需要即时编译。容器可以在核心CPU本地运行指令,而不需要任何专门的解释机制。此外,也避免了准虚拟化(paravirtualization)和系统调用替换中的复杂性。

简而言之就是,Docker是一个盒子,一个盒子装一个玩具,无论你丢在哪里,你给他通电(glibc),他就能运行。你的玩具大就用大盒子,小玩具就用小盒子。

两个应用之间的环境是环境是完全隔离的,建立通信机制来互相调用。容器的创建和停止都十分快速(秒级),容器自身对资源的需求十分有限,远比虚拟机本身占用的资源少。

3.Docker架构

Docker06:Docker理解(网络资源整合)

用面向对象的思想来看,image(镜像)就相当于类,container(容器)就相当于对象

Images: Docker镜像是用于创建Docker容器的模板

Container:容器是独立运行的一个或一组应用  

Client:Docker 客户端通过命令行或者其他工具使用 

             Docker API (https://docs.docker.com/reference/api/docker_remote_api) 与 Docker 的守护进程通信。

Host:一个物理或虚拟的机器,用于执行Docker守护进程和容器

Registry:Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。

                  Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。

4.Docker架构说明

Docker06:Docker理解(网络资源整合)Docker06:Docker理解(网络资源整合)

Docker是C/S(客户端client-服务器server)架构模式。

Docker通过客户端连接守护进程,通过命令向守护进程发出请求,守护进程通过一系列的操作返回结果。

Docker客户端可以连接本地或者远程的守护进程。

Docker客户端和服务器通过socket或RESTful API进行通信。

总结:

Docker 采用的是 Client/Server 架构。客户端向服务器发送请求,服务器负责构建、运行和分发容器。客户端和服务器可以运行在同一个 Host 上,客户端也可以通过 socket 或 REST API 与远程的服务器通信。

1)Docker客户端

最常用的 Docker 客户端是 docker CLI (command line interface),通过 docker CLI我们可以方便地在 Host 上构建和运行容器

2)Docker服务器

Docker daemon 是服务器组件,以 Linux 后台服务的方式运行。

Docker06:Docker理解(网络资源整合)

Docker daemon 运行在 Docker host 上,负责创建、运行、监控容器,构建、存储镜像。

默认配置下,Docker daemon 只能响应来自本地 Host 的客户端请求。如果要允许远程客户端请求,需要在配置文件中打开 TCP 监听

步骤如下:

[1] 编辑配置文件
编辑配置文件 /etc/systemd/system/multi-user.target.wants/docker.service
/usr/lib/systemd/system/docker.service
在环境变量 ExecStart 后面添加 -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock,允许来自任意 IP 的客户端连接。

~~~

$ vim /usr/lib/systemd/system/docker.service

~~~

Docker06:Docker理解(网络资源整合)

[2] 重启 Docker daemon

~~~

$ systemctl daemon-reload
$ systemctl restart docker.service

~~~

#查看端口是否开启

netstat -nptl

#直接curl看是否生效

curl http://127.0.0.1:2375/info

[3] 开放Docker服务器的2375端口,并重启docker

~~~

$ firewall-cmd --zone=public --add-port=2375/tcp --permanent
$ firewall-cmd --reload
$ service docker restart

~~~

[4] 与远程Docker服务器通信

服务器 IP 为 192.168.1.23,客户端在命令行里加上 -H 参数,即可与远程服务器通信。

~~~

docker -H 192.168.1.23 images

~~~

Docker06:Docker理解(网络资源整合)

[5] 测试完后,关闭Docker服务器的2375端口,防止黑客利用2375端口入侵服务器

~~~

$ firewall-cmd --zone=public --remove-port=2375/tcp --permanent
$ firewall-cmd --reload
$ service docker restart

~~~

官方解决方案:
https://docs.docker.com/engine/security/https/

5.主要组件与概念介绍

1)Docker Image

可将 Docker 镜像看着只读模板,通过它可以创建 Docker 容器。

例如某个镜像可能包含一个 Ubuntu 操作系统、一个 Apache HTTP Server 以及用户开发的 Web 应用。

镜像有多种生成方法:

 [1] 可以从无到有开始创建镜像

 [2] 也可以下载并使用别人创建好的现成的镜像

 [3]还可以在现有镜像上创建新的镜像

我们可以将镜像的内容和创建步骤描述在一个文本文件中,这个文件被称作 Dockerfile,通过执行 docker build 命令可以构建出 Docker 镜像

2)Docker Container

Docker 容器就是 Docker 镜像的运行实例。

用户可以通过 Docker CLI 或是 API 启动、停止、移动或删除容器。

3)Docker Registry

Registry 是存放 Docker 镜像的仓库,Registry 分私有和公有两种。

Docker Hub(https://hub.docker.com/) 是默认的 Registry,由 Docker 公司维护,上面有数以万计的镜像,用户可以自由下载和使用。

出于对速度或安全的考虑,我们可以创建自己的私有 Registry。

docker pull 命令可以从 Registry 下载镜像。

docker run 命令则是先下载镜像(如果本地没有),然后再启动容器。