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 [容器名] |