docker容器与系统关系示意图
Docker与虚拟机之间的比较
Docker
是在操作系统进程层面的隔离,而虚拟机是在物理资源层面的隔离,两者完全不同,另外,我们也可以通过下面的一个比较,了解两者的根本性差异。
容器与虚拟机的比较【摘自《Docker-从入门到实践》】
从上面的容器与虚拟机的对比中,我们明白了容器技术的优势。
容器解决了开发与生产环境的问题
开发环境与生产环境折射的是开发人员与运维人员之间的矛盾,也许我们常常会听到开发人员对运维人员说的这样一句话:“在我的电脑运行没问题,怎么到了你那里就出问题了,肯定是你的问题”,而运维人员则认为是开发人员的问题。
开发人员需要在本机安装各种各样的测试环境,因此开发的项目需要软件越多,依赖越多,安装的环境也就越复杂。
同样的,运维人员需要为开发人员开发的项目提供生产环境,而运维人员除了应对软件之间的依赖,还需要考虑安装软件与硬件之间的兼容性问题。
就是这样,所以我们经常看到开发与运维相互甩锅,怎么解决这个问题呢?
容器就是一个不错的解决方案,容器能成为开发与运维之间沟通的语言,因为容器就像一个集装箱一样,提供了软件运行的最小化环境,将应用与其需要的环境一起打包成为镜像,便可以在开发与运维之间沟通与传输。
Docker的版本
Docker
分为社区版(CE
)和企业版(EE
)两个版本,社区版本可以免费使用,而企业版则需要付费使用,对于我们个人开发者或小企业来说,一般是使用社区版的。
Docker CE
有三个更新频道,分别为stable
、test
、nightly
,stable
是稳定版本,test
是测试后的预发布版本,而nightly
则是开发中准备在下一个版本正式发布的版本,我们可以根据自己的需求下载安装。
如何安装Docker?
好了,通过前面的介绍,我们应该对Docker
有了初步的了解,下面开始进入Docker
的学习之旅了。
而学习Docker
的第一步,从安装Docker
运行环境开始,我们以Docker
的社区版本(CE
)安装为例。
Docker
社区版本提供了Mac OS
,Microsoft Windows
和Linux
(Centos
,Ubuntu
,Fedora
,Debian
)等操作系统的安装包,同时也支持在云服务器上的安装,比如AWS Cloud
。
在Windows系统上安装
Docker Desktop for Windows
Docker
为Windows
提供了一个桌面应用程序管理的安装包(Docker Desktop for Windows
),不过对系统有以下几点要求:
- 必须是
64
位Windows10
专业版,企业版,教育版,构建在15063
或更高版本,
- 在
BIOS
中启用虚拟化。通常,默认情况下启用虚拟化。
- 至少有
4GB
内存。
CPU
支持SLAT
。
如果操作系统满足上面的要求,则可以直接下载安装包直接安装,在安装成功后,Docker
并不会自动启动,需要我们自己启动,我们可以在开始菜单中找到Docker
,如下图,单击启动便可启动。
Docker Toolbox
如果系统达不到上面的要求,比如说你用的是Windows 7
操作系统,这时候要想使用Docker
,便需要借助Docker Toolbox
,Docker Toolbox
是Docker
提供的在比较旧的Mac OS
,Windows
操作系统上安装Docker
环境的工具集。
Docker Toolbox
包括docker-cli(就是我们在终端使用的docker命令行工具)
,docker-compose(多容器管理工具)
,docker-mecahine
,VirtualBox(虚拟机)
,Kitematic(docker的GUI管理工具)
。
本质上使用Docker Toolbox
安装Docker
环境,实际上是在VirtualBox
中创建一个Linux
虚拟机,并在虚拟机上安装Docker
。
另外,在安装过程中会开启Windows
的Hyper-V
模块(Windows
操作系统实现虚拟化的一种技术),这里面有个要注意的点是如果开启了Hyper-V
,则VirtualBox
不再生效了。
在Mac OS上安装
如同Windows
操作系统一样,Docker
为Mac OS
也一样提供一个桌面应用程序(Docker Desktop for Mac
),比较简单,从docker
官网上下载Dokcer.dmg
安装,打开Docker.dmg
,如下图所示:
直接拖动Docker
图标便完成了安装。
对于比较老的Mac OS
操作系统,也可以像Windows
一样,使用Docker Toolbox
,这点可以参考上面的介绍。
在Mac OS
上安装完成之后,在Application
中找到Docker
图标,双击打开便可以启动Docker
了,如下:
在Linux上安装
在Linux
操作系统上的安装,主要以Centos7
为例,其他Linux
系统的发行版本,如Ubuntu
,Debian
,Fedora
等,可以自行查询Docker
的官方文档。
删除旧的docker版本
可能有些Linux
预先安装Docker
,但一般版本比较旧,所以可以先执行以下代码来删除旧版本的Docker
。
$ sudo dnf remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine
指定安装版本
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
使用yum安装docker
$ sudo yum install docker-ce docker-ce-cli containerd.io
启动docker服务器
测试安装是否成功
通过上面几种方式安装了Docker
之后,我们可以通过下面的方法来检测安装是否成功。
打印docker版本
拉取镜像并运行容器
运行上面的命令之后,如果有如下图所示的输出结果,则说明安装已经成功了。
Docker的基本概念
镜像(Image
)、容器(Container
)与仓库(Repository
),这三个是docker
中最基本也是最核心的概念,对这三个概念的掌握与理解,是学习docker
的关键。
镜像(Image)
什么是Docker
的镜像?
Docker
本质上是一个运行在Linux
操作系统上的应用,而Linux
操作系统分为内核和用户空间,无论是Centos
还是Ubuntu
,都是在启动内核之后,通过挂载Root
文件系统来提供用户空间的,而Docker镜像就是一个Root文件系统。
Docker
镜像是一个特殊的文件系统,提供容器运行时所需的程序、库、资源、配置等文件,另外还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。
镜像是一个静态的概念,不包含任何动态数据,其内容在构建之后也不会被改变。
下面的命令是一些对镜像的基本操作,如下:
查看镜像列表
由于我们前面已经拉取了hello-world
镜像,所以会输出下面的内容:
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest fce289e99eb9 7 months ago 1.84kB
下面的命令也一样可以查看本地的镜像列表,而且写法更简洁。
从仓库拉取镜像
前面我们已经演示过使用docker pull
命令拉取了hello-world
镜像了,当然使用docker image pull
命令也是一样的。
一般默认是从Docker Hub
上拉取镜像的,Docker Hub
是Docker
官方提供的镜像仓库服务(Docker Registry
),有大量官方或第三方镜像供我们使用,比如我们可以在命令行中输入下面的命令直接拉取一个Centos
镜像:
docker pull centos
docker pull
命令的完整写法如下:
docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
拉取一个镜像,需要指定Docker Registry
的地址和端口号,默认是Docker Hub
,还需要指定仓库名和标签,仓库名和标签唯一确定一个镜像,而标签是可能省略,如果省略,则默认使用latest作为标签名,另外,仓库名则由作者名和软件名组成。
那么,我们上面使用centos
,那是因为省略作者名,则作者名library
,表示Docker
官方的镜像,所以上面的命令等同于:
docker pull library/centos:latest
因此,如果拉取非官方的第三方镜像,则需要指定完整仓库名,如下:
docker pull mysql/mysql-server:latest
运行镜像
使用docker run
命令,可以通过镜像创建一个容器,如下:
docker run -it centos /bin/bash
删除镜像
当本地有些镜像我们不需要时,那我们也可以删除该镜像,以节省存储空间,不过要注意,如果有使用该镜像创建的容器未删除,则不允许删除镜像。
删除镜像的快捷命令:
docker rmi image_name/image_id
好了,关于Docker
镜像的相关知识,我们就简单地介绍到这里,有机会的话,我们单独写一篇文章来谈谈,特别构建Docker
镜像部分的相关知识,有必要深入再学习一下。
容器(Container)
Docker
的镜像是用于生成容器的模板,镜像分层的,镜像与容器的关系,就是面向对象编程中类与对象的关系,我们定好每一个类,然后使用类创建对象,对应到Docker
的使用上,则是构建好每一个镜像,然后使用镜像创建我们需要的容器。
启动和停止容器
启动容器有两种方式,一种是我们前面已经介绍过的,使用docker run
命令通过镜像创建一个全新的容器,如下:
docker run hello-world
另外一种启动容器的方式就是启动一个已经停止运行的容器:
要停止正在运行的容器可以使用docker container stop
或docker stop
命令,如下:
查看所有容器
如果要查看本地所有的容器,可以使用docker container ls
命令:
查看所有容器也有简洁的写法,如下:
删除容器
我们也可以使用docker container rm
命令,或简洁的写法docker rm
命令来删除容器,不过不允许删除正在运行的容器,因此如果要删除的话,就必须先停止容器,
当我们需要批量删除所有容器,可以用下面的命令:
进入容器
仓库(Repository)
在前面的例子中,我们使用两种方式构建镜像,构建完成之后,可以在本地运行镜像,生成容器,但如果在更多的服务器运行镜像呢?很明显,这时候我们需要一个可以让我们集中存储和分发镜像的服务,就像Github可以让我们自己存储和分发代码一样。
Docker Hub
就是Docker提供用于存储和分布镜像的官方Docker Registry
,也是默认的Registry
,其网址为https://hub.docker.com
,前面我们使用docker pull
命令便从Docker Hub
上拉取镜像。
Docker Hub
有很多官方或其他开发提供的高质量镜像供我们使用,当然,如果要将我们自己构建的镜像上传到Docker Hub
上,我们需要在Docker Hub
上注册一个账号,然后把自己在本地构建的镜像发送到Docker Hub
的仓库当中,Docker Registry
包含很多个仓库,每个仓库对应多个标签,不同标签对应一个软件的不同版本。
Docker的组成与架构
在安装好并启动了Docker
之后,我们可以使用在命令行中使用docker
命令操作docker,比如我们使用如下命令打印docker
的版本信息。
docker verion
其结果如下:
从上面的图中,我们看到打出了两个部分的信息:Client
和Server
。
这是因为Docker
跟大部分服务端软件一样(如MySQL
),都是使用C/S
的架构模型,也就是通过客户端调用服务器,只是我们现在刚好服务端和客户端都在同一台机器上而已。
因此,我们可以使用下面的图来表示Docker
的架构,DOCKER_HOST
是Docker server
,而Clinet便是我们在命令中使用docker
命令。
Docker Engine
docker server
为客户端提供了容器、镜像、数据卷、网络管理等功能,其实,这些功能都是由Docker Engine
来实现的。
dockerd
:服务器守护进程。
Client docker Cli
:命令行接口
REST API
:除了cli命令行接口,也可以通过REST API
调用docker
下面是Docker Engine
的示例图:
小结
作为一名开发人员,在学习或开发过程中,总需要安装各种各样的开发环境,另外,一个技术团队在开发项目的过程,也常常需要统一开发环境,这样可能避免环境不一致引发的一些问题。
虽然使用虚拟机可以解决上面的问题,但虚拟机太重,对宿主机资源消耗太大,而作为轻量级容器技术,Docker
可以简单轻松地解决上述问题,让开发环境的安装以及应用的部署变得非常简单,而且使用Docker
,比在虚拟机安装操作系统,要简单得多。