docker简介

一个开源的应用容器引擎,可以用来打包程序,可以包入依赖环境,这样只需要提供docker image即可,类似于虚拟机,但是更轻量级。

几个概念:

Paas,platform as a service,Caas container as a service。

镜像:文件的层次结构以及包含如何运行容器的源数据,类似虚拟机中安装系统的iso文件。

容器:从镜像创建的运行实例,可以被启动、开始、停止、删除。 类似于安装好的虚拟机系统。

仓库:存放镜像的仓所,仓库注册服务器上有多个仓库,每个仓库有多个镜像,每个镜像有多个tab。和git做类比的话,dockerhub类似github,里面有很多项目,项目类似于镜像,每个项目有多次提交,对应镜像的多个tag

使用目的

1,实现应用隔离,多个应用可能会相互影响,通过使用docker可以使相互分离,比如搭建禅道系统会用到lnamp,而其他的一些也会用到,虽然通过配置也能分割【目前现状,但是不够直观,而且conf文件写的比较乱,可能是水平差,不过不想花太多精力在这个上面,毕竟配置不是目的】,但是使用docker会更方便整洁,比如本地81端口提供A服务,82端口提供B服务,只需要ngix中配置转发即可。

2,方便管理,进行一些实验的时候,总是得记录当前的一些东西,一旦实验失败还需要还原,如果使用docker,只需要根据需要commit备份即可,如果失败了,重新加载之前的image继续。

3,方便迁移,在任意一台电脑上,无论是服务器还是本地,进行实验测试,完成后发布只需要将对应的image移过去即可,之前则是在本地做一遍,好了再在server上做一遍,虽说熟能生巧,可是浪费时间,而且不必要,毕竟根本目的是开发某个功能,不是为了部署和维护。

4,体积小。之前有用过虚拟机,利用快照功能备份,但是文件太大了,难以通过U盘移动拷贝,docker image一般几十兆到一两百兆,大的也才一个多G,很轻易可以通过U盘拷贝。

5,镜像多,DockerHub上有很多公开image,只需要找到合适的镜像,在上面进行修改即可。

6,占用资源少,如果想要虚拟机流畅运行,至少2G或者4G的内容,16G顶多开四五个虚拟机,而docker可以运行很多个。

局限性

毕竟只是大概的了解了docker,看书中介绍有提到安全性等问题,根据需要决定是否使用,自己目前只是为了做一些实验学习,所以采用。不过之前初次接触docker的时候,为了搭建一个服务,一直没成功,所以直接下了别人的image,结果运行后虽然能实现目的,但是不知道怎么停下来,搜索百度,怎么都停不下来,最终直接删除了文件,由于docker是封装好的,如果既能满足需求,同时悄悄的做一些其他事情,也是很难发现的,不想github一样,直接提供源码,如果有后门就有可能被人发现,所以docker最好下载可信度高的,或者直接自己从头开始搭建。

常用docker命令

docker需要管理员权限运行,下面省略sudo

man docker会给出文档说明

docker 或者docker /? 或者docker --help 给出帮助文档

为了下载dockerhub的image,首先需要在dockerhub上注册。

docker login   //进行登录,用户名不带邮箱@以及后面的部分

登录成后可以在dockerhub上搜索下载

docker search XXX //以XXX为关键字在dockerhub上搜索

docker pull AAA:BBB //AAA是image的名字,BBB是tag,如果不指定,则为latest,即下载最新的image

下载后本地就有了镜像

docker images //查看本地的docker

会列出REPOSITORY  TAG  IMAGEID CREATED SIZE等信息

docker ps // 查看运行中的container

会列出CONTAINERID  IMAGE COMMAND CREATED STATUS PORTS等信息

docker start/stop/restart CONTAINERID   //停止某个container,可以只输入部分,只要能够做出区分即可,比如container少的时候只输入一两位就够了

docker port CONTAINERID //查看该container port映射关系

docker run 【选项】 IMAGE 【command  args】  //从某个镜像启动container,如果本地没有会自动下载

docker commit CONTAINERID  repository:tag //当在docker内做出某些修改后,可以用这个命令创建新的image,类似虚拟机的快照功能

docker exec //进入某个container内,如docker exec -it /bin/bash

docker rmi imageid //删除镜像

私有dockerhub

之所以搭建私有dockerhub,主要因为是要做的事情都是具体的针对个人的,如果提交到dockerhub上一来浪费公共资源,二来可能不经意间泄露个人信息,而且鉴于前面提到的备份功能,可能会频繁的commit,而私有dockerhub有在本地搭建,可以提高效率。

由于对docker还处于简单使用的阶段,就直接使用了别人做好的image。

使用sudo docker login,登录

sudo  docker run -d -p 5000:5000 registry,自动下载并启动registry 容器,通过5000端口映射到container内的5000端口

此时可以通过浏览器访问本地的5000端口XXX:5000/v2/

需要参照https://blog.csdn.net/jiaolongdy/article/details/75389167修改/etc/docker/daemon.json文件,如果不存在则创建一个:

{ "insecure-registries":["myregistry.example.com:5000"] }

重启

sudo /etc/init.d/docker restart

然后下载镜像,比如jmoger/gitblit

git docker pull jmoger/gitblit

给这个image打上tag,得到一个新的image:

sudo docker tag jmoger/gitblit 192.168.50.186:5000/gitblit    //根据时间情况设置ip

然后就可以提交到自己的私有dockerhub上了

sudo docker push 192.168.50.186:5000/gitblit

可以在docker内进行开发,然后用这种方式同步开发环境。比如做禅道系统的二次开发,在公司内做了一部分,docker提交到自己的dockerhub上,回去后pull下来可以继续做,无论code还是环境都完全一样。如果通过git同步code,还需要确保两边有同样的环境,如果通过虚拟机同步,导出导入虚拟机需要不少时间,而且虚拟机需要配置一些东西,安装必要的软件之后未必能够通过U盘携带,而且读写十几G甚至几十G的内容也需要不少时间。

参考资料:

1.docker技术入门与实战

2.docker入门白皮书

05-23 16:56