zoukankan      html  css  js  c++  java
  • Centos7系统Docker环境下运行Netcore

    目录

    0.Docker简介

    1.Docker安装

    2.发布NETCore项目

    3.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网络,提供网络隔离能力。

    参考博客:

    docker容器的网络配置,允许docker可以被宿主机以外的其它主机访问以及局域网内可以直接访问docker容器ip

    .NET Core容器化(Docker)

  • 相关阅读:
    java反射机制
    java的hashmap与hashtable说明,简单易理解
    awk
    python的w+到底是什么
    hive深入浅出
    【OpenCV新手教程之十五】水漫金山:OpenCV漫水填充算法(Floodfill)
    对你相同重要的非技术贴,10件事证明你跟错了人
    SVM中为何间隔边界的值为正负1
    pushlet服务端推送——多播
    谁洗碗,搭载我的技术目标,起航。
  • 原文地址:https://www.cnblogs.com/zt102545/p/13940233.html
Copyright © 2011-2022 走看看