Docker是一个开源的容器运行和管理引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署。既可以在物理服务器上运行,也可以在虚拟机上运行。容器本身由多个只读层(容器镜像)加上一个读写层构成。如下图所示:
本文主要围绕容器和容器的相关操作命令进行描述。
Docker可以在一台物理机上同时运行多个容器而不互相影响。与传统的虚拟化技术不同,传统的虚拟化技术是将一台物理机模拟成多个互不影响的虚拟机,各个虚拟机都是独立而完整的操作系统,资源使用和较多。而一台物理机上的多个Docker容器是共享宿主机的操作系统,从而资源使用较少。除此之外,Docker容器还具有以下特点:
启动速度快:可以秒级启动
应用在沙箱内独立运行,相互没有影响
性能开销小:几乎没有额外资源开销
天然具备开发,运维一体部署的特性。
所以,Docker通常用于如下场景:
Web应用的自动化打包和发布。
自动化测试的持续集成和发布。
复杂应用的自动编排部署。
构建自身的的PaaS环境。
Docker的核心概念主要包括:容器,镜像,仓库。如下图所示:
Docker的整体架构如下:
Docker的命令状态转换图如下:
与容器相关的操作命令如下:
docker version #查看宿主机上的Docker版本信息
docker info # 查看Docker宿主上的容器详细信息,包括镜像和容器数量。
docker ps [options] # 查看当前Docke宿主机上的容器信息
主要的参数如下:
-a 列出所有的容器,包括停止和死亡状态(dead)的容器。
-f []列出满足过滤条件的容器
-l 仅列出最新创建的一个容器
-q 仅列出容器ID
docker create [options] image:tag #基于某个镜像创建一个容器而不启动
docker start CONTAINER_ID ... # 启动一个或多个容器,容器ID之间用空格隔开。
docker restart CONTAINER_ID ... #重启一个或多个容器,容器ID之间用空格隔开。
docker pause|unpause CONTAINER_ID ...#暂停|恢复一个或多个容器进程,容器ID之间用空格隔开。
docker kill CONTAINER_ID ...#杀掉一个或多个容器进程,容器ID之间用空格隔开。
docker stop CONTAINER_ID ...# 停止一个或多个容器,容器ID之间用空格隔开。
docker run [options] image:tag [ commands ]
# 基于某个镜像运行一个容器。等同于[docker pull]+docker create + docker start三个命令的集合。基本原理如下:如果当前宿主机的本地没有指定的镜像(imageName:imageTag),需要利用docker pull 从镜像仓库(默认Docker Hub)中拉取该镜像 ;如果有指定的镜像,则运行docker create 命令进行容器的创建,如果创建成功,则执行docker start 命令进行启动;如果失败,则返回容器运行失败。
docker rm [options] CONTAINER_ID...
#删除一个或者多个容器,默认运行状态的容器不能删除,可以通过增加 -f 参数来进行强制删除。此外,-l参数移除容器之间的网络关联;-v参数移除容器关联的数据卷。批量操作宿主机上的容器可以用如下命令来实现:
批量停止容器:docker stop $(docker ps -q)
批量重启容器:docker restart$(docker ps -q)
批量删除容器:docker rm [-f] $(docker ps -a -q)
批量杀掉容器进程:docker kill [-f] $(docker images -q)
docker attach CONTAINER_ID
#进入到指定ID的容器中,attach命令弹出的窗口是同步显示的,一个窗口阻塞之后,其他窗口也无法进行操作。执行exit或者Ctrl+c 退出后,容器也随之停止。
docke exec -it CONTAINER_ID /bin/bash
#以伪终端的方式和指定的容器进行交互,输入exit退出后,当前容器仍然可以继续运行。
docker login #登录到Docker Hub中
docker logout #退出Docker Hub。
docker logs CONTAINER_ID #查看指定容器的输入日志。
下一篇我们将就Docker 镜像以及对镜像的详细操作来进行描述。