参考文档:
https://docs.docker.com/install/linux/docker-ce/centos/
http://www.dockerinfo.net/document
https://dotnet.microsoft.com/download/linux-package-manager/centos/sdk-current
https://www.cnblogs.com/viter/p/10463907.html
https://www.cnblogs.com/freewsf/p/7818791.html
https://www.cnblogs.com/sheng-jie/p/8107877.html
环境
服务器系统:CentOS Linux release 7.2.1511
相关工具:VS2017 xftp putty
服务器软件:.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 在如下几个方面具有较大的优势。
1、更快速的交付和部署
对开发和运维(devop)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。
开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。 Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。 Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。
2、更高效的虚拟化
Docker 容器的运行不需要额外的 hypervisor 支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。
3、更轻松的迁移和扩展
Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。
4、更简单的管理
使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。
一、服务器安装dotnet-sdk
如果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 //使用docker部署,可以不用装dotnetcore环境
二、Docker 安装
在2017年的3月1号之后,Docker的版本命名开始发生变化,同时将CE版本和EE版本进行分开,这里我们选择安装免费的CE社区版,
具体区别可以参考:https://docs.docker.com/install/linux/docker-ce/centos/
首先是添加包源:
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
如果报yum-config-manager命令不存在,是因为系统默认没有安装这个命令,这个命令在yum-utils 包里,可以通过命令yum -y install yum-utils 安装就可以了
然后执行下面的安装命令:
$ 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安装成功并运行了。
三、创建.NetCore项目
3.1 创建演示项目
这个没什么好说的,我们用vs2017创建一个演示用的mvc项目。program.cs文件做如下修改
3.2为项目编写Dockerfile文件
有两种方法,一种是右键点击项目:添加-->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"]
3.3 构建镜像
下面到了关键的一步了,构建项目镜像,我们将上面创建的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
3.4 运行镜像
现在就差最后一步运行了,我们用下面的命令运行刚刚创建的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相关知识
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 容器内安装vim:apt-get update 执行完之后执行 apt-get install vim
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