参考文档:html
https://docs.docker.com/install/linux/docker-ce/centos/linux
http://www.dockerinfo.net/documentnginx
https://dotnet.microsoft.com/download/linux-package-manager/centos/sdk-currentgit
http://www.javashuo.com/article/p-hpjsqqtr-ev.htmlgithub
http://www.javashuo.com/article/p-kkjokozm-cm.htmlweb
http://www.javashuo.com/article/p-bcicqkzx-bx.htmldocker
服务器系统:CentOS Linux release 7.2.1511windows
相关工具:VS2017 xftp puttycentos
服务器软件:.net core 2.0,docker 18.09.6,浏览器
以前写过一篇文章,《.net core项目部署到centos7》,最近看到不少关于docker的文章,感受这种方式确实好,因此本身也按着别人的文章实现了一把,确实很方便。先来看一张图片,下面这条大鲸鱼,很形象的描述了Docker的功能,上面的箱子就是一个一个独立的容器。
这里先引用官方文档对Docker进行一下介绍:
Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,听从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护。
Docker 自开源后受到普遍的关注和讨论,以致于 dotCloud 公司后来都更名为 Docker Inc。Redhat 已经在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 产品中普遍应用。
Docker 项目的目标是实现轻量级的操做系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。
在 LXC 的基础上 Docker 进行了进一步的封装,让用户不须要去关心容器的管理,使得操做更为简便。用户操做 Docker 的容器就像操做一个快速轻量级的虚拟机同样简单。
下面的图片比较了 Docker 和传统虚拟化方式的不一样之处,可见容器是在操做系统层面上实现虚拟化,直接复用本地主机的操做系统,而传统方式则是在硬件层面实现。
为何要使用Docker
容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽可能小。传统虚拟机方式运行 10 个不一样的应用就要起 10 个虚拟机,而Docker 只须要启动 10 个隔离的应用便可。
具体说来,Docker 在以下几个方面具备较大的优点。
一、更快速的交付和部署
对开发和运维(devop)人员来讲,最但愿的就是一次建立或配置,能够在任意地方正常运行。
开发者可使用一个标准的镜像来构建一套开发容器,开发完成以后,运维人员能够直接使用这个容器来部署代码。 Docker 能够快速建立容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其余成员更容易理解应用程序是如何建立和工做的。 Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。
二、更高效的虚拟化
Docker 容器的运行不须要额外的 hypervisor 支持,它是内核级的虚拟化,所以能够实现更高的性能和效率。
三、更轻松的迁移和扩展
Docker 容器几乎能够在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、我的电脑、服务器等。 这种兼容性可让用户把一个应用程序从一个平台直接迁移到另一个。
四、更简单的管理
使用 Docker,只须要小小的修改,就能够替代以往大量的更新工做。全部的修改都以增量的方式被分发和更新,从而实现自动化而且高效的管理。
若是CentOS服务器没有安装netcore,须要先用下图的命令安装一下,我选择的是dotnet-sdk-2.0.0,你们也能够根据本身的程序来选择安装,
安装dotnet-sdk的参考文档:https://dotnet.microsoft.com/download/linux-package-manager/centos/sdk-current
sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm #在安装.NET以前,您须要注册Microsoft密钥,注册产品存储库并安装所需的依赖项。每台机器只须要安装一次。
sudo yum update
sudo yum install dotnet-sdk-2.0.0
在2017年的3月1号以后,Docker的版本命名开始发生变化,同时将CE版本和EE版本进行分开,这里咱们选择安装免费的CE社区版,
具体区别能够参考:https://docs.docker.com/install/linux/docker-ce/centos/
$ sudo yum install docker-ce docker-ce-cli containerd.io //安装命令 $ sudo docker --version //查看版本 $ sudo systemctl start docker.service //启动docker $ sudo systemctl enable docker.service //设置开机启动
经过docker --version命令,能够看到版本号为18.09.6,用命令 systemctl start docker.service 启动docker后,咱们能够测试下docker是否安装成功,执行docker run hello-world命令,会看见提示
Unable to find image 'hello-world:latest' locally,意思是说在本地仓库没有找到镜像'hello-world',以后会从官方仓库中拉取了该镜像,而后执行。看到下图的内容,就表示docker安装成功并运行了。
这个没什么好说的,咱们用vs2017建立一个演示用的mvc项目。program.cs文件作以下修改
有两种方法,一种是右键点击项目:添加-->Docker支持,建立Dockerfile文件;
每二种是直接在项目根目录下手动建立该文件,Dockerfile文件的内容大体以下:
# 添加基础镜像:docker会从网络下载这个镜像 FROM microsoft/dotnet:2-aspnetcore-runtime #容器中系统的工做空间 WORKDIR /app #拷贝当前文件夹下的文件到容器中系统的工做空间(注意:“.”后面有空格) COPY . /app #设置Docker容器对外暴露的端口 EXPOSE 8080 #容器中使用 ["dotnet","系统启动的dll"] 来运行应用程序 #使用ENTRYPOINT ["dotnet","系统启动的dll"] #或使用 CMD ["dotnet","系统启动的dll"] ENTRYPOINT ["dotnet", "WebTest.dll"]
下面到了关键的一步了,构建项目镜像,咱们将上面建立的mvc项目进行发布,而后将发布后的文件上传至CentOS服务器,而后定位到站点文件夹,执行下面的命令:
sudo docker build -t webtest:1.0 .
webtest是咱们建立的镜像名字,冒号后面的1.0能够理解为版本号,再后面是一个空格再加一个点,这个点表示当前路径!!
看到Successfully,表示镜像构建成功。
能够输入命令docker images查看仓库中的镜像。
sudo docker images //查看全部镜像 sudo docker ps //查看运行中的容器 sudo docker ps -a //查看全部容器 sudo docker rm 容器id //删除容器 sudo docker rmi 镜像id //删除镜像 sudo docker pull microsoft/aspnetcore:2 //拉取指定版本的core
如今就差最后一步运行了,咱们用下面的命令运行刚刚建立的webtest镜像,
这里经过 -p 参数映射容器的8080到宿主机的8080端口:8080:8080(宿主:容器)
-d 参数告诉docker之后台任务形式运行镜像
sudo docker run -d -p 8080:8080 webtest:1.0
输入命令docker ps查看运行中的容器,注意Status列,Up表示咱们刚刚建立的容器正在运行
在咱们的windows中,浏览器输入服务器IP+端口号,能够看到站点已经跑起来了
OK,任务完成。
Docker的卸载,不打字了,直接截图了:
配置镜像加速
//由于默认的镜像仓库远在国外,拉取一个小的镜像时间还能够忍受,若拉取一个上G的镜像就有点太折磨人了,咱们使用DaoCloud镜像加速器来进行镜像加速。Linux上配置方法以下:
$ curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io $ sudo systemctl restart docker
若是服务器重启reboot,你会发现站点随即挂掉了,由于容器也自动退出,若是想让服务器重启后容器内的镜像自动启动,能够在运行docker容器时,加上下面的命令:
docker run --restart=always -d -p 8080:8080 webtest:1.0
docker经常使用命令
docker pull 镜像名称 //拉取镜像 docker rm -f 容器id //强制删除容器 docker rmi imageid //删除镜像 docker logs -f 容器ID //查看容器日志
docker stop $CONTAINER_ID /docker ps -a //查看全部的容器
docker attach 容器id //进入到容器,通常经常使用下面的命令进入到容器内部
docker exec -it 容器id /bin/bash
docker build -t s2appadmin . //使用Dockerfile文件编译Docker dotnet publish //发布dotnetcore应用 dotnet run //启动dotnetcore应用 dotnet *.dll //在发布后的目录中执行dotnet 程序集的dll文件名,启动应用 nginx -v //查看nginx版本 nginx -s reload //从新加载nginx nginx -s stop //中止nginx