本篇主要介绍容器相关之 Docker 的基本知识及普通公司的容器化体系。
1 容器介绍
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的机器上。
Docker 比传统的虚拟机具有如下优势:
- 轻量化,只需包含应用所需最小的环境依赖
- 启动速度快,只有服务相关的进程
- 资源利用率高,磁盘,CPU,内存
- 迁移部署方便,镜像独立,包含了应用所需依赖,随用随起
- 方便扩缩容
Docker 具有特点:
- 进程在宿主机可见
- 镜像分层存储
- 社区活跃,大量开箱即用的镜像
镜像 与 容器 的关系?
镜像(image)是一个压缩包,镜像通过 Docker Daemon 进程解压拉起(run)得到容器(container),容器中的改动可以继续压缩(commit)成新的镜像。
2 镜像构建
2.1 Dockerfile介绍
Dockerfile是一个构建镜像用得命令集合。
Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。
|
常用命令
命令 | 说明 |
FROM | 指定基础镜像,必须为第一个命令 |
MAINTAINER | 维护者信息 |
WORKDIR | 工作目录,类似 cd 命令 |
COPY/ADD | 拷贝本地文件到镜像中指定路径 |
RUN | 在镜像容器中执行命令 |
ENTRYPOINT | 指定容器启动命令 |
CMD | 指定容器启动命令或作为ENTRYPOINT的参数 |
ENV | 设置环境变量 |
USER | 指定启动用户,默认root |
2.2 镜像构建体系
镜像构建方式为了尽可能降低代码的侵入,减少操作的流程,可以采用了一些非标准的构建流程,大致分为四类:
- deb包的基础上构建镜像
- 文件包上传的方式构建镜像
- 直接编译方式构建镜像
- 运行容器commit成镜像
2.2.1 deb包方式
现在大多数公司容器化服务,大都是通过jenkins构建成deb包并上传至deb源,为了一步生成deb和docker,设计并实现了如下镜像构建架构:
|
- 研发将Dockerfile及docker_start.sh放置在DOCKER目录中
- 打包时将DOCKER目录一并打包进deb包中,打包完成后,携带参数触发打镜像的jenkins job
- 打镜像jenkins下载deb包并解压,得到DOCKER目录和服务部署代码,依据Dockerfile进行镜像的构建
- 构建完成的镜像推送到镜像仓库
2.2.2 compile方式
随着容器化的深入,部分新服务直接采用容器部署,催生出编译构建镜像的需求,同样是通过jenkins来实现一键构建。
图:compile构建镜像
- 研发提供编译需要用到得环境,编译命令,Dockerfile,docker_start.sh
- 将打包用户添加到git项目中,用于拉取代码
- 在jenkins中创建对应的job,配置相关的参数信息
- 研发自助构建容器镜像,自动推送到镜像仓库
2.2.3 file方式
还有一些服务是手动打的包,比如研发构建成 zip 包,war 包,为了适配这类服务的镜像构建,jenkins提供特殊的上传文件构建镜像job.
- 研发本地打好 zip 包 war 包
- 通过上传到jenkins job
- jenkins通过预先准备好的Dockerfile等文件进行构建镜像
- 构建完成的镜像推送到镜像仓库
2.2.4 commit方式
对于平台服务不同于一般的应用,安装一个服务可能需要安装多个依赖的库,并且有些库的安装由于历史缘故比较特殊(比如tang-log的安装会去操作syslog-ng),鉴于此专门为平台此类服务提供了commit方式。
- 首先基于基础镜像运行一个容器
- 通过docker exec命令进入到容器中进行相关包的安装
- 拷贝及配置部分通用文件
- 通过commit方式生成镜像并推送到镜像仓库
平台服务的镜像构建也是通过jenkins。
3 镜像仓库
镜像仓库是用来存储和分发镜像用的,镜像仓库分为如下几类:
- 本地仓库
- 中央仓库(官方仓库)
- 私有仓库(自建的仓库)
- 第三方仓库(其他企业提供的仓库)
- 镜像仓库(加速中央仓库镜像的下载)
镜像举例:
- nginx
- nginx:latest
- nginx:centos
- hub-test.com/infra/nginx:v1
- gcr.io/pause:3.0
3.1 镜像仓库介绍
Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,可以用来构建企业内部的Docker镜像仓库。主要用于镜像存储、镜像同步复制、漏洞扫描和权限管理等。
3.2 公司镜像仓库体系
正常流水线为测试环境harbor仓库同步镜像至产线仓库, 线上任一云环境异常,需将域名指向另一个云环境的公网(优先)或者专线(次选)。
4 常用命令
docker -h 可查看命令帮助,以下为常用命令做个分类
篇幅有限,详细可参考docker官网
4.1 管理镜像常用命令
指令 | 描述 |
docker images | 列出镜像 |
docker build | 通过 Dockerfile 构建镜像 |
docker history | 查看镜像构建历史 |
docker inspect | 显示一个或多个镜像详细信息 |
docker pull | 从镜像仓库拉取镜像 |
docker push | 推送一个镜像到镜像仓库 |
docker rmi | 移除一个或多个镜像 |
docker tag | 创建一个引用源镜像标记目标镜像 |
docker save | 保存一个或多个镜像到一个tar归档文件 |
docker load | 加载镜像来自tar归档或标准输入 |
4.2 创建容器常用选项
指令 | 描述 |
-i | 交互式 |
-t | 分配一个伪终端 |
-d | 运行容器到后台 |
-e | 设置环境变量 |
-p | 发布容器端口到主机 |
–name | 指定容器名称 |
-h | 设置容器主机名 |
-v | 绑定挂载一个卷 |
4.3 管理容器常用命令
指令 | 描述 |
docker ps docker ps -a | 列出运行的容器 列出所有容器 |
docker inspect | 查看一个或多个容器详细信息 |
docker exec | 在运行容器中执行命令 |
docker commit | 创建一个新镜像来自一个容器 |
docker cp | 拷贝文件/文件夹到一个容器 |
docker logs | 获取一个容器日志 |
docker top | 显示一个容器运行的进程 |
docker stats | 显示容器资源使用统计 |
docker stop/start/restart | 停止/启动/重启一个或多个容器 |
docker rm | 删除一个或多个容器 |
docker search | 搜索镜像仓库 |