原创文章,转载、引用请注明出处!
目标
Docker的安装:在Ubuntu、CentOS或者Windows上的安装Docker。
容器操作:启动容器、守护态运行、终止容器。
搭建一个Docker应用栈:获取镜像、应用栈容器节点互联、应用栈容器节点启动、应用栈容器节点配置。
实现私有云:启动Docker、获取镜像、实现sshd,在Base镜像基础上生成一个新镜像、分配容器、搭建自己的私有仓库。
介绍
Docker是PaaS提供商dotCloud开源的一个基于LXC(Linux Containers,基于Linux的容器机制)的高级容器引擎,源代码托管在Github上,基于go语言并遵从Apache2.0协议开源的虚拟化技术。
可以把Docker近似地理解成是一个“轻量级的虚拟机”:只消耗较少的资源就能实现对进程的隔离保护。使用Docker可以把应用程序和它相关的各种依赖(如底层库、组件等)“打包”在一起,这就是Docker镜像(Docker image)。Docker镜像可以让应用程序不再顾虑环境的差异,在任意的系统中以容器的形式运行(当然必须要基于Docker环境),极大地增强了应用部署的灵活性和适应性。
在Docker的网站上提到了Docker的典型场景:
Automating the packaging and deployment of applications(使应用的打包与部署自动化)
Creation of lightweight, private PAAS environments(创建轻量、私密的PAAS环境)
Automated testing and continuous integration/deployment(实现自动化测试和持续的集成/部署)
Deploying and scaling web apps, databases and backend services(部署与扩展webapp、数据库和后台服务)
Docker配置
在Mac OS上配置Docker。
安装
和安装Mac普通应用一样,下载.dmg安装包,运行安装包,把应用拖到到应用程序目录即可。
官方下载地址:https://download.docker.com/mac/stable/Docker.dmg
可以使用国内地址(阿里云)进行下载:http://mirrors.aliyun.com/docker-toolbox/mac/docker-for-mac/stable/Docker.dmg
初次打开会提示输入Mac的密码,输入后点击安装帮助程序即可。
安装完之后,打开Docker桌面程序,可以看到如下用户界面。
教程。帮助建立一个Docker镜像和容器,最后一步是发布到自己的个人账号上。需要sign in。可以跳过。
用户界面,左边栏分为Containers和Images,也是Docker的两个最重要的概念。
可以在用户界面操作Docker,也可以直接使用terminal进行操作(实际上Docker可以直接在其用户界面使用terminal)。
配置镜像加速
如果需要使用别人发布的镜像时,Docker默认从DockerHub拉取镜像。这个操作有时会遇到网络方面的困难,此时可以配置镜像加速器。
Docker官方在中国区提供了镜像地址,而且国内很多云服务商都提供了国内加速器服务,例如网易、阿里云等。
这里选择阿里云的镜像加速。登入阿里云网站:https://cr.console.aliyun.com ,左边栏->容器镜像服务->镜像中心->镜像加速器,默认会生成属于个人的一个加速器地址(需要注册阿里云账号)。
得到上述加速器之后,打开Docker桌面程序->Preferences->Docker Engine,使用json格式进行配置。
原来的配置:
修改为:
配置结果
在terminal中,使用docker info
可以查看Docker是否安装成功以及配置的结果。
容器:基础操作
创建一个Apache容器并进行一些基础操作。
docker image ls
:用于列出所有镜像的属性。
docker run -p 80:80 httpd
:创建一个Apache容器。其中,-p
用来指定端口映射关系:第一个为本地端口,第二个为容器端口;httpd
是Apache超文本传输协议(HTTP)服务器的主程序,被设计为一个独立运行的后台进程,它会建立一个处理请求的子进程或线程的池。主要的命令是docker run
,该命令会运行本地的镜像,如果该镜像不存在的话,会先从镜像仓库拉取该镜像。因此,这条命令的输出包含了两部分结果:第一部分是docker pull
,用来从镜像仓库中拉取或者更新指定镜像,第二部分是运行该容器并输出log内容。
使用浏览器及本地ip
访问80端口,会出现如下页面,说明Apache服务成功运行:
对运行的容器做如下操作:
docker ps -a
:列出所有的容器(不管是运行中的还是未运行的),可以看到刚刚建立的容器的一些状态。其中,CONTAINER ID
给出了容器的ID,可以用这个ID指定该容器进行一些操作。STATUS
中Up
表示该容器正在运行。
docker logs 540cb924672b
:指定容器查看其log内容。可以看到这里的输出内容和上一图中的内容是一致的,也证明了服务成功运行。
docker stop 540cb924672b
:停止该容器。停止之后再使用ps命令查看状态,可以发现该容器的状态变成了Exited (0)
。
docker run -d -p 80:80 httpd
:与上面一条run命令相比,加入了-d
参数,表示容器运行于前台还是后台(即守护态),默认为false。接着再使用ps命令查看状态,可以发现从该镜像新建了一个容器(不同的ID)。
在Docker桌面程序中也可以看到刚刚建立的两个容器。
应用栈
Mac上做Docker应用栈,配置容器的时候会遇到一个极其让人难受的问题:
https://forums.docker.com/t/var-lib-docker-does-not-exist-on-host/18314
本来是想用网上那个大家已经做烂了的例子去做一下的:
https://blog.csdn.net/u012066426/article/details/52597991
参考《Docker容器和容器云》 2.3.2章节应用栈搭建过程
这个问题本质上还是机器架构导致的软件环境的问题。应用栈搭建本身是比较简单的工作。
因为这个问题,决定放弃了,因为真的很浪费时间,4天了没有找到什么解决方案。
私有云
hub.docker.com(官方的Docker hub)上可以保存镜像,是一个用于管理公共镜像的地方,我们可以在上面找到我们想要的镜像,也可以把我们自己的镜像推送上去,但是网速相对较慢。修改了镜像地址可以加快网速,但是某些情况下,开发需要更加定制化和私人化的要求时,再或者个人的服务器无法访问互联网时,在内部环境中搭建一个私有的公共仓库是个更好的方案,这就是Docker私有云(私库)的意义。
过程如下:
私有云工具:registry
docker pull docker.io/registry
:利用官方提供的工具registry来配置私库。需要注意的是,这个工具是个本身就是个镜像,直接下载并使用该镜像启动容器就可以完成私库的搭建。
搭建
docker run -d -p 5000:5000 --name registry_jfy --restart always -v /Users/qiwu/docker/registry:/var/lib/registry registry
:建立私库。其中,-d
设置该私库为后台守护态运行;-p
给出端口及其映射;--name
设置该私库的名称为registry_jfy
;--restart
表示该容器总随着docker服务的开启而启动;-v
把registry的镜像路径映射到本地。
使用ps
命令查看容器,可看到刚刚新建立的私库的情况。使用 http://127.0.0.1:5000/v2/_catalog 测试刚刚搭建的私库的内容。
这里应该是空的repositores,busybox是之前用来做尝试而上传上去的镜像,此处无视之。
docker tag ubuntu:latest 127.0.0.1:5000/ubuntu
:希望将本地已有的ubuntu镜像(本来是用来做应用栈的)作为私库的测试文件。标记本地镜像并指向目标仓库。这一步是必须的,如果直接将未tag的镜像上传,会提示此镜像不存在。
tag操作之后,使用ps
命令查看容器,发现多了一个刚刚标记过的镜像,大小和原本的ubuntu是一样的。
还是使用 http://127.0.0.1:5000/v2/_catalog 查看私库的内容,可以发现增添了刚才push的ubuntu。
docker push 127.0.0.1:5000/ubuntu
:为了测试私库的镜像,先将本地已有的两个ubuntu镜像删除。
测试
docker pull 127.0.0.1:5000/ubuntu
:从本地仓库拉取到docker容器。
使用ps
命令查看pull前后的镜像,发现多了名为127.0.0.1:5000/ubuntu
的ubuntu镜像,说明成功的从本地仓库pull到了刚刚push上去的ubuntu。
感想
实验本身比较简单。Docker的使用是比较友好的,尤其是在Mac上,还有桌面程序,即使对敲terminal命令不怎么熟悉的人,也有内置的一些教程帮助初步的使用。但实际上大部分的操作还是需要熟悉terminal命令。
但是也有不怎么友好的地方,就是在搭应用栈的时候,因为操作系统导致的问题,上面已经说过,不再赘述,这里给差评。
做完了这个实验之后,突然感觉虚拟化的东西真的已经不是一个纸面上的概念了,大家都在用这类应用做东西。尤其是在查找应用栈和私有云的资料的时候,会有很多的商业化广告,内容都是帮助公司等搭建Docker等的私有云。也非常惊诧居然有Docker这种轻量级的东西来做虚拟化,我个人的理解就是将“阉割”做到了标准化和规范化,以减少成本。这个概念以后也许不会再用到,但这种思路对于个人的学习是非常有帮助的。