Docker入门与应用系列(一)介绍与部署

时间:2023-03-09 08:31:40
Docker入门与应用系列(一)介绍与部署

Docker介绍

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

Docker是Docker.inc公司开源的一个基于LXC技术之上构建的Container容器引擎,源代码托管在GitHub上,基于Go语言并遵从Apache2.0协议开源(可以商业)。

Docker项目的目标是实现轻量级的操作系统虚拟化解决方案。

Docker是通过内核虚拟化技术(namespaces及cgroups等)来提供容器的资源隔离与安全保障等。由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要类似虚拟机VM额外的操作系统开销,提高资源利用率。

Docker的工作模式

docker组成

docker client

docker server

docker组件

镜像(image)

容器(container)

仓库(repository)

docker是dicker.inc公司开源的一个基于LXC技术之上构建的Container容器引擎,源代码托管在GitHub上,基于Go语音并遵从Apache2.0协议开源

docker是通过内核虚拟化技术(namespaces及cgroups等)来提供容器的资源隔离与安全保障等。由于docker通过操作系统层的虚拟化实现隔离,所以docker容器在运行时,不需要类似虚拟化(VMware)额外的操作系统开销,提供资源利用率

学习Docker的源码并不是一个枯燥的过程,反而可以从中理解Docker架构的设计原理。

Docker对使用者来讲是一个C/S模式的架构,而Docker的后端是一个非常松耦合的架构,模块各司其职,并有机组合,支撑Docker的运行。

用户是使用Docker Client与Docker Daemon建立通信,并发送请求给后者。

而Docker Daemon作为Docker架构中的主体部分,首先提供Server的功能使其可以接受Docker Client的请求;而后Engine执行Docker内部的一系列工作,每一项工作都是以一个Job的形式的存在。

Job的运行过程中,当需要容器镜像时,则从Docker Registry中下载镜像,并通过镜像管理驱动graphdriver将下载镜像以Graph的形式存储;当需要为Docker创建网络环境时,通过网络管理驱动networkdriver创建并配置Docker容器网络环境;当需要限制Docker容器运行资源或执行用户指令等操作时,则通过execdriver来完成。而libcontainer是一项独立的容器管理包,networkdriver以及execdriver都是通过libcontainer来实现具体对容器进行的操作。当执行完运行容器的命令后,一个实际的Docker容器就处于运行状态,该容器拥有独立的文件系统,独立并且安全的运行环境等。

内核空间是 kernel,Linux 刚启动时会加载 bootfs 文件系统,之后 bootfs 会被卸载掉。

用户空间的文件系统是 rootfs,包含我们熟悉的 /dev, /proc, /bin 等目录。

对于 base 镜像来说底层直接用 Host 的 kernel,自己只需要提供 rootfs 就行了。

应用场景

1、简化配置,统一配置,通过镜像快速启动(Simplifying)

2、代码流水线管理,开发环境->测试环境->预生产环境->灰度发布->正式发布,docker在这里实现了快速迁移(Code Oioeline Management)

3、开发效率,对开发人员,有了镜像,直接启动容器即可(Developer Productivity)

4、应用隔离,相对于虚拟机的完全隔离会占用资源,docker会比较节约资源(App lsolation)

5、服务器整合,一台服务器跑多个docker容器,提高服务器的利用率(Server Consolidation)

6、调试能力,debug调试(Debugging Capabilties)

7、多租户,一个租户多个用户,类似于阿里公有云的一个project下多个用户(Multi-tenancy)

8、快速部署,不需要启动操作系统,实现秒级部署(Rapid Deplovment)

开发模式

1.共享基础容器

2.共享卷开发容器

3.开发工具容器

4.不同环境下测试容器

5.构建容器

6.安装容器

7.盒子中默认服务容器

8.基础设施/粘合剂容器

基本事实

1.容器不同于虚拟机

2.容器不如虚拟机来得成熟

3.容器可以在几分之一秒内启动

4.容器已在大规模环境证明了自身的价值

5.IT人员称容器为轻量级

6.容器引发了安全问题

7.Docker已成为容器的代名词,但它不是唯一的提供者

8.容器能节省IT人力,加快更新

9.容器仍面临一些没有解决的问题

提示:在这里可以简单的说一下,有些场景是不适合用到docker。例如我前端web使用docker,此时docker挂掉了,里面不会像数据库那样有数据写入。这时候我从新起一个docker就可以了。所以有的场景是不适合使用docker的

Docker三大核心概念

docker组件(C/S)

docker client:docker的客户端

docker server:docker daemon的主要组成部分,接收用户通过dockerclient发送的请求,并按照相应的路由规则实现路由分发。

docker镜像:docker镜像运行之后变成容器/(docker run)

docker registry:registry是docker镜像的*存储仓库(pull/push)

镜像(image)

Docker镜像就是一个只读的模板。

例如:一个镜像可以包含一个完整的CentOS操作系统环境,里面仅安装了Apache或用户需要的其他应用程序。

镜像可以用来创建Docker容器。

Docker提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。

容器(container)

Docker利用容器来运行应用。

容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的,保证安全的平台。

可以把容器看做是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。

注意:镜像是只读的,容器在启动的时候创建一层可写层作为最上层。

仓库(repository)

仓库是集中存放镜像文件的场所。有时候把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。

仓库分为公开仓库(Public)和私有仓库(Private)两种形式。

最大的公开仓库是Docker Hub,存放了数量庞大的镜像供用户下载。国内的公开仓库包括Docker Pool等,可以提供大陆用户更稳定快读的访问。

当用户创建了自己的镜像之后就可以使用push命令将它上传到公有或者私有仓库,这样下载在另外一台机器上使用这个镜像时候,只需需要从仓库上pull下来就可以了。

注意:Docker仓库的概念跟Git类似,注册服务器可以理解为GitHub这样的托管服务。

docker能做什么

1.1 简化配置  Simplifying Configuration

这是Docker公司宣传的Docker的主要使用场景。虚拟机的最大好处是能在你的硬件设施上运行各种配置不一样的平台(软件、系统),Docker在降低额外开销的情况下提供了同样的功能。它能让你将运行环境和配置放在代码中然后部署,同一个Docker的配置可以在 不同的环境中使用,这样就降低了硬件要求和应用环境之间耦合度。

1.2 代码流水线(Code Pipeline Management)管理

前一个场景对于管理代码的流水线起到了很大的帮助。代码从开发者的机器到最终在生产环境上的部署,需要经过很多的中间环境。而每一个中间环境都有自己微小的差别,Docker给应用提供了一个从开发到上线均一致的环境,让代码的流水线变得简单不少。

1.3 提高开发效率 Developer Productivity

这就带来了一些额外的好处:Docker能提升开发者的开发效率。如果你想看一个详细一点的例子,可以参考Aater在DevOpsDays Austin 2014 大会或者是DockerCon上的演讲。不同的开发环境中,我们都想把两件事做好。一是我们想让开发环境尽量贴近生产环境,二是我们想快速搭建开发环境。理想状态中,要达到第一个目标,我们需要将每一个服务都跑在独立的虚拟机中以便监控生产环境中服务的运行状态。然而,我们却不想每次都需要网络连 接,每次重新编译的时候远程连接上去特别麻烦。这就是Docker做的特别好的地方,开发环境的机器通常内存比较小,之前使用虚拟的时候,我们经常需要为 开发环境的机器加内存,而现在Docker可以轻易的让几十个服务在Docker中跑起来。

1.4 隔离应用  App lsolation

有很多种原因会让你选择在一个机器上运行不同的应用,比如之前提到的提高开发效率的场景等

1.5 整合服务器

正如通过虚拟机来整合多个应用,Docker隔离应用的能力使得Docker可以整合多个服务器以降低成本。由于没有多个操作系统的内存占用,以及能在多个实例之间共享没有使用的内存,Docker可以比虚拟机提供更好的服务器整合解决方案

1.6 调试能力

Docker提供了很多的工具,这些工具不一定只是针对容器,但是却适用于容器。它们提供了很多的功能,包括可以为容器设置检查点、设置版本和查看两个容器之间的差别,这些特性可以帮助调试Bug。你可以在《Docker拯救世界》的文章中找到这一点的例证。

1.7 多租户环境

另外一个Docker有意思的使用场景是在多租户的应用中,它可以避免关键应用的重写。我们一个特别的关于这个场景的 例子是为IoT(译者注:物联网)的应用开发一个快速、易用的多租户环境。这种多租户的基本代码非常复杂,很难处理,重新规划这样一个应用不但消耗时间, 也浪费金钱。

使用Docker,可以为每一个租户的应用层的多个实例创建隔离的环境,这不仅简单而且成本低廉,当然这一切得益于Docker环境的启动速度和其高效的diff命令。

1.8 快速部署

在虚拟机之前,引入新的硬件资源需要消耗几天的时间。Docker的虚拟化技术将这个时间降到了几分钟,Docker只是创建一个容器进程而无需启动操作系统,这个过程只需要秒级的时间。这正是Google和Facebook都看重的特性。

你可以在数据中心创建销毁资源而无需担心重新启动带来的开销。通常数据中心的资源利用率只有30%,通过使用Docker并进行有效的资源分配可以提高资源的利用率。

小结: 一句话说明docker的本质就是 低开销(系统文件、内存 共用)的虚拟机

1.9 Docker改变了什么?

面向产品:产品交付

面向开发:简化环境配置

面向测试:多版本测试

面向运维:环境一致

面向架构:自动化扩容(微服务)

CentOS7部署

版本说明

ce社区 

ee企业版 

官方安装文档:https://docs.docker.com/engine/installation/linux/docker-ce/centos/#docker-ee-customers

1.1 安装依赖包和添加Docker软件包源

[root@linux-node1 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
[root@linux-node1 ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
[root@linux-node1 ~]# yum makecache fast

1.2安装Docker CE

注意:如果上面没有添加docker的源,你直接yum安装的docker版本会很低的

[root@linux-node1 ~]# yum install docker-ce

1.3 查看下载版本

[root@linux-node1 ~]# docker version
Client:
Version: 17.12.0-ce
API version: 1.35
Go version: go1.9.2
Git commit: c97c6d6
Built: Wed Dec 27 20:10:14 2017
OS/Arch: linux/amd64

Server:
Engine:
Version: 17.12.0-ce
API version: 1.35 (minimum version 1.12)
Go version: go1.9.2
Git commit: c97c6d6
Built: Wed Dec 27 20:12:46 2017
OS/Arch: linux/amd64
Experimental: false

1.4 启动docker并加入开机自启动项

[root@linux-node1 ~]# systemctl start docker
[root@linux-node1 ~]# systemctl enable docker

1.5 测试验证

[root@linux-node1 ~]# docker run hello-world
Unable to find image 'hello-world:latest' locally
Trying to pull repository docker.io/library/hello-world ...
latest: Pulling from docker.io/library/hello-world
5b0f327be733: Pull complete
Digest: sha256:07d5f7800dfe37b8c2196c7b1c524c33808ce2e0f74e7aa00e603295ca9a0972

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
. The Docker client contacted the Docker daemon.
. The Docker daemon pulled the "hello-world" image from the Docker Hub.
. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
https://cloud.docker.com/

For more examples and ideas, visit:
https://docs.docker.com/engine/userguide/

由于本地没有hello-world这个镜像,所以会下载一个hello-world的镜像,并在容器内运行
1.6 网卡信息

[root@linux-node1 ~]# ifconfig
docker0: flags=<UP,BROADCAST,MULTICAST> mtu
inet 172.17.0.1 netmask 255.255.0.0 broadcast 0.0.0.0
inet6 fe80:::56ff:fe36:3c46 prefixlen  scopeid 0x20<link>
ether ::::3c: txqueuelen  (Ethernet)
RX packets  bytes  (76.0 B)
RX errors  dropped  overruns  frame
TX packets  bytes  (180.0 B)
TX errors  dropped  overruns  carrier  collisions 

eth0: flags=<UP,BROADCAST,RUNNING,MULTICAST> mtu
inet 10.0.0.30 netmask 255.255.255.0 broadcast 10.0.0.255
inet6 fe80::20c:29ff:fe8e:7ec2 prefixlen  scopeid 0x20<link>
ether :0c::8e:7e:c2 txqueuelen  (Ethernet)
RX packets  bytes  (44.4 MiB)
RX errors  dropped  overruns  frame
TX packets  bytes  (900.3 KiB)
TX errors  dropped  overruns  carrier  collisions 

lo: flags=<UP,LOOPBACK,RUNNING> mtu
inet 127.0.0.1 netmask 255.0.0.0
inet6 :: prefixlen  scopeid 0x10<host>
loop txqueuelen  (Local Loopback)
RX packets  bytes  (0.0 B)
RX errors  dropped  overruns  frame
TX packets  bytes  (0.0 B)
TX errors  dropped  overruns  carrier  collisions   

Ubuntu安装

官方Ubuntu 16.04存储库中提供的Docker安装包可能不是最新版本。要获得最新最伟大的版本,请从官方的Docker存储库中安装Docker。本节将向您展示如何做到这一点。
首先,向系统添加官方Docker存储库的GPG密钥:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

add-apt-repository 是由 Python-software-properties这个工具包提供的,所以要先安装python-software-properties 才能使用 add-apt-repository

apt-get install python-software-properties
apt-get update 

将Docker存储库添加到APT源:

add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

接下来,使用来自新添加的repo的Docker包更新包数据库:

apt-get update

确保你要安装的是Docker repo而不是默认的Ubuntu 16.04 repo:

apt-cache policy docker-ce

您应该看到类似于下面的输出:

docker-ce:
Installed: (none)
Candidate: ~ce-~ubuntu-xenial
Version table:
~ce-~ubuntu-xenial
 https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
~ce-~ubuntu-xenial
 https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages

请注意,Docker - ce没有安装,但是安装的候选者来自于Ubuntu 16.04的Docker存储库。docker - ce版本号可能不同。最后,安装docker:

apt-get install -y docker-ce

现在应该安装Docker了,守护进程启动了,进程启动了。检查运行:

systemctl status docker

输出应该类似如下,显示服务是活动的和运行的:

docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Sun -- :: CDT;  weeks  days ago
Docs: https://docs.docker.com

直接下载rpm包的方式来安装

https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/edge/Packages/
必须下载两个文件,安装要一起安装,因为有依赖性
下载如下文件:
docker-ce-17.03.0.ce-1.el7.centos.x86_64.rpm
docker-ce-selinux-17.03.0.ce-1.el7.centos.noarch.rpm
安装

[root@localhost ~]# ll
total
-rw-r--r--.  root root  Apr  : .sh
-rw-------.  root root  Apr  : anaconda-ks.cfg
-rw-r--r--.  root root  Apr  : docker-ce-.ce-.el7.centos.x86_64.rpm
-rw-r--r--.  root root  Apr  : docker-ce-selinux-.ce-.el7.centos.noarch.rpm
[root@localhost ~]# yum localinstall *
Loaded plugins: fastestmirror, langpacks
Skipping: .sh, filename does not end in .rpm.
Skipping: anaconda-ks.cfg, filename does not end in .rpm.
Examining docker-ce-.ce-.el7.centos.x86_64.rpm: docker-ce-.ce-.el7.centos.x86_64
Marking docker-ce-.ce-.el7.centos.x86_64.rpm to be installed
Examining docker-ce-selinux-.ce-.el7.centos.noarch.rpm: docker-ce-selinux-.ce-.el7.centos.noarch
Marking docker-ce-selinux-.ce-.el7.centos.noarch.rpm to be installed
Skipping: ist, filename does not end in .rpm.
#解决下载慢问题
[root@localhost ~]# curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://04be47cf.m.daocloud.io
docker version >= 1.12
{"registry-mirrors": ["http://04be47cf.m.daocloud.io"]}
Success.
You need to restart docker to take effect: sudo systemctl restart docker
[root@localhost ~]# systemctl restart docker