Docker新手入门实战

  • Docker新手入门实战已关闭评论
  • 115,027 views
  • A+
所属分类:docker
摘 要

本文从新手视角记录了一个实际的Dokcer应用场景从创建、上传直到部署的详细过程,并简单的介绍了腾讯云容器服务的使用方法。通过Docker快速拉起一个定制服务,极大的简化了部署,加快了业务部署节奏,并降低了运维成本。 —— 人生苦短,快用Docker。

一、实践背景

为了学习Docker,我们先结合实际需求,设计这样一个场景case:假设有一个个人网站,想使用Nginx反向代理方案,能够在国内外快速搭建多个类似于CDN的节点,提供集群式的WEB访问服务。

我想到的方案如下:

  • 常规部署方案:    购买云主机->环境初始化->部署Nginx->配置反向代理->DNS解析
  • Docker部署方案:购买云主机->yum 安装docker->拉取自定义镜像并执行->DNS解析
  • 腾讯云容器方案: 腾讯云容器服务->创建服务->DNS解析

很明显,使用Docker部署方案,整个过程会变得简单快捷,也更易自动化。当然,若不是对IDC有特殊要求的话,腾讯云的容器服务当选为最佳方案。

下面简单记录下我从Docker镜像的创建、上传到部署的实践过程。

实验环境:

  • 腾讯云:CentOS Linux release 7.2.1511 (Core)
  • 阿里云:CentOS Linux release 7.2.1511 (Core)
  • Docker version 1.12.6, build 88a4867/1.12.6
  • Docker 镜像版本:Centos 官方最新版
  • Nginx 版本:Tengine 2.2.0
  • 其他略..

二、制作镜像

1、安装配置Docker

2、制作基础镜像

运行并进入镜像:

此时,终端已经进入了镜像里面,现在我们可以根据自己的需求安装额外的组件,比如我这次需要用到crontab任务计划服务、进程守护supervisor等,那么直接在这个终端开始操作:

Ps:上面的PS提示符中的 0d7f7b8769d9 就是本次启动的 CONTAINER ID ,在下面的commit即将用到。

完成必要组件安装之后,按下 Ctrl +D 退出系统,接着使用 docker commit 命令创建新镜像,比如命名为 nginx-proxy-base,版本latest:

执行完成后,可以使用 docker images 查看刚创建的镜像:

到此,我们就创建了一个自定义的Docker基础镜像(Ps:基础镜像类似一个VM虚拟机的快照,方便后续步骤都可以从这个基础上重新制作。)

3、制作服务镜像

有了前面的基础镜像之后,我们可以在此基础之上添加应用程序或自定义配置,打包为服务镜像。以本文背景需求为例,为了方便后续维护,Nginx我采用纯静态编译方式,制作成绿色便携版本。

因此,我们先在宿主机上静态编译一个符合需求的Nginx(仅展示关键步骤,依赖组件自行搞定):

安装后得到 /usr/local/nginx 目录,接着我们按照实验需求修改Nginx各项配置,比如反向代理:

全部配置OK后,运行nginx,确保可以正常工作。

4、编写Dockerfile

①、创建一个目录,比如:

②、创建 supervisor配置文件,注意必须非daemon模式,所以此处crond会带上-n参数:

③、继续创建其他所需文件,比如 crontab.list:

④、将前面的nginx目录拷贝过来:

⑤、编写Dockerfile文件:

vim Dockerfile

附:dockerfile 常用指令,可以按实际需求自行添加:

 5、构建镜像

命令为:docker build -t="[name]:[tag]" ./ ,比如:

Build完成后,再执行docker images就可以看到刚刚创建的镜像:

接着,可以下测试镜像是否能正常运行,命令语法大致如下:

若加上 -d 参数,docker将会后台运行,这里我们想看下刚刚创建的镜像是否正常, 所以采用前台运行模式,命令如下:

执行过程:

可以看到,镜像能够正常运行,接着我们还可以继续测试下启动的Nginx是否能够正常提供服务,这里就不详细介绍了。

三、私有仓库

前文已经制作了一个带有Nginx反向代理服务的Docker镜像,此时还只能在本地使用,若是要让其他服务器也能用到这个镜像,我们可以使用 docker registry 创建一个私有仓库,步骤如下:

1、拉取私有仓库registry

此时,执行docker images应该可以看到4个镜像:

 2、拉起仓库

 3、推送镜像

第一步查看镜像列表时,拿到需要推送的镜像的ID,比如 f2ed91429b31

①、先打tag,语法如下:

docker tag [image id] [仓库地址]/[命名空间]/[镜像名称]:[版本]

②、然后push,语法如下:

docker push [仓库地址]/[命名空间]/[镜像名称]

执行过程如下所示:

完成后,执行docker images就可以看到刚刚提交的镜像了:

③、测试拉取:

现在可以在本机(本机可以先删除在拉取)或另找一台服务器进行docker pull拉取测试。

比如,先在宿主机上删除这个镜像:

此时,docker images 列表已经消失,再执行 docker pull 就又回来了。

4、离线方案

当私有仓库无法使用时(比如存在网络限制),我们还可以将镜像保存为一个tar包,方便离线使用,使用也非常简单:

①、export / import 方案

使用 docker ps -a 查看当前正在运行的docker镜像列表,得到对应的 CONTAINER ID,执行如下语句可以将运行中的镜像导出到指定tar包:

有了tar包之后,就可以使用 import 来导入:

②、save / load 方案

使用 docker images 查看本地已有镜像列表,得到对应的IMAGE ID,然后执行如下语句可以将本地已存在镜像保存到指定tar包:

后面则可以使用 load 来加载tar包镜像:

两种方案的区别:

  • export 只能导出正在运行的镜像,而 save 可以直接导出本地镜像;
  • export 导出的镜像文件一般会小于 save 保存的镜像(本文实践数据:相差38MB);
  • export 导出(import导入)是根据容器拿到的镜像,再导入时会丢失镜像所有的历史,所以无法进行回滚操作(docker tag <LAYER ID> <IMAGE NAME>,而save保存(load加载)的镜像,没有丢失镜像的历史,可以回滚到之前的层(layer)。

 

四、小结

本文记录了一个实际的Dokcer应用场景从创建、上传直到部署的详细过程,Docker为我们提供了一个新的软件发布方式,只要将应用以及相关的依赖打包成Docker镜像,并上传到镜像仓库之后,我们就可以快速拉起一个定制服务,毫无拖泥带水,从而极大的简化了部署。

 

  • 我的微信
  • 微信扫一扫
  • weinxin
  • 微信公众号
  • 微信公众号扫一扫
  • weinxin
avatar