2013年3月推出的Docker,可以和操作系统协作来打包、分法和运行软件。Docker是一个工具,可以帮助解决如何安装、拆卸、升级、分发、信任和管理软件等常见问题。Docker包括一个命令行程序、一个后台守护进程,以及一组远程服务。它解决了常见的软件问题,并简化了安装、运行、发布和删除软件。这一切能够实现是通过使用一项UNIX技术,称为容器。

容器

容器可以隔离所有的资源,但是手动创建容器比较复杂,而且很容易出错。Docker的出现解决了这个问题,任何使用Docker运行的软件其实是在一个容器内运行。Docker使用现有的容器引擎,根据最佳实践提供一致的Docker构建方案。使用Docker,降低了用户获得容器的成本。

容器不是虚拟化

在没有Docker之前,我们使用虚拟机提供虚拟的硬件,可安装一个操作系统和其他程序。虽然这种方案也能够提供隔离。但是创建虚拟机非常耗时,而且资源开销大,因为虚拟机除了要执行你需要的软件,还要运行整个操作系统的副本。

Docker与虚拟机不同,Docker容器不使用硬件虚拟化。运行Docker容器中的程序接口和主机的Linux内核直接打交道。因为容器中运行的程序和计算机的操作系统之间没有额外的中间层,没有资源被冗余软件的运行或虚拟化硬件的模拟而浪费掉。这是一个很重要的区别。Docker不是一个虚拟化技术。相反,它可以帮助使用已经内置到操作系统中的容器技术。

Docker并不提供容器技术,但它使得容器更易于使用。Docker使用的是2007年就已经成为Linux一部分的Linux命名空间和cgroups管理着运行时的容器。

Docker可以认为是在用户空间运行着的两个程序。一个是始终处于运行状态的Docker守护进程。另一个是Docker CLI,它是与用户交互的Docker程序。如果要启动、停止或安装软件,你可以使用Docker CLI执行相应的命令。

容器都是以Docker守护程序的子进程运行,封装在容器中,并授权其在自身用户空间的存储子空间中运行。在容器中运行的程序,只能访问属于自己的该容器审定过的内存空间和资源。

Docker构建的容器隔离包括8个方面,具体如下:

  • PID命名空间 - 进程标识符和能力
  • UTS命名空间 - 主机名和域名
  • MNT命名空间 - 文件系统访问和结构
  • IPC命名空间 - 通过共享内存的进程间通信
  • NET命名空间 - 网络访问和结构
  • USR命名空间 - 用户名和标识
  • chroot() - 控制文件系统根目录的位置
  • cgroups - 资源保护

Docker可以执行、复制和轻松地分发容器。Docker通过一种打包和分发的软件,完成传统容器的封装。这个用来充当容器分发角色的组建被称为镜像

Docker镜像,是一个容器中运行程序的所有文件的捆绑快照。你可以从镜像中创建无数容器,但是,从相同的镜像启动的容器不共享文件系统的更改。当你使用Docker分发软件,其实就是分发这些镜像,并在接收的机器上创建容器。镜像在Docker生态系统中是可交付的基本单位。

Docker主要解决了三大问题,一是使我们的机器组织有序,二是提供可移植性,三是通过容器隔离保护我们的机器安全。

在容器中运行软件

创建和启动一个新容器

# 创建和启动一个Nginx容器
docker run --detach \
--name web nginx:latest    

# 创建和启动一个邮件容器
docker run -d \
--name mailer dockerinaction/ch2_mailer

选项--detach(缩写-d),后台启动程序。当你要在后台运行容器的守护程序或其它程序时使用此选项。

运行交互式容器

# 创建交互式容器,启动一个UNIX shell
docker run --interactive --tty \
--link web:web \
--name web_test \
busybox:latest /bin/sh

# 创建和启动一个监控容器
docker run -it \
--name agent \
--link web:insideweb \
--link mailer:insidemailer \
dockerinaction/ch2_agent

选项--interactive(缩写-i)告诉Docker保持标准输入对容器开发,即使容器没有终端连接。

选项--tty(缩写-t)告诉Docker为容器分配一个虚拟终端,这将允许你发信号给容器。

终端分离容器,通过按住【ctrl】(或【control】)键,然后按【P】键,接着按【Q】键。只要使用了–tty选项,终端分离容器的操作才会生效。

列举容器

docker ps

运行该命令显示每个运行的容器中的以下信息

  • 该容器ID - CONTAINER ID
  • 使用的镜像 - IMAGE
  • 容器中执行的命令 - COMMAND
  • 容器运行的时长 - CREATED
  • 容器运行的状态 - STATUS
  • 容器暴露的网络端口 - STATUS
  • 容器名 - NAMES

重新启动

docker restart [容器名]

停止

docker stop [容器名]

启动

docker start [容器名]

查看容器日志

docker logs [容器名]