本篇主要介绍容器相关之 Docker 的基本知识及普通公司的容器化体系。


1 容器介绍

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的机器上。

Docker 比传统的虚拟机具有如下优势:

  • 轻量化,只需包含应用所需最小的环境依赖
  • 启动速度快,只有服务相关的进程
  • 资源利用率高,磁盘,CPU,内存
  • 迁移部署方便,镜像独立,包含了应用所需依赖,随用随起
  • 方便扩缩容

Docker 具有特点:

  • 进程在宿主机可见
  • 镜像分层存储
  • 社区活跃,大量开箱即用的镜像


镜像 与 容器 的关系?

镜像(image)是一个压缩包,镜像通过 Docker Daemon 进程解压拉起(run)得到容器(container),容器中的改动可以继续压缩(commit)成新的镜像。


2 镜像构建

2.1 Dockerfile介绍

Dockerfile是一个构建镜像用得命令集合。

Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。

FROM ubuntu:​​14.04

MAINTAINER huangyanxiang

RUN sed -i ​​'s/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list

RUN apt-get update

RUN apt-get install -y nginx

COPY index.html /usr/share/nginx/html/index.html

ENTRYPOINT [​​"/usr/sbin/nginx"​​,​​"-g"​​,​​"daemon off;"​​]

常用命令

命令

说明

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,设计并实现了如下镜像构建架构:


​-project​



-project
-- DEBIAN
-- DOCKER
-- docker_start.sh
-- Dockerfile




#!/bin/sh


##1:添加host
if [ -f "/mnt/conf/hosts" ]
then
cat /mnt/conf/hosts >> /etc/hosts
fi
echo "${NODE_IP} syslogserver" >> /etc/hosts

##2:拷贝配置文件,应用放置在配置中心的配置都会放置到容器的/mnt/conf目录下,请根据需要拷贝到目标路径下
# copy conf
if [ -d "/mnt/conf" ]
then
cp -f /mnt/conf/* /uc/etc/
fi

##3:启动程序,必须前台运行
# start
/uc/sbin/casserver -c /uc/etc/casserver.conf






  • 研发将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

搜索镜像仓库