Docker 是基于内核,对应用进程进行封装隔离,属于操作系统层面的容器虚拟化技术。
1. Docker 与虚拟机的区别
虚拟机是在宿主机上虚拟出一套硬件资源,在其上运行一个完整的操作系统,在该系统上再运行应用进程;Docker 容器内的应用进程直接运行于宿主机的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。
2. Docker 优势
- 主机资源利用率高:不需要进行硬件虚拟和运行完整的操作系统等额外开销。
- 启动时间快:直接运行于宿主机内核,不需要启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。
- 运行环境一致性:Docker 镜像提供了除内核外完整的运行环境,确保了应用运行环境一致性。
- 部署简单:通过镜像来实现持续集成、持续交付、快速部署。
3. 基本概念
(1)镜像 Image
镜像是一个特殊的文件系统,采用分层存储的架构,构建镜像时,会一层层构建,每一层构建完就不会再发生改变,前一层是后一层的基础。镜像不包含任何动态数据,其内容在构建之后不会被改变。镜像是用于创建容器的模板。
(2)容器 Container
镜像和容器关系,类似于面向对象程序设计中的类和对象。容器由镜像创建,一个镜像可以创建出多个相同的容器实例,每个容器为独立的应用进程。
容器运行时,以镜像为基础层,在其上创建一个当前容器的存储层,存储层可以读写数据。
(3)仓库 Registry
仓库用来存储镜像,一个 Registry 可以包含多个仓库(Repository),每个仓库可以包含多个标签(Tag),每个标签对应一个镜像。
一个仓库包含同一个软件不同版本的镜像,而标签就对应软件的各个版本。我们可以通过仓库名:标签的格式来指定镜像。如果不给出标签,将以 latest 作为默认标签。
Docker Registry 公开服务是开放给用户使用、允许用户管理镜像的 Registry 服务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。默认的 Registry 公开服务是官方的 Docker Hub,拥有大量的高质量的官方镜像。
用户还可以在本地搭建私有 Docker Registry。Docker 官方提供了 Docker Registry 镜像,可以直接使用做为私有 Registry 服务。
4. 基本架构
Docker 使用 C/S 架构,用户通过客户端与服务端进行交互,服务端负责构建、运行和分发镜像。客户端和服务端可以运行在一台机器上,也可以通过REST API与远程服务端进行通信。
5. Docker daemon
Docker daemon 是服务器组件,以守护进程方式在后台运行。Docker server 模块接收客户端请求,通过内部的路由分发调度,由具体的函数来执行请求,并在 Engine 中处理请求,然后根据请求类型,创建出相应的 job 并运行。
Docker daemon 运行在 Docker host上,负责创建、运行、监控容器,构建、存储镜像。
- Docker client 通过 Docker daemon 向 Docker Registry 获取镜像
- 通过 graphdriver 执行容器镜像的本地化操作
- 通过 networkdriver 执行容器网络环境的配置
- 通过 execdriver 执行容器内部运行的执行工作
6. Docker 安装
Docker CE 社区免费版,支持 64 位 CentOS 7,并且要求内核版本不低于 3.10。
卸载旧版本
$ sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-selinux \ docker-engine-selinux \ docker-engine
安装依赖包
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
添加 yum 软件源
$ sudo yum-config-manager --add-repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo# 官方源$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
更新 yum 软件源缓存,安装 Docker CE
$ sudo yum makecache fast$ sudo yum install docker-ce
启动 Docker CE
$ sudo systemctl enable docker$ sudo systemctl start docker
镜像加速
在使用过程中拉取 Docker 镜像十分缓慢,可以配置 Docker 国内镜像加速。
添加内核参数
如果在 CentOS 使用 Docker CE 看到下面的这些警告信息:
WARNING: bridge-nf-call-iptables is disabledWARNING: bridge-nf-call-ip6tables is disabled
添加内核配置参数以启用这些功能。
$ sudo tee -a /etc/sysctl.conf <<-EOFnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1EOF
然后重新加载 sysctl.conf 即可。
$ sudo sysctl -p
7. 镜像使用
Docker 运行容器前需要本地存在对应的镜像,如果本地不存在,从镜像仓库下载该镜像。
docker search 命令来查找官方仓库中的镜像。
$ docker search centosNAME DESCRIPTION STARS OFFICIAL AUTOMATEDcentos The official build of CentOS. 465 [OK]blalor/centos Bare-bones base CentOS 6.5 image 6 [OK]
返回结果包括镜像名字、描述、收藏数、是否官方创建、是否自动构建。
镜像名是 centos,被称为基础镜像或根镜像。blalor/centos 带有用户名前缀,由 Docker Hub 的注册用户创建并维护的。
docker pull 命令从镜像仓库获取镜像。
$ docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
- Docker Registry 地址:即域名或IP,默认为 Docker Hub。
- 仓库名:即用户名/软件名两段式名称。对于 Docker Hub,如果不给出用户名,默认是 library,也就是官方镜像。
$ docker pull ubuntu:18.0418.04: Pulling from library/ubuntubf5d46315322: Pull complete9f13e0ac480c: Pull completee8988b5b3097: Pull complete40af181810e7: Pull completee6f7c7e5c03e: Pull completeDigest: sha256:147913621d9cdea08853f6ba9116c2e27a3ceffecf3b492983ae97c3d643fbbeStatus: Downloaded newer image for ubuntu:18.04
这条命令中表示从 Docker Hub 获取 library/ubuntu 仓库中标签为 18.04 的官方镜像。
下载时我们可以看到分层存储的概念,镜像是由多层存储所构成,也会一层层的去下载。下载过程中给出了每一层 ID 的前 12 位。下载结束后,给出该镜像完整的 sha256 摘要,以确保下载一致性。
我们可以使用 docker images 命令来列出本地主机上的镜像。
$ docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEubuntu 18.04 f753707788c5 4 weeks ago 127 MB
列表包含了仓库名字、标签、镜像ID、镜像创建时间和镜像所占磁盘空间。
docker push 命令用来将镜像推送到 Docker Hub。
$ docker push username/ubuntu:18.04
8. 容器使用
docker run 是启动运行容器的命令。语法格式:
$ docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARG...]
-d:后台运行容器,并返回容器ID。
-i:以交互模式运行容器,通常与 -t 同时使用。
-t:为容器重新分配一个伪输入终端。
--name="":为容器指定名称。
-p ip:hostPort:containerPort:容器端口映射到主机端口。
$ docker run -it ubuntu:18.04 /bin/bashroot@e7009c6ce357:/#
这条命令表示 Docker 以 ubuntu:18.04 镜像为基础启动并运行一个容器,然后在容器里执行 /bin/bash。
$ docker run -p 8000:5000 -d ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"77b2dc01fe0f3f1265df143181e7b9af5e05279a884f4776ee75350ea9d8017a #容器ID
容器在后台运行时,某些时候需要进入容器进行操作,可以使用 docker exec 命令。
$ docker exec -it 77b2dc01fe0f /bin/bashroot@77b2dc01fe0f:/#
如果从这个 stdin 中输入 exit,不会导致容器的停止。
通过 docker ps 命令查看运行的容器有哪些。
$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES77b2dc01fe0f ubuntu:18.04 /bin/sh -c 'while tr 2 minutes ago Up 1 minute agitated_wright
CONTAINER ID:容器ID。
NAMES:自动分配的容器名称。
docker logs 命令查看容器内的标准输出。
$ docker logs 77b2dc01fe0f #可以是CONTAINER ID或者NAMEShello worldhello worldhello world
docker stop 命令终止一个运行中的容器。
$ docker stop 77b2dc01fe0f #可以是CONTAINER ID或者NAMES
docker start 命令启动运行一个已经终止的容器。
$ docker start 77b2dc01fe0f #可以是CONTAINER ID或者NAMES
docker rm 命令用来删除一个处于终止状态的容器。
$ docker rm 77b2dc01fe0f #可以是CONTAINER ID或者NAMES
docker export 命令用于导出容器快照到本地文件。
$ docker export 77b2dc01fe0f > ubuntu.tar
docker import 命令用于导入容器快照到本地镜像库。
$ cat ubuntu.tar | docker import - test/ubuntu:v1.0$ docker import http://example.com/exampleimage.tgz example/imagerepo #通过指定URL或目录导入
9. Dockerfile
Dockerfile 是构建镜像的配置文件, 用户可以使用它快速定制镜像。
Dockerfile 是一个文本文件,包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
定制镜像,是以一个镜像为基础进行定制。FROM 指定基础镜像,因此 Dockerfile 中的 FROM 是必备的指令,而且是第一条指令。
组成部分 | 命令 |
基础镜像信息 | FROM |
维护者信息 | MAINTAINER |
镜像操作指令 | RUN、COPY、ADD、EXPOSE、WORKDIR、ONBUILD、USER、VOLUME等 |
容器启动时执行指令 | CMD、ENTRYPOINT |
docker build 命令用于使用 Dockerfile 构建镜像。
$ docker build -t test/ubuntu:v1 . #使用当前目录的 Dockerfile 构建镜像$ docker build github.com/creack/docker-firefox #使用URL Dockerfile 构建镜像$ docker build -f /path/to/Dockerfile . #使用指定的 Dockerfile 构建镜像
docker commit 命令用于从容器中创建镜像。
$ docker commit -m="提交的描述信息" -a="作者" 容器ID 镜像名[:标签]
10. Docker 三剑客
(1)Docker Machine
Docker Machine 是 Docker 官方编排项目之一,负责在多种平台上快速安装 Docker 环境。
(2)Docker Compose
Docker Compose 是 Docker 官方编排项目之一,负责快速的部署分布式应用。
(3)Docker Swarm
Docker Swarm 是集群管理和编排工具,提供 Docker 容器集群服务,是 Docker 官方对容器云生态进行支持的核心方案。