Docker简介
什么是Docker?
- Docker是一个容器引擎,提供了一套完整的容器解决方案。
- Docker是2014年最火热的开源项目,由Docker公司(www.docker.com)领导开发,基于Apache2.0开源授权协议发行。
- Docker是用Go语言开发的,其源码在https://github.com/docker/docker。
- Docker的官方文档在https://docs.docker.com。
什么是容器?
- 容器是一种历史悠久的虚拟化技术,如OpenVZ,Solaris上的Zones,Linux上的LXC等,都是容器的不同实现方式。
- 一个容器实质上就是运行在宿主机上的一个进程。只不过在启动这个进程之前,进行了一些特殊处理,让这个进程进入了一个全新的虚拟环境,与宿主机环境分开,所以这个进程以及它的子进程认为自己运行在一个独立的世界里面。
容器的优势
- 相比于传统的KVM、ZEN等虚拟化及半虚拟化技术来说:
- 创建容器速度快,速度在1秒左右,而传统虚拟机需要15秒以上。
- 删除容器速度快,速度也在几秒左右。
- 容器在运行期间占用的额外开销非常小。在一个宿主机上,能运行的容器数量更多。
正因为容器的这些轻、快的特点,所以容器技术右叫做“轻量虚拟化”技术,在很多场合下,容器技术比传统虚拟化技术更有优势。
Docker之前的各种容器技术,最大问题是使用起来不方便,只有少数技术高手才能熟练应用。而Docker的最大优势就是让容器的管理变得极其方便,不需要掌握高深的技术就能使用。
什么是Docker镜像?
每个Docker容器运行在独立的虚拟环境中,虚拟环境包括多个方面,其中最重要的就是独立的文件系统;在这个文件系统的读写操作,即不影响宿主机的文件系统,也不影响其他容器的文件系统。
Docker镜像是一个比较复杂的概念,现阶段,我们可以简单地把Docker镜像理解成一个目录。Docker Server在启动容器的时候,先根据这个镜像目录,复制出一个新的目录,然后在容器进程启动时,让这个进程chroot到这个新的目录下。这样,这个目录就成了这个容器的根文件系统(rootfs)。
Tips: 在宿主机中使用chroot aufs/mnt/容器编号 可以进入容器的文件系统
查看镜像:
通过docker images指令来查看本地有哪些镜像
- 镜像ID:每个镜像有一个唯一的ID,长度为64个字符。通常只使用前12个字符就可以了
- 镜像TAG:每个镜像上可以打上一个或多个TAG
- 镜像Repository:每个镜像存储在一个仓库中
- Repositoty:TAG 唯一标识了一个镜像
Docker Registry:
- 镜像和镜像仓库存储在Registry中
- 本地Registry:通过docker images查看的就是本地Redistry
- 官方Registry:Docker官方维护了一个Registry,里面存储了各种各样的镜像。
从官方Registry拉取镜像:
Docker刚安装完,本地Registry是空的。因此我们需要从Docker官方Registry来拉取镜像。docker pull命令用于从官方Registry拉取镜像。
如果从Docker官方Registry拉取镜像的速度很慢,可以尝试daocloud提供的加速器服务。https://dashboard.daocloud.io/mirror有详细使用方法介绍。
运行容器:
docker run命令用于运行容器。
docker run是最常用也是最复杂的命令,通过docker help run我们可以看到该命令有很多选项,其中最常用的选项包括:
- -i -t 这两个选项经常一起使用,可以缩写为-it,用于创建交互式容器。
- -d 让容器运行在后台,用于创建守护式容器。
- --name 为容器指定一个名称
容器运行成功后,会返回一个64字符的容器ID,作为容器的唯一标识。类似于镜像ID,容器ID也可以采用简写形式。
运行交互式容器:
通过如下命令来运行一个交互式容器:
sudo docker run -it centos:6 /bin/bash
- -it 指定要创建交互容器
- centos:6 以仓库:TAG的形式指定了镜像名称
- /bin/bash 容器对应的进程,会启动一个新的shell
通过如上的命令,我们启动了新的shell,并运行在容器环境中。由于是一个交互式容器,所有我们会离开当前的shell,被这个新的shell带入到容器的虚拟世界中,此后我们在这个shell里面执行的任何命令,都是相对于这个虚拟世界的。
当我们在新的shell里面执行exit,就结束了这个bash进程,从而也结束了这个容器,我们从虚拟世界又返回到宿主机的现实世界。
交互式容器适合一些临时性的任务,当退出bash的时候,交互式容器的生命也就结束了。大多数场合下,我们需要的是守护式容器。
通过如下方式运行守护式容器:
sudo docker run -d redis
- -d 创建守护式容器
- redis 镜像名称 这里只有仓库名称,没有指定TAG,那么就使用默认TAG‘latest’
没有指定命令,那么会使用镜像所提供的默认命令。redis镜像的默认命令是/entrypoint.sh redis-server
守护式容器运行在后台,这样我们就可以继续留在当前shell中进行其他操作。
通过docker ps命令可以查看容器的基本信息,包括容器ID、命令、状态等;
sudo docker ps 查看运行中的容器
Tips : 在上述命令后加上-a ,可以查看所有运行过的容器,包括已经退出的。
docker ps命令只能查看容器的基本信息;
docker inspect命令则可以查看容器的详细信息。
sudo docker inspect [ID]
docker inspect返回的信息是JSON格式的,非常丰富。有时候我们需要获取这些信息来进行二次开发。
docker inspect -f 则可以指定查看某种信息,例如查看容器的IP地址:
sudo docker inspect -f '{{.NetworkSettings.IPAddress}}' [ID]
docker stop命令用来停止一个正在运行的守护式容器
sudo docker stop [ID]
docker rm命令用来删除容器:
sudo docker rm [ID]
Tips:容器停止后,并不会被自动删除
删除完之后再运行docker ps -a,会发现容器已经消失了
安装Docker:
目前Docker已可以安装到绝大多数Linux发行版上,包括Ubuntu、CentOS、Redhat等,也可以安装到苹果Mac OS上。
需要注意的是,目前Docker只支持64位操作系统。
- 通过uname -i,如果是x86_64则为64位操作系统
- 确认Linux内核版本>=3.10,通过uname -r可以查看到内核版本信息。
在Ubuntu系统上通过apt-get命令来安装软件
Ubuntu官方软件仓库提供了Docker的稳定版,通过如下步骤进行安装:
- sudo apt-get update
- sudo apt-get install docker.io
- 运行 ps axf|grep docker来验证
- 运行sudo docker version查看docker版本
可以从Docker的私有软件仓库来安装最新版,安装步骤如下:
在Ubuntu上,按如下方式来启动和运行Docker server:
Docker架构
Docker是一个经典的CS架构:
- Docker Server:它是一个守护进程(Daemon),一直运行在后台。它其中内嵌了一个Web Server。
- Docker Client:它是一个命令行工具,通过HTTP协议与Docker Server交互
- 巧妙的是,Docker Server与Docker Client共用同一个可执行文件。通过which docker这个命令就可以找到它安装后的路径。
Docker应用实验
实验描述:
- 先创建一个守护式容器A运行Redis Server
- 再创建一个交互式容器B,在里面安装Redis客户端
- 最后使用Redis客户端去访问Redis Server
本实验模拟了需要两个机器,分别运行客户端和服务端程序的场景
实验步骤:
- 拉取Redis镜像
- 创建守护式容器A,运行Redis Server
- 获取A的IP地址
- 创建交互式容器B
- 在B里面安装Redis客户端
- 从B中访问容器A的Redis数据库。
回顾:
什么是Docker?
什么是容器?
如何安装Docker?
Docker镜像和镜像仓库。
Docker容器的创建、删除、停止、查看等基本命令。