Docker 是一种开源的容器化平台,允许开发者将应用程序及其所有依赖项(库、配置文件、环境变量等)打包成一个标准化、轻量级的单元,称为"容器"。这个容器可以在任何支持 Docker 的环境中快速、可靠地运行。
- 可以屏蔽底层操作系统的差异性,可以让应用程序不管在哪里都能使用容器的环境正常运行,从而保证了开发测试环保局与生产环境的一致性
- 容器部署起来非常便捷和迅速,可以大大缩短应用部署的周期时间
核心概念
镜像
- 创建容器的基础
- 一个只读的模板文件,里面包含运行容器中的应用程序所需要的所有资料(比如应用程序执行文件、配置文件、动态库文件、依赖包、系统文件和目录等)
- 如一个镜像可以包含 Ubuntu 操作系统、Nginx 服务器和你的网站代码
容器
- 用镜像运行的实例
- 可以被创建、启动、停止、删除,每个容器之间默认是相互隔离的
- 实质是一个独立的进程,但拥有自己独立的运行环境
Dockerfile
- 一个文本文件,里面包含了一系列指令(如 FROM, RUN, COPY, CMD 等),用于定义如何自动构建一个 Docker 镜像。
- 实现了应用构建的自动化和可重复性
仓库
- 用来集中保存镜像的地方
- 有公有仓库和私钥仓库之分
容器与虚拟机
隔离环境一般使用虚拟机或Docker,其区别如下:
- | Docker | 虚拟机 |
---|---|---|
启动速度 | 秒级 | 分钟级 |
计算能力损耗 | 几乎无 | 损耗 50%左右 |
性能 | 接近原生 | 弱于 |
系统支持量(单机) | 上千个 | 几十个 |
隔离性 | 通过namespace实现资源隔离,通过cgroup实现限制资源的最大使用量 | 完全隔离,每个虚拟机都有独立的硬件 |
内核 | 所有容器共享宿主机的内核 | 每个虚拟机都有独立的操作系统和内核 |
两种技术的层级如下图,可以看到docker有着比虚拟机更少的抽象层,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源,因此其启动效率更高。

Docker 的使用
Docker 的安装在此处不再赘述。以运行一个最经典的 Nginx 服务器容器为例,Docker的使用主要包括以下步骤:
- 准备镜像:从公有仓库中下载,或个人准备
- 创建并运行容器:基于镜像文件来创建一个容器实例。可以创建并运行一步到位,也可以先创建、再创建分开执行
准备镜像
镜像的准备有两种方法:在公有仓库中下载、个人自己准备镜像
从公有仓库中下载镜像
- 搜索镜像:
- docker search <镜像名称>,如docker search nginx。
- 其中OFFICIAL表示是官方镜像
- 拉取(下载)镜像:将镜像从远程仓库(默认是 Docker Hub)下载到本地仓库
- docker pull <镜像名>[:标签],如docker pull nginx:latest
- <镜像名>:通常是 [仓库名/]镜像名 的格式。如果不指定仓库名,则默认为官方库的library/下的镜像
-
:标签\]:代表指定镜像的版本。若不写,则默认为latest最新版
- docker images 或 docker images ls
- 可以看到镜像的名称、标签、ID、创建时间和大小
自己准备镜像
自己准备好镜像,为压缩包格式
创建并运行容器
1.可以直接创建并运行
- docker run -d -p 8080:80 --name my-nginx-container nginx
- -d:后台运行,容器启动后,终端控制权还给你,而不是被容器的日志输出占用
- -p 8080:80: 端口映射。将容器内部的 80 端口映射到宿主机的 8080 端口
- -p <宿主机端口>:<容器内部端口>
- --name my-nginx-container:为容器指定一个自定义名称。如果不指定,Docker 会随机生成一个名字。指定名称便于后续管理
- nginx:指定用来创建容器的镜像名
2.先创建、再运行
- 容器创建:即将镜像加载到容器
- 新创建的容器默认处于停止状态,不运行任何程序,需要在其中发起一个进程来启动容器
- docker create [选项] 镜像
- 常用选项
- -i:让容器开启标准输入接受用户输入命令
- -t:让 Docker 分配一个伪终端 tty
- 一般合起来使用,即-it,来实现和容器交互的作用,运行一个交互式会话 shell
- 常用选项
- 容器运行
- 格式:docker start 容器的ID/名称
- 容器的ID需要在查看容器的结果中获取
- 格式:docker start 容器的ID/名称
容器的运行
容器是一个与其中运行的 shell 命令/进程共存亡的终端,命令/进程运行容器运行, 命令/进程结束容器退出。
docker 容器默认会把容器内部第一个进程,也就是 pid=1 的程序作为docker容器是否正在运行的依据,如果docker容器中 pid = 1 的进程挂了,那么docker容器便会直接退出,也就是说Docker容器中必须有一个前台进程,否则认为容器已经挂掉
当利用 docker run 来创建容器时, Docker 在后台的标准运行过程是
- 检查本地是否存在指定的镜像。当镜像不存在时,会从公有仓库下载;
- 利用镜像创建并启动一个容器;
- 分配一个文件系统给容器,在只读的镜像层外面挂载一层可读写层;
- 从宿主主机配置的网桥接口中桥接一个虚拟机接口到容器中;
- 分配一个地址池中的 IP 地址给容器;
- 执行用户指定的应用程序,执行完毕后容器被终止运行。
查看容器
- 容器在后台运行后,可以查看以确认它的状态
- docker ps:只查看正在运行的容器
- docker ps -a:查看所有容器(包括已停止的)
- 可以看到容器的 ID、状态、端口映射信息和名称
进入容器
使用 docker exec 命令进入运行着的容器
停止/退出容器
停止容器的方法有二:
- 外部的命令行:docker stop 容器的ID/名称
- 对于不同的容器主进程,方法不一样
- 若容器的主进程是 Shell,可以使用exit命令来退出shell命令,从而停止容器运行
- 若容器的主进程是后台服务(如 Nginx, Redis),则exit只退出了shell进程,没有退出容器的主进程,容器不会停止运行,其状态保持为up(运行中)
若处于第一种情况,即主进程为shell,但只想退出当前的 Shell 会话而不想停止整个容器,可以使用快捷键 Ctrl + P + Q(先按 Ctrl+P,松开后再按 Q)来实现仅退出而不停止容器。
- 这个快捷键序列会使你从容器的终端分离,但保持容器的主进程(也就是当前的 Shell)在后台继续运行
- 如果你想再次进入这个仍在运行的容器,可以再次使用docker exec
删除容器
bash
格式:docker rm [-f] 容器ID/名称
#删除容器
docker rm 2592d3fad0fb
#删除已经终止状态的容器
docker rm -f 2592d3fad0fb
#强制删除正在运行的容器
参考
- 【Docker】初识docker 基本概念及安装使用(巨详细版):安装、镜像操作、容器操作
- Docker镜像指南:从核心命令到离线迁移实战:镜像操作、镜像迁移
- docker入门,这一篇就够了:安装、实战