一)Docker介绍
1.简介
Docker是基于Go语言实现的开源容器项目。它是操作系统级,基于内核和库实现的虚拟化技术,Docker的构想是要实现"Build,Ship and Run Any App,Anywhere",即通过对应的封装(Packaging)、分发(Distribution)、部署(Deployment)、运行(Runtime)生命周期进行管理,达到应用组件级别"一次封装,到处运行"。这里的应用组件,既可以是一个前后端应用、一个编译环境或管理工具、也可以是一套数据库平台服务,甚至是一个操作系统或集群。
2.核心概念
Docker的应用操作基本都是围绕着三大核心概念:镜像(Image)、容器(Container)、仓库(Repository)。因此,对于掌握和应用docker,准确把握这三大核心概念尤为重要。
2.1.Docker镜像
Docker镜像类似于虚拟机的镜像,可以将它理解为一个只读的模板,或者泛理解成我们项目的一个脚手架工程。比如,一个镜像可以包含一个基本的操作系统环境,里面仅仅安装了jdk和tomcat,可以把它称为java web应用镜像。
2.2 Docker容器
Docker容器类似于一个轻量级沙箱,Docker利用容器来运行和隔离应用。容器是从镜像创建的应用运行实例,可以启动、开始、停止、删除。可以把容器看做是一个简易版的操作系统及运行的应用程序打包而成的盒子。注意:镜像自身是只读的。容器从镜像启动的时候,会在镜像的最上层创建一个可写层。
2.3.Docker仓库
Docker仓库类似于代码仓库,是集中存放Docker镜像文件的场所,其设计理念与Git代码仓库的概念非常相似,实际上Docker从设计上也是借鉴了Git的很多优秀思想。目前,最大的公开仓库是官方提供的Docker Hub,国内不少服务商(如腾讯云、阿里云)也提供了仓库的本地源,对于不希望公开的镜像文件也可以选择搭建私仓库。
3.传统虚拟化与容器区别
传统方式是在硬件层面实现虚拟化,需要有额外的虚拟机管理应用和虚拟机操作系统层。Docker以及其他容器都属于在操作系统范畴,通过内核创建多个虚拟或者复制的操作系统实例(内核和库)来隔离不同的进程实现虚拟化。
与传统虚拟化区别:
二)安装与配置
以下为CentOS为例介绍安装Docker,总共分为3步,安装Docker引擎->修改配置文件->启动Docker服务及常用日志分析。
1.安装Docker引擎
为了方便添加软件源,以及支持devicemapper存储类型,先安装如下软件包:
yum install -y yum-utils device-mapper-persistent-data lvm2
添加Docker稳定版本(还会有发布新功能的测试版)的yum软件源:
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
查看Docker引擎版本及安装:
yum list docker-ce --showduplicates | sort -r
yum install docker-ce-xx.xx
2.配置Docker
启动服务前要手工创建deamon.json(默认没有),用于docker各类运行配置,比如网络映射、镜像仓库等配置,比如兴港通中配置私仓:
创建文件,写入以下内容:
vim /etc/docker/daemon.json
{“insecure-registries”:[“172.18.19.xxx:10180”]}
3.启动服务及运行日志查询
启动及停止服务:systemctl start|stop|status docker :启动、停止、查看状态
如启动碰到问题可查看日志:Docker日志分运行日志(docker message)和应用日志(docker logs),如启动出现错误可通过运行日志分析,查看本地/var/log/messages日志文件或者通过命令journalctl -u docker.service查看。
三)常用功能
此处主要介绍Docker在应用层面的几个常用功能操作与应用
1.使用Docker镜像
镜像是Docker三大核心概念中最重要的,也是运行容器的前提,Docker运行容器前需要本地存在对应的镜像,如果不存在,Docker会尝试从默认的仓库下载(Docker Hub)。用户也可以通过使用自定义的镜像仓库(阿里云、腾讯云、私仓等)。
1.1创建镜像
创建镜像有三种方式:基于已有容器创建(docker [container] commit 命令)、基于本地模板导入(docker [container] import 命令)、基于Dockerfile创建。基于Dockerfile创建是项目中最常用的方式,这里针对Dockerfile创建方式展开介绍:
Dockerfile由一行行命令语句组成的文本文件,利用给定的指令描述基于某个父镜像创建新镜像的过程。Dockerfile主体内容分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行的命令,开发者通过docker build -t imagename ./[dockerfile的目录路径]来基于Dockerfile文件创建镜像。比如:
Dockerfile指令说明:
1.2 上传镜像
上传镜像前需要将镜像打上 tag(develop):
docker tag 172.18.19.117:10180/bmsapi:develop registry-intl.cn-shenzhen.aliyuncs.com/xzgj/bmsapi:develop
上传镜像至阿里云仓库:
docker push registry-intl.cn-shenzhen.aliyuncs.com/xzgj/bmsapi:develop
上传镜像至私仓:
docker push 172.18.19.117:10180/bmsapi:develop
1.3 获取/下载镜像
通过docker pull 下载镜像至本地,这里的
t
a
g
是当初上传时打的
d
e
v
e
l
o
p
t
a
g
,在多环境构建时可通过
j
e
n
k
i
n
s
参数来配置
t
a
g
指定环境发布与拉取:从阿里云镜像仓库下载:
d
o
c
k
e
r
p
u
l
l
r
e
g
i
s
t
r
y
−
i
n
t
l
.
c
n
−
s
h
e
n
z
h
e
n
.
a
l
i
y
u
n
c
s
.
c
o
m
/
x
z
g
j
/
b
m
s
a
p
i
:
{tag}是当初上传时打的develop tag,在多环境构建时可通过jenkins参数来配置tag指定环境发布与拉取: 从阿里云镜像仓库下载:docker pull registry-intl.cn-shenzhen.aliyuncs.com/xzgj/bmsapi:
tag是当初上传时打的developtag,在多环境构建时可通过jenkins参数来配置tag指定环境发布与拉取:从阿里云镜像仓库下载:dockerpullregistry−intl.cn−shenzhen.aliyuncs.com/xzgj/bmsapi:{tags}
从私仓下载:docker pull 172.18.19.117:10180/bmsapi:${tags}
1.4 查看镜像信息
使用docker images或者docker image ls命令列出本地主机已有的基础镜像信息。可以看到镜像来自哪个仓库、标签、ID、创建时间和大小等信息。也可以通过inspect和history查看镜像详细和历史信息。
1.5 搜索镜像
可以通过docker search 搜索镜像仓库的信息,要搜索本地可列举docker images 如:docker images |grep “none”|awk ‘{print $3}’ 搜索本地无tag得镜像。
1.6 删除和清理镜像
使用docker rmi或者docker image rm命令可以删除镜像,命令格式为docker rmi image [IMAGE…],其中IMAGE为镜像标签或者ID。其中docker rmi删除时会优先删除该镜像的副本(因为平时开发时多次构建一个镜像时,同一个标签构建多次会产生多个同名字标签的副本镜像),如镜像只剩下一个标签的时候docker rmi才会彻底删除该镜像。
2.操作Docker容器
2.1 启动容器
容器是镜像的一个运行实例,镜像是静态的只读文件,容器是带有运行时需要的可写文件层,且容器中的应用进程处于运行状态。下图简单列举如何拉取构建好的镜像,创建一个容器并满足应用程序要求启动容器,运行应用。
2.2 查看容器
如查看正在运行的容器可以通过docker ps列举,如加上docker ps -a 则查看所有容器(含未启动的容器),也可通过docker inspect、top、status等子命令查看容器详情、容器内进程、统计信息等。
2.3 进入容器内部
有时候开发者需要进入到容器内部分析定位,可以通过docker exec -it dev_bmsapi 方式进入,其中-it参数是保持标准输入打开,为容器分配一个伪终端。通过exec操作容器是最推荐的方式,就如我们平时用堡垒机或者终端连上linux服务器操作一样便捷。
2.4 查看容器输出
通过docker logs 查看容器输出,docker logs 会接收容器内所有标准日志输出到用户的终端上 ,包括stdout、nohup等,并将日志以json格式保存文件存放在宿主机/var/lib/docker/containers目录下。
四)兴港通项目docker应用
此处主要介绍开发与测试环境,项目通过docker与jenkins集成,实现开发与测试之间持续集成与交付。对于生产系统,如集群规模较大可考虑使用Swarm、Mesos、K8S等平台来管理集群与资源编排调度。
1.编写Dockerfile文件,用来构建一个基础镜像,并且安装应用所需的工具与静态资源。
如后台项目的Dockerfile:
前端web项目Dockerfile:
2.jenkins构建:
2.1拉取代码:
2.2Maven打包:
2.3 完成构建,将镜像推入镜像仓库,完成环境交付。
由于此处构建也是基于镜像仓库制作好的基础镜像构建,如担心dockerfile与基础镜像有重复或者冲突,可通过docker history命令查看基础镜像构建过程,比如tomcat基础镜像是包含tomcat启动脚本的,应用构建时就无需设置启动tomcat脚本了:
jenkins应用构建:
2.4 指定部署发布的服务器
2.5 启动容器,启动容器时除了启动应用和容器进程外,还需要将应用所需的运行时环境设置好,比如环境变量、运行端口等。
2.6 完成启动,此时访问的路径就是容器所在服务器以及docker run里面指定的 -p 端口访问。