序、写在最开始的扯淡
最开始听说Docker的时候,还是两年前我读大三的时候。那时候专业主任在课上跟我们一本正经的说这玩意儿会火,然而那时候Docker和C#是八竿子打不着的两个事物,然后当时我对py也是一般般的水平,所以也就没特别去在意它。
然后就是喜闻乐见的风水轮流转啊:微软换了一个阿三裔(此处仅调侃)当CEO之后终于从梦里醒来,拥抱开源与开放。Asp.net MVC5从vNext再到最后的Asp.net Core,接着微软在Visual Studio 2017中,增加了Asp.net MVC项目的Docker支持,让人感觉就像是在恍惚之中就变了天。撇开Asp.net不说,Docker在其他地方也是一路高歌猛进,收下一块又一块的领地,最有名的应该是微服务方面,很多大公司已经开始使用Docker承载微服务的运行。
不过我正式开始使用Docker还是在大四第二学期在实习公司里的时候。当时实习的公司是这样的:他们有一个教育平台,实践环境使用VMware ESXi的虚拟平台,学生要什么环境,Web上点两下,系统后台就会使用API启动对应的实验虚拟机。导师觉得Docker这东西来势汹汹,反响也不错,就让我把新的实验做成Docker容器,说以后公司会把这套系统的虚拟化平台从VMware ESXi迁移到Docker上去,所以也就在这时候开始钻研起Docker来。
钻研了两三个月,感觉略有收获,只可惜公司的技术栈是一边倒的Linux/MySQL/Java/PHP,我这Asp.net程序员并没有什么特别大的发挥空间。自从七月底从实习公司辞职不干之后,又在家里悠悠闲闲的研究了一个月的C#和Docker。所以在这里开一个新系列讲讲自己的收获。
这个系列主要分成两个部分,C#调用Docker的API,最终的目标是做出一个差不多能和我之前实习公司类似的实验平台,因为这个部分内容中文资料网上并不好找,官方给的资料也很少,所以放到前面讲;第二个部分就是如何把自己开发的Asp.net Core项目放到Docker里运行,这部分的资料网上一搜一片,所以就放到后面讲了。至于Docker的使用教程之类的……emmm,一看我心情,二看我水平,再说,再说……
一、Docker的几个版本
在安装Docker之前,需要讲一下Docker的几个版本,是的,Docker有好几个版本:
- docker-io
- docker-engine
- docker-ce
- docker-ee
真是让人头大……
好的,这四个版本之间有什么区别呢?
首先是docker-io和docker-engine,简单的一句话说就是:
docker-io is maintained by Ubuntu; docker-engine is maintained by Docker.
docker-io由Ubuntu团队进行维护;docker-engine由Docker官方进行维护。
然后在今年(2017年)三月份,Docker官方发表博客宣布发布修改Docker的版本号命名规则,新的Docker版本号将使用年月,例如17.03.0代表2017年3月第一版,如果有Bug或安全问题,新版本将会指向17.03.1…
另外Docker官方发布了新的Docker版本Docker EE(Enterprise Edition),并将之前免费的Docker版本更名为Docker CE(Community Edition)继续使用(详细请参阅《Announcing Docker Enterprise Edition》),也就是说docker-engine分支为docker-ce和docker-ee。当然了,docker-ee的功能比docker-ce多,毕竟人家是要付费的:
同时Docker CE有Stable版和Edge版两个版本。Stable版和Edge版的区别如下:
- Edge版每个月更新,提供一个月的支持。Edge版适合于那些想要体验Docker最新技术的用户。
- Stable版每个季度更新,提供三个月的支持。Stable版适合于那些追求稳定易于维护的用户。
Docker EE没有Edge版,只有Stable版,但Docker EE的Stable版将提供一整年的支持服务(毕竟付费 x2)。
Docker官方提供的生命周期图图示:
二、几个常见操作系统的Docker安装
(一) Linux
在Linux中安装Docker之前,有一个值得注意的问题:Docker需要Linux内核版本大于等于3.10,不然在实际使用过程中会发生一些喜(xi)闻(qi)乐(gu)见(guai)的问题(比如这个《Docker Build时出现Kernel panic的解决方案》)
查看当前Linux系统内核版本的方法是在终端中键入命令:
uname -r
系统就会输出当前系统内核,如下图所示,当前Linux系统内核版本为2.6,是需要升级内核后再安装Docker的:
具体升级方法也请参阅这篇博客《Docker Build时出现Kernel panic的解决方案》或上网搜索。
1.CentOS 6
注:笔者并不建议在CentOS 6上安装Docker,因为CentOS 6系统大多内核版本低于3.10。
如果您真的有必要的理由需要在CentOS 6上安装Docker,请先检查您系统内核版本是否大于3.10,如果系统内核版本低于3.10,请参阅本小节开始时的博客,里面有针对CentOS 6升级内核的详细图文教程。
CentOS 6的官方源中并没有Docker的程序包,所以在此之前需要先添加第三方yum源:
安装EPEL:
sudo yum install -y epel-release
安装Docker
yum makecache fast
sudo yum install -y docker.io
安装结束后启动docker服务:
sudo service docker start
将Docker服务设置为开机自启动:
chkconfig docker on
至此安装结束。
2.CentOS 7
CentOS 7的官方yum源中就有docker-io的包,可以直接在终端中键入以下命令进行安装:
yum makecache fast
sudo yum install -y docker-io
安装结束后启动docker服务:
sudo systemctl start docker.service
如果您需要docker服务开机自启动的话,还需要再加一条命令:
sudo systemctl enable docker.service
至此在CentOS 7下安装Docker完成。
注:笔者习惯使用的Linux系统是CentOS 7,所以以后的教程中,大多以使用CentOS 7系统为例。各个Linux发行版之间的差距并不大,在操作中遇到问题请多利用搜索引擎或在博客下评论提出。
3.Ubuntu 16.04
Ubuntu系统也是自带源就有docker程序包,直接安装就好了:
sudo apt-get update
sudo apt-get install -y docker.io
安装完成后启动Docker服务:
sudo service docker start
将Docker服务设置为到开机自启动:
sudo update-rc.d docker defaults
至此安装结束。
4.使用官方脚本安装Docker
之前的几个系统用的都是官方源来安装Docker。但官方源里的Docker版本总是会比最新版本低。如果需要您安装最新的官方Docker,只需要执行一行非常简单的命令:
curl -sSL https://get.docker.com/ | sh
执行后系统就会全自动的安装最新版本Docker了。不过因为官方安装脚本和资源都放在国外的服务器上,由于众所周知的原因(Girl Friend Wall),有时候安装速度会非常慢甚至没法正常安装,这个时候就需要使用国内的第三方镜像了。
国内的第三方镜像很多,我这里用的是阿里云的第三方镜像,使用阿里云镜像安装Docker,使用的命令是:
curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh -
等安装脚本运行完毕,Docker就已经成功的安装到您的Linux系统中了,这种脚本安装的方式支持绝大多数的Linux系统。
(二)Windows
Docker目前官方支持直接安装到Windows 10和Windows Sever 2016上,但并不是说Win10以下的用户就没办法了。Docker官方对于使用Win7和Win8.1的用户提供了一种曲线救国的方法:Docker Toolbox(其实就是通过在您的系统上安装VirtualBox虚拟机来支持Docker的正常运行)。
笔者个人并不特别建议使用Windows作为Docker的部署平台并投入生产环境。因为Docker主要是利用了Linux的LXC,Windows并不包含这个。另外根据部分前人的经验报告,Windows平台下的Docker与Linux下的Docker相比,缺少一些功能。会在实际使用中带来一定的麻烦。
1.Windows 7/Windows 8/Windows 8.1
方便起见这里就直接使用Windows 7做示范。
首先去Docker的官方下载安装包:https://docs.docker.com/toolbox/overview/
找到Toolbox for Windows,点击下面的“Get Docker Toolbox for Windows”按钮进行下载。
下载完成后双击程序图标运行,如果您的系统启用了UAC,还会弹出UAC的授权窗口,单击“是(Y)”即可。
启动安装程序,并没有什么特别需要改动的地方,一路Next到底就好了。
欢迎页面:
选择安装路径:
选择安装模块,一般完整安装就好:
选择附加任务,这里需要说明的是NDIS6不支持Win7以下的系统:
接下来就是安装了,安装的过程中,可能会跳出像下图这样的“Windows 安全”窗口,要求您确认是否安装设备软件,这个时候单击“安装”就好了。这个窗口可能会弹出好几次,如果觉得麻烦可以先选中“始终信任来自‘Oracle Corporation’的软件”这个复选框,然后再单击“安装”按钮。
跑条结束之后就安装好了。
安装好之后启动Docker Quickstart Terminal,如果当时勾选了“在桌面上创建快捷方式”的话,这个图标会出现在桌面上,如果没有勾选也没有关系,开始菜单里也有(开始/所有程序/Docker/Docker Quickstart Terminal)。
第一次启动的时候会进行初始化,Docker Quickstart Terminal会创建CA和客户端证书并尝试从github上下载boot2docker的镜像,由于众所周知的原因(Girl Friend Wall),大陆的下载速度并不理想甚至有时干脆下载不了。比较简单的方法就是将Docker Quickstart Terminal中提示的链接复制出来,用渣雷或者其他下载工具进行下载,然后放到指定的位置。
下面的图示中,下载链接是:https://github.com/boot2docker/boot2docker/releases/download/v17.07.0-ce/boot2docker.iso,本地存放的位置是:C:\Users\wyn\.docker\machine\cache\,文件名为:boot2docker.iso。
将指定文件放到指定位置后,重新启动Docker Quickstart Terminal,此时会继续上次中断的初始化过程。
初始化过程中由于需要添加网络适配器,所以在开启UAC的系统上可能会多次弹出UAC确认窗口,全部选“是”。
之后还是一小段时间的初始化,直到提示“Docker is up and running!”时,整个初始化过程就差不多结束了。
稍等片刻,就可以看到熟悉的鲸鱼图标了:
当出现上面的界面时,就可以键入docker命令了。
至此安装结束。
2.Windows 10
Win10相比其他低版本Windows,可以直接使用Docker官方提供的exe安装包直接安装。嘛,原理就是Docker用了Win10自带的Hyper-V,所以Win10 Home版的用户就不能装了,因为Win10 Home版没有Hyper-V支持……真的,Win10 Home版可以完成安装,但安装之后一运行就是这个样子:
不扯淡了。讲一下Win10怎么装Docker,步骤比Win7它们简单。
首先上Docker官网下载Docker安装包:https://docs.docker.com/docker-for-windows/install/#download-docker-for-windows。这里会让您选择是Stable版还是Edge版。这两个版本的区别之前提过,各位看官根据自己需要选择下载。
下载之后运行下载所得的Docker for Windows Installer.exe安装包启动安装程序。老样子开着UAC的系统会弹出UAC警告,确认即可。
相比于低版本Windows的安装来说,Win10版的Docker安装就非常简单了,在通过UAC确认之后安装程序就一句话不说开始下载资源并解包安装了:
安装完成之后会窗口会提示需要注销用户并重新登陆以完成安装。单击窗口中间的“Close and log out”就会自动注销当前用户,单击前记得保存未保存的工作。
注销后重新登陆系统,单击桌面上的“Docker for Windows”图标启动Docker。第一次运行时Docker也会进行必要的初始化,稍等片刻即可。如果您当前系统没有打开Hyper-V功能,Docker也会弹窗提示:
Hyper-V feature is not enabled.
Hyper-V功能尚未启用。
Do you want to enable it for Docker to be able to work properly?
您想要启用它使得Docker能够正常工作吗?
Your computer will restart automatically.
您的计算机将自动重新启动。
选择“Ok”之后,Docker将会打开Win10的Hyper-V功能,并自动重新启动Windows。
在漫长的初始化结束后,您可以看到Docker弹出正在运行的通知:
这个时候就可以启动PowerShell,使用Docker了。
三、常见问题
(一)Docker所有命令都无法正常使用,提示:“docker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?.”
如果遇到这个问题,首先判断您的Docker服务是否正在运行。如果Docker服务正在运行,那就是/var/run/docker.sock套接字文件权限问题了。
套接字文件权限问题其实非常常见,如果您没有遇到,那大概是因为您用的是root用户,使用root用户可以规避这个问题。
套接字文件权限问题发生的主要原因是:
本地的Docker Client与Docker Daemon(就是Docker服务)之间的是通过Unix Socket进行交互的。默认情况下用于通讯的docker.sock文件权限是这样的(这里是Ubuntu系统的情况,Ubuntu在安装Docker的时候会默认创建docker组):
Docker服务启动之后会在/var/run目录下创建docker.sock套接字文件。在这个文件刚创建时它是归属于root用户root组的,当Docker服务启动完成后会自动将此套接字文件修改其所有组为docker用户组。
所以在默认情况下,只有root用户或docker用户组才有对此文件的读写权限。如果当前您使用的用户不满足这两个条件,就会出现明明Docker Daemon服务已经运行了但运行任何docker命令就会出现“docker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?.”的提示。
解决方案如下:
创建docker用户组:
注:Ubuntu会在安装的过程中自动添加docker组,如果键入此命令被提示“groupadd:‘docker’组已存在”的话直接忽略即可。
sudo groupadd docker
将当前用户加入docker用户组:
sudo gpasswd -a $LOGNAME docker
重启Docker服务:
sudo service docker restart
完成上面的步骤后,注销并重新登陆当前用户后就可以解决问题了。
(二)Docker从官方仓库pull镜像时速度非常慢
这个问题的原因非常简单,Docker的官方仓库在国外,由于由于众所周知的原因(Girl Friend Wall),大陆的下载镜像的速度并不理想甚至有时干脆下载不了。
解决的办法是改用国内第三方镜像仓库,这个网上一搜一片,不过我个人推荐使用阿里云的Docker Hub加速,这个服务阿里云是免费提供的,而且还有专门的指导文档。
阿里云Docker Hub服务:https://cr.console.aliyun.com.
在初次使用的时候会提示开通Docker镜像仓库服务并初始化设置,要求您设置镜像仓库的密码,这里根据阿里云的要求提示设置密码。
单击确定后完成Docker镜像仓库服务的开通,我们现在不需要使用Docker镜像仓库服务,直接单击左侧菜单里的“Docker Hub 镜像站点”功能。
阿里云为每位会员分配了专属的加速器地址。您可以同时也可以根据下方的操作文档设置您的Docker客户端。
这里以CentOS 7为例:
写入配置:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["您的专属加速器地址"]
}
EOF
重启Docker服务使得新配置生效:
sudo systemctl daemon-reload
sudo systemctl restart docker
现在从官方仓库pull镜像就快多了。
四、Hello World!
在安装Docker完成我们需要测试一下现在Docker能否正常运行。
怎么测试?
Hello World!
键入命令
docker run hello-world
如果您的Docker配置无误一切正常,那么它会自动从官方仓库中pull下hello-world的镜像并运行输出:
如果能够正常输出,说明您的Docker已经安装并配置完毕,欢迎来到Docker的世界!
小柊
2017年9月6日 22:32:32
2 条评论发布于 “C# Docker开发(一) Docker的安装”