Fy J
CS专业扫雷学深造学者互联网冲浪一级选手
FRIENDS
jhn

Docker:配置、基础、应用栈、私有云

12-23-2020 11:52:20 云计算与分布式系统 Docker
Word count: 2.5k | Reading time: 9min

原创文章,转载、引用请注明出处!


目标

  • 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指定该容器进行一些操作。STATUSUp表示该容器正在运行。

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这种轻量级的东西来做虚拟化,我个人的理解就是将“阉割”做到了标准化和规范化,以减少成本。这个概念以后也许不会再用到,但这种思路对于个人的学习是非常有帮助的。

< PreviousPost
论文研读:Evaluation and development of deep neural networks for image super-resolution in optical microscopy
NextPost >
论文研读:SISR-DRN
CATALOG
  1. 1. 目标
  2. 2. 介绍
  3. 3. Docker配置
    1. 3.1. 安装
    2. 3.2. 配置镜像加速
    3. 3.3. 配置结果
  4. 4. 容器:基础操作
  5. 5. 应用栈
  6. 6. 私有云
    1. 6.1. 私有云工具:registry
    2. 6.2. 搭建
    3. 6.3. 测试
  7. 7. 感想