1. 简介
Docker 是一个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。Docker 的官方地址是 https://docs.docker.com/。
无论是应用开发者、运维人员、还是其他信息技术从业人员,都有必要认识和掌握 Docker,以节约有限的时间和资源。
2. 特点
-
轻量化
Docker 容器使用的资源非常少,相比虚拟机技术,一个完整的 Docker 镜像通常只有几十 MB,启动几乎是立即的。 -
标准化
Docker 对应用及其依赖进行标准化打包,解决了“在我机器上可以运行,在你机器上就不行”的问题。 -
可移植性
可以在不同的平台和不同的环境中运行,例如开发环境、测试环境和生产环境。 -
版本管理和组件重用
Docker 可以进行版本管理、组件重用、快速部署等。 -
隔离性
Docker 能够提供独立的运行环境,应用程序在 Docker 容器的运行和外部世界进行隔离。
3. 优点
-
环境一致性
在开发、测试和生产环境之间建立一致性,消除了“在我电脑上运行得好好的”这种情况。 -
隔离性和安全性
Docker 容器之间彼此隔离,一个容器的崩溃不会影响到其他的容器,提供了额外的层次的安全性。 -
便于持续集成和持续部署
Docker 能够以最小的代价快速地启动和关闭,这让持续集成和持续部署变得非常简单。 -
微服务架构
Docker 非常适合微服务架构。每个微服务可以运行在自己的容器中,每个容器之间是相互隔离的,有自己独立的运行环境。 -
资源利用率高
Docker 容器共享主机的内核,不需要像虚拟机那样为每个应用程序运行一个完整的操作系统,资源占用更少,启动更快。
4. 核心概念
-
Docker 的工作流程
- 从 Docker 仓库中获取 Docker 镜像。
- 用这个镜像创建 Docker 容器。
- 对容器进行操作(启动、停止等)。
-
4.1 镜像 Image
- 理解
镜像是 Docker 容器的模板,用于创建 Docker 容器的基础。 - 内在
镜像包含运行容器所需的所有内容,包括代码、运行时、库、环境变量和配置文件等。镜像由文件系统叠加而成,每一层都代表 Dockerfile 中的一条指令,层与层之间是互相依赖的。
- 理解
-
4.2 容器 Container
- 理解
容器是 Docker 镜像运行时的实体,可以被创建、启动、停止、删除、暂停等。 - 特性
每个容器之间是相互隔离的、保护的,每个容器都有自己的文件系统,每个容器之间运行的进程都是相互隔离的。容器的定义和镜像几乎一样,也是一系列的层的集合,不同的是容器的最上面那一层是可读可写的,而镜像的最上层是只读的。
- 理解
-
4.3 仓库 Repository
用来保存镜像的地方,分为公开和私有两种形式:- 公开仓库
如 DockerHub,是最知名的公开 Docker 仓库,可以被所有用户使用。 - 私有仓库
可以在本地部署,只能被内部用户使用。
- 公开仓库
5. 核心架构
- Docker 客户端
负责与 Docker 守护进程进行通信。 - Docker 守护进程
负责管理 Docker 镜像和 Docker 容器。 - Docker 镜像
负责生成 Docker 容器实例。 - Docker 容器
包含了应用程序和其所依赖的环境。 - Docker Hub
已经制作好了很多镜像,可以直接使用。
6. Docker 环境
- 基本原理
Docker 使用 Linux 内核的命名空间(Namespaces)和控制组(Control Groups,简称 cgroups)来实现容器的隔离和资源限制。
7. Linux 实操
7.1 Docker 安装
-
自动安装
- 官方的一键安装方式
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
- 国内 daocloud 一键安装命令
curl -sSL https://get.daocloud.io/docker | sh
- 官方的一键安装方式
-
手动安装
# 安装依赖工具 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 # 配置镜像源,使用阿里云的源 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum makecache fast # 安装 Docker yum install docker-ce docker-ce-cli containerd.io
7.2 快速入手
-
案例
# 0. 查看 Docker 服务运行状态 systemctl status docker # 1. 查看本地镜像 docker images # 2. 从 Docker Hub 拉取基础镜像,我们此处选择 ubuntu 镜像 docker search ubuntu docker search ubuntu --no-trunc docker pull ubuntu # 3. 再次查看本地镜像 docker images docker image ls # 4. 使用 ubuntu 镜像构建容器,并交互式运行容器,并在容器中执行 LS 命令 docker run -it ubuntu:latest /bin/bash # 5. 退出容器 exit # 6. 查看本地容器实例 docker ps docker ps -a # 7. 再次启动停止的容器 docker start 容器ID # 8. 再次进入容器 docker exec -it 容器ID /bin/bash # 9. 退出容器,并停止容器 exit docker stop 容器ID
7.3 Docker 镜像操作
-
查看镜像
docker images # 查看所有镜像 docker images -q # 只查看镜像的ID docker images --no-trunc # 显示镜像完整信息
-
搜索镜像
docker search 镜像名 docker search python docker search ubuntu
-
下载镜像
docker pull 镜像名:版本 # 不指定 TAG, 则默认使用 latest docker pull ubuntu:latest
-
运行镜像
docker run -it 镜像名:版本 程序 # 交互式运行容器 docker run -it --name=标签名 镜像名:版本 程序 # 容器指定名字 docker run -itd 镜像名:版本 程序 # 后台运行容器 docker run -itd ubuntu:latest /bin/bash
-
删除镜像
docker rmi -f 镜像名 # 删除指定镜像 docker rmi -f 镜像ID # 删除指定镜像 docker rmi -f $(docker images -qa) # 删除所有镜像
-
保存镜像
docker save 镜像名:版本 -o xxx.tar docker save ubuntu:latest -o ubuntu.tar
-
加载镜像
docker load -i xxx.tar docker load -i ubuntu.tar
7.4 Docker 容器操作
-
查看容器
docker ps # 查看正在运行的容器实例 docker ps -a # 查看正在运行或者已停止的容器实例
-
运行容器
docker start 容器ID # 启动容器 docker restart 容器ID # 重启容器
-
停止容器
docker stop 容器ID
-
删除容器
docker rm -f 容器ID # 删除指定容器 docker rm -f $(docker ps -qa) # 删除所有容器
-
进入容器
docker attach 容器ID # attach 进入后退出终端会导致容器停止 docker exec -it 容器ID /bin/bash # exec 不会导致容器停止
-
容器导出
docker export 容器ID > xxx.tar
-
容器导入
docker import xxx.tar xxx:tag
7.5 Docker 自动构建镜像
-
1. Dockerfile 编写
# 继承的基础镜像 FROM python:3.7.5 MAINTAINER "wechat:chinesecpp, email:chinacpp@hotmail.com" # 安装 app 需要的 Python 包 RUN pip install pandas flask scikit-learn jieba zhconv -i https://pypi.tuna.tsinghua.edu.cn/simple # 设置工作目录 WORKDIR /root/app # COPY 命令使用的是相对路径 COPY app/ /root/app # 显式声明容器服务监听的端口 EXPOSE 5000 # 当启动容器时默认执行的命令 CMD ["python", "app.py"]
接下来,使用下面命令构建 Docker 镜像:
docker build -t spam:1.0 .
-
2. 镜像使用
镜像构建完成之后,启动镜像创建容器实例:docker run -d -p 8000:5000 spam:1.0
持久化本地存储镜像:
docker save spam:1.0 -o spam.tar