Centos7系统Docker环境下运行Netcore
目录
0.Docker简介
Docker是用Go语言编写基于Linux操作系统的一些特性开发的,其提供了操作系统级别的抽象,是一种容器管理技术,它隔离了应用程序对基础架构(操作系统等)的依赖。相较于虚拟机而言,Docker共享的是宿主机的硬件资源,使用容器来提供独立的运行环境来运行应用。虚拟机则是基于Supervisor(虚拟机管理程序)使用虚拟化技术来提供隔离的虚拟机,在虚拟机的操作系统上提供运行环境!虽然两者都提供了很好的资源隔离,但很明显Docker的虚拟化开销更低!
Docker涉及了三个核心概念:Register、Image、Container。
1.Registry:仓库。用来存储Docker镜像,比如Docker官方的Docker Hub就是一个公开的仓库,在上面我们可以下载我们需要的镜像。
2.Image:镜像。开发人员创建一个应用程序或服务,并将它及其依赖关系打包到一个容器镜像中。镜像是应用程序的配置及其依赖关系的静态形式。
3.Container:容器。Container是镜像的运行实例,它是一个隔离的、资源受控的可移植的运行时环境,其中包含操作系统、需要运行的程序、运行程序的相关依赖、环境变量等。
它们三者的相互作用关系是:
当我们执行Docker pull或Docker run命令时,若本地无所需的镜像,那么将会从仓库(一般为DockerHub)下载(pull)一个镜像。Docker执行run方法得到一个容器,用户在容器里执行各种操作。Docker执行commit方法将一个容器转化为镜像。Docker利用login、push等命令将本地镜像推送(push)到仓库。其他机器或服务器上就可以使用该镜像去生成容器,进而运行相应的应用程序。
Docker一些常用的指令
打包镜像:docker build -t <镜像名称> <路径>
查看镜像:docker images
删除镜像:docker rmi <镜像id>
查看容器:docker ps
创建容器:docker run -d -p <主机端口号>:<容器端口号> <镜像名称>
停止容器:docker stop <容器id>
停止所有容器:docker stop $(docker ps -a -q)
删除所有容器:docker rm $(docker ps -a -q)
删除容器:docker rm <容器id>
进入容器:docker exec -it <容器id> /bin/bash
导出镜像:docker save > <导出文件名.tar> <镜像名称>
导入镜像:docker load < <导入文件名>
1.Docker安装
Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker 。
在Centos 7系统下执行:
1.通过 uname -r 命令查看你当前的内核版本
uname -r
2.更新下yum包,更新到最新
sudo yum update
3.卸载旧版本(如果安装过旧版本的话)
sudo yum remove docker docker-common docker-selinux docker-engine
4.安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
5.添加软件源信息
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
6.更新yum缓存
sudo yum makecache fast
7.安装docker最新版
sudo yum -y install docker-ce
8.启动docker服务
sudo systemctl start docker
9.设置docker开机启动
sudo systemctl enable docker
10.验证安装是否成功(有client和service两部分表示docker安装启动都成功了)
docker version
2.发布NETCore项目
在Window下的VS 2017执行:
1.新建一个netcore项目:选择ASP.NET CORE Web应用程序,把为HTTPS配置勾掉,不然的话后面访问5000端口会转发到HTTPS协议的5001端口,docker去运行项目时会报“docker curl: (56) Recv failure: Connection reset by peer”。
2.新建后是一个空的项目,主要是做测试用的,所以直接编译发布。
3.发布后进入发布目录,创建一个命名为Dockerfile文件,注意该文件没有扩展名,不是txt的文件。编辑该文件,写入以下指令
FROM microsoft/dotnet:latest
WORKDIR /app
COPY . /app
EXPOSE 5000
ENV ASPNETCORE_URLS http://*:5000
ENTRYPOINT ["dotnet","DockerWeb.dll"]
解释下以上指令的含义:
使用FROM指定容器使用的镜像
使用WORKDIR指定容器工作目录
使用COPY指令,复制当前目录(其中.即代表当前目录)到容器中的/app目录下
使用EXPOSE指定容器暴露的端口号
使用ENV指定环境参数,上面用来告诉.NETCore项目在所有网络接口上监听5000端口
使用ENTRYPOINT制定容器的入口点,我项目命名为DockerWeb,所以执行的是DockerWeb.dll文件,查看自己发布的目录对应应该执行哪个文件。
4.保存退出,将该发布项目拷贝到CentOS7系统里的任意位置。我的目录是/root/Documents/DockerWeb。
3.Docker环境下运行Netcore项目
回到CentOS7系统下,我们已经安装了Docker,也有Netcore项目了,但是我们想要在Dcoker环境下运行Netcore还需要dotnet镜像。
1.dotnet镜像可以从Docker镜像仓库拉取,但是默认的镜像仓库远在国外,我们需要使用DaoCloud
镜像加速器来进行镜像加速。配置方法如下:
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://37bb3af1.m.daocloud.io
#在重启下docker
systemctl restart docker
2.配置完毕后执行以下指令拉取dotnet镜像,安装完毕后执行docker images可以看到本地已经包含了microsoft/dotnet镜像。
docker pull microsoft/dotnet
3.下面我们将发布的项目打包成镜像以分发部署。使用docker build -t <name> <path>指令打包镜像,name一定要是小写否则报错。
docker build -t dockerweb /root/Documents/DockerWeb
4.最后执行以下指令运行项目
docker run -d -p 80:5000 dockerweb
5.可以用curl指令来测试是否运行成功
curl http://localhost
如果报以下错误:
docker curl: (56) Recv failure: Connection reset by peer
这个可能是端口映射的问题,那么第4部可以尝试用以下指令:
docker run -d --net="host" --privileged=true -p 5000:5000 dockerweb
curl http://localhost:5000
--privileged参数表示Docker将拥有访问主机所有设备的权限,同时Docker也会在apparmor或者selinux做一些设置,使容器可以容易的访问那些运行在容器外部的设备。
--net表示容器的网络模式,docker容器有5种网络模式
1)bridge模式,--net=bridge(默认)
这是dokcer网络的默认设置,为容器创建独立的网络命名空间,容器具有独立的网卡等所有单独的网络栈,是最常用的使用方式。
在docker run启动容器的时候,如果不加--net参数,就默认采用这种网络模式。安装完docker,系统会自动添加一个供docker使用的网桥docker0,我们创建一个新的容器时,
容器通过DHCP获取一个与docker0同网段的IP地址,并默认连接到docker0网桥,以此实现容器与宿主机的网络互通。
2)host模式,--net=host
这个模式下创建出来的容器,直接使用容器宿主机的网络命名空间。
将不拥有自己独立的Network Namespace,即没有独立的网络环境。它使用宿主机的ip和端口。
3)none模式,--net=none
为容器创建独立网络命名空间,但不为它做任何网络配置,容器中只有lo,用户可以在此基础上,对容器网络做任意定制。
这个模式下,dokcer不为容器进行任何网络配置。需要我们自己为容器添加网卡,配置IP。
因此,若想使用pipework配置docker容器的ip地址,必须要在none模式下才可以。
4)其他容器模式(即container模式),--net=container:NAME_or_ID
与host模式类似,只是容器将与指定的容器共享网络命名空间。
这个模式就是指定一个已有的容器,共享该容器的IP和端口。除了网络方面两个容器共享,其他的如文件系统,进程等还是隔离开的。
5)用户自定义:docker 1.9版本以后新增的特性,允许容器使用第三方的网络实现或者创建单独的bridge网络,提供网络隔离能力。
参考博客: