Docker使用笔记
本篇将记录使用docker的过程以及感想。
docker这个工具是属于运维布署的范畴,与程序开发,其实并没有多大的关系。在此,不妨讨论一下,程序开发与运维。如果一个程序员他所负责的工作只是软件开发,其实并不需要太过于关注运维。如果有面试官问你,你写了这么多年的代码,难道不知道什么叫做负载均衡吗?其实这可能是一句试探性的问题:看你能不能界清程序开发与运维的关系。大部分的应用程序开发人员,可能真的从没有写过这类的代码,也不用在写代码的过程考虑所开发的这个APP能否支持负载均衡,但却需要考虑是否支持高并发量等性能问题。说到这里,读者自辨,是否有继续阅读下去的必要。然而开发人员是不得不接触到一些运维的基本知识的,简单有如IIS,即便VS自带有IIS Express,大部分的.net开发人员还是有过使用Windows IIS 的经验,使用 Ctrl+Alt+P 附加进程 进行调试,因为这相对来说更能贴进生产环境。
下面,我们先举一个最简单的.net core web布署的例子,后面我们要做的事情如下:
1 安装.netcore sdk, nginx, supervisor, 或者 Jexus 这些基本的东西,安装完要改配置,配置完要重启检查是否生效。
2. 上传web应用文件
3. 修改nginx, 重启nginx
4. 修改supervisor, 重启supervisor
也许有人说这看起来好像是很简单的几步,但如果遇到下面的情况,运维人员可能会开始变得浮躁:
1. 要在多台服务器上一起布署这个应用;
2. 要布署一套开发环境,一套测试环境,一套售前沙箱环境,一套预生产环境;
如果都按上面几个步骤一个个去做,估计在做第三第四个的时候,就开始在怀疑的人生的意义何在了。
有需求就有供应,docker应运而生,尽管docker的强大之处不仅仅在于解决以上问题,但它确实解决以上问题的好工具。
docker是如何解决以上问题的,在贴命令之前,我还是先讲讲吧(命令、代码,链接谁都会贴,但不是谁都愿意讲个所以然)
1. 我们在一台机器上将web应用程序组装成一个组件,这个组件包含了一个应用程序运行环境的所有必要条件,以及这个应用程序本身的目录文件,就像一个房车,开到荒山野岭也能过夜。
2. 当我们要运行这个应用程序,我们要在服务器上开辟一个空间,以运行这个组件,那么接下来,是不是要把组件拷贝到这个空间里面,然后运行它。这个问题是docker一个关键点所在。当然不需要。
Docker将这个组件制作成一个镜像。当我们需要运行一个应用程序时,通过这个镜像去创造一个容器。这就有如面向对象开发语言中的类和实例,这个类的定义非常的丰富,里面包含了一个应用程序运行时的所有必要条件的定义。
我们知道实例化一个类的时候,是可以通过构造函数传参的,我们可以通过不同传参,去创建不同的运行容器,比如上述的开发环境,测试环境。
3. 当我们需要将这个web应用程序安装到另一台服务器的时候,又该如何?是不是上述12再搞一次,当然不行。我们需要将第一台机器的镜像共享出去,以让第二台机器可以通过第一台机器的镜像,去创建新的容器。
如何做:在第一台机器或者新开一台机器,用于创建镜像仓储,故名思义,这个仓储是用于存放镜像的仓库。将镜像上传至仓储之后,其实机器可以到这里来下载镜像,然后实例化运行容器。
以上便是用docker进行分布式发布应用的基本过程,可以快速地发布多环境,多站点。
接下来,我开始复制粘帖命令,贴链接,我用是的ubuntu 16.04
一、在第一台机器 192.168.40.128,用于制作一个镜像:
1. 安装docker,详见https://docs.docker.com/install/linux/docker-ce/ubuntu/
配置docker加速器
# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://d8b3zdiw.mirror.aliyuncs.com"]
}
然后重启docker服务
# systemctl daemon-reload
# systemctl restart docker
2. 上传应用程序文件到服务器上
3. 拉取dotnet/aspnetcore的最新镜像,这里以aspnetcore 2.0为例
# docker pull microsoft/aspnetcore:2.0
4. 在这个目录创建一个文件 Dockerfile
里面内容:
# 父镜像
FROM microsoft/aspnetcore:2.0
# 设置工作目录
WORKDIR /app
# 复制发布文件到/app下
COPY . /app
#设置Docker容器对外暴露的端口 EXPOSE 80
#容器中使用 ["dotnet","系统启动的dll"] 来运行应用程序
#使用ENTRYPOINT ["dotnet","系统启动的dll"]
#或使用 CMD ["dotnet","系统启动的dll"]
ENTRYPOINT ["dotnet", "DockerTest.dll"]
5. 打包镜像
# docker build -t dnappbox:1.0 .
6. 打包完看一下
# docker images
7. 运行
#docker run -d -p 8081:80 --name dnapp1 dnappbox:1.0
8. 停止运行容器 --要先查看容器ID(#docker ps -a)
#docker stop {containerId}
9. 删除容器
#docker rm {containerId}
10. 删除镜像
#docker rmi {imageId} --要先查到镜像ID;
11.删除镜像时,如果镜像被多个Repository所引用:
#docker rmi {repository}:{tag}
二、在第一台机器 192.168.40.128,创建一个镜像仓储
1. 下载Registry镜像并启动
#docker pull registry
2. 运行一个Registry镜像仓库的容器实例
#docker run -d -v /edc/images/registry:/var/lib/registry -p 5000:5000 --restart=always --name xdp-registry registry
3. 最后,在客户端查看镜像仓库中的所有镜像
curl http://192.168.40.128:5000/v2/_catalog
报错:error: Get https://192.168.40.128:5000/v2/_ping: http: server gave HTTP response to HTTPS client.
解决:# vim /etc/docker/daemon.json
加上下面这一句:
{ "insecure-registries" : [ "192.168.40.128:5000" ] }
重新启动docker服务:# systemctl restart docker
4. 上传镜像到仓储
a.为要上传的镜像打Tag
#docker tag dnappbox:1.0 192.168.40.128:5000/dnappbox:1.0
b.上传镜像
#docker push 192.168.40.128::5000/dnappbox:1.0
5. 查看镜像
# docker images
三、 在第二台机器 192.168.40.129上传下载镜像,并运行之
1. 前提是这台机子也要安装docker服务
2. 下载镜像
docker pull 192.168.40.128:5000/dnappbox:1.0
3. 查看镜像
# docker images
4. 运行下载下来的镜像
#docker run -d -p 8011:80 --name dnappbox2 192.168.40.128:5000/dnappbox:1.0
5. 查看下本机所以镜像,以及镜像的容器的总体情况
#docker ps -a
以上记录了从一台机器生成镜像,上传至仓储,并在另一台机器下载镜像,然后运行一系列的具体步骤。