zoukankan      html  css  js  c++  java
  • 二、Docker部署应用

    一、有关Docker的安装请参考docker官网 

    Docker 提供了两个版本:社区版 (CE) 和企业版 (EE)。 Docker 社区版 (CE) 是开发人员和小型团队开始使用 
    Docker 并尝试使用基于容器的应用的理想之选。Docker CE 有两个更新渠道,即 stable 和 edge: 
          Stable 每个季度为您提供可靠更新 
          Edge 每个月为您提供新功能 

    支持的平台


    二、Docker 安装Asp.Net Core镜像-有关镜像安装请参考https://hub.docker.com

     1、打开 https://hub.docker.com 右上角搜索dotnet,选择第一个搜索结果microsoft/dotnet,点进去如下图

     切换到命令行窗口运行以下命令来安装asp.net core 镜像

    docker pull microsoft/aspnetcore  

    如果我们想拉取指定的aspnetcore版本,可使用如下命令:

    docker pull microsoft/aspnetcore:1.0
    docker pull microsoft/aspnetcore:2.0  

     之后执行以下命令查看是否拉取成功:

    docker images

      在dockerhub官网中有着dotnet和aspnetcore的镜像,dotnet可以看作是集大成者,包含了.netcore控制台aspnetcore的所有,而aspnetcore是以dotnet镜像为基础,在aspnetcore中只包含了RunTime和构建当前项目为镜像的工具,这也就意味着如果我们要直接使用aspnetcore为镜像,我们的项目是要已经编译好了的,才可以直接使用这个镜像。
      而当你使用dotnet镜像时,包含了编译工具,Runtime,一切的一切,这也激素dotnet镜像比aspnetcore镜像大这么多的原因了。

    三、容器的管理和操作

    1、查  

    docker ps  #查看运行的容器
    docker ps -a #查看所有容器  

    2、添加

    docker create -it centos:latest  #创建容器
    docker run -ti centos:latest /bin/bash   #创建并启动容器
    

      

    3、删除

    docker stop $(docker ps -q)   #停用全部运行中的容器
    docker rm $(docker ps -aq)    #删除全部容器
    docker stop $(docker ps -q) & docker rm $(docker ps -aq)  #一条命令实现停用并删除容器
    docker stop 24f373b8ed24      #停止指定容器
    docker restart 24f373b8ed24   #重启指定容器
    

      

    docker rmi f09fe80eb0e7        #删除指定镜像
    docker rmi $(docker images -q)   #删除全部镜像
    

      

    项目实践 

    1、docker run -itd -p 8001:8001 microsoft/dotnet
      -p用来添加Host跟Container的端口映射
    2、docker exec -it c14d7da5d352 bash  //进入到容器中 docker run -it microsoft/dotnet /bin/bash 注:每次进入不要run 会初始化一个新容器实例
    3、dotnet new mvc -n MyFirstDocker.Web //创建项目名为MyFirstDocker.Web的ASP.NET Core MVC项目
    4、cd MyFirstDocker.Web  //进入MyFirstDocker.Web项目文件夹
    5、dotnet run //启动项目
    
    注意-在cd后我们要查看 cat Program.cs    #vi Program.cs和vim Program.cs是无效的,只能使用cat查看命令
    特别注意-宿主机不能直接访问容器;比如不能通过通过localhost或者127.0.0.1访问,需要开额外的防火墙
    curl http://127.0.0.1:8001
    

      

     

    图-进入容器方式  

     注意:找到这个项目修改项目端口为8001

    图-添加自定义端口的访问方式-通过将容器拷贝到宿机改动后,再把宿机的访问放回容器内。

    图-访问的方式(开两个ssl,在容器内访问)

     

    如何在容器与本地之间 copy 文件

    1、从本地到容器

    拷贝文件语法:docker cp filename <[CONTAINER ID]>:/file/path/within/container
    docker cp /home/core/publish c14d7da5d352:/demo   #从本地都容器
    

    2、从容器到本地

    拷贝文件语法:docker cp [CONTAINER ID]:/file/path/within/container /host/path/target
    docker cp c14d7da5d352:/demo/hello.txt /root
    

      

     

    注意:都是在linux宿机上操作docker开头的语法

    四、项目搭建实践

     Dockerfile中记录了我们的程序在Docker环境中的各种配置

     1、创建Core项目

     2、修改端口

        .UseUrls("http://127.0.0.1:8001")  //更改启动端口
    

    3、更改dockerfile文件-新建选择docker支持,默认创建了该文件直接修改即可:

    #基于 `microsoft/aspnetcore:2.0` 来构建我们的镜像
    FROM microsoft/aspnetcore:2.0
    
    #拷贝项目publish文件夹中的所有文件到 docker容器中的publish文件夹中  
    COPY . /publish
    
    #设置工作目录为 `/publish` 文件夹,即容器启动默认的文件夹
    WORKDIR /publish
    
    #设置Docker容器对外暴露80端口
    EXPOSE 80
    
    #使用`dotnet FristCore.dll`来运行应用程序   -dotnet run是运行.net项目而非.net core项目
    ENTRYPOINT ["dotnet", "FristCore.dll"]
    

    4、发布-创建publish文件,将发布内容放入publish内

    4.1将publish拷贝到创建的容器内     

    4.2找到项目目录并运行

    4.3开启两个SSH,一个运行Web,一个curl http://127.0.0.1:80

    直接操作-在创建容器的时候就把上传的publish作为数据卷

    docker run -itd -v /root/publish:/publish  -p 8080:80 microsoft/dotnet 
    

      

    宿机不能访问容器的问题

    排查方式

    docker run -itd -p 80:80 nginx   #运行一个nginx服务,在宿机curl访问和浏览器访问测试-都可以访问

    原来该服务默认暴露80端口,暴露8001肯定不行

    https://hub.docker.com/r/microsoft/dotnet/
    

      

    暴露其他端口需自己配置  

     最重要的原因

    程序启动绑定的是127.0.0.1

    官方demo

     宿主机这么访问 走docker 就不是127了 项目导致拦截
     
    最终效果
     
    改动的部分两部分
    Program.cs
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Threading.Tasks;
    using Microsoft.AspNetCore;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.Logging;
    
    namespace FristCore
    {
        public class Program
        {
            public static void Main(string[] args)
            {
                BuildWebHost(args).Run();
            }
    
            public static IWebHost BuildWebHost(string[] args) =>
                WebHost.CreateDefaultBuilder(args)
                    .UseUrls("http://*:80") //如果不配置下面这条信息,会导致无法直接访问
                    .UseStartup<Startup>()
                    .Build();
        }
    }
    

    Dockerfile

    #基于 `microsoft/dotnet` 来构建我们的镜像
    FROM microsoft/dotnet
    #拷贝项目publish文件夹中的所有文件到 docker容器中的publish文件夹中 
    COPY . /publish
    #设置工作目录为 `/publish` 文件夹,即容器启动默认的文件夹
    WORKDIR /publish
    #设置Docker容器对外暴露80端口
    EXPOSE 80
    #使用`dotnet FristCore.dll`来运行应用程序   -dotnet run是运行.net项目而非.net core项目
    ENTRYPOINT ["dotnet", "FristCore.dll"]
    

      

      

     

    五、使用 Dockerfile 部署

     dockerfile 是你自己创建镜像时候用,使用别人镜像则是不需要。

    六、下载Portainer镜像-参考官网 https://portainer.readthedocs.io/en/stable/deployment.html

    1、下载Portainer通过官网或者docker方式安装

    # 查询当前有哪些Portainer镜像
    docker search portainer

     镜像名称 portainer/portainer

    docker pull portainer/portainer 

    2、安装并运行Portainer

    1、简单方式运行 portainer:
    docker run -d -p 9000:9000 portainer/portainer
    2、Swarm集群方式运行 portainer:
    docker service create 
    
    --name portainer 
    
    --publish 9000:9000 
    
    --constraint 'node.role == manager' 
    
    --mount type=bind,src=//var/run/docker.sock,dst=/var/run/docker.sock 
    
    portainer/portainer 
    
    -H unix:///var/run/docker.sock
    
    注意:先建好Swarm集群,再部署portainer,这样才能管理Swarm集群。集群

    开放端口:-p 9000:9000 :宿主机9000端口映射容器中的9000端口
    访问方法:http://主机IP:9000

    默认账号admin 密码 tryportainer
    

      

    2、[可选]docker 命令与 Docker 引擎通讯之间通过 UnixSocket ,但是能够有权限访问 UnixSocket 的用户只有 root 和 docker 用户组的用户才能够进行访问,所以我们需要建立一个 docker 用户组,并且将需要访问 docker 的用户添加到这一个用户组当中来。

    https://blog.csdn.net/junmoxi/article/details/78924107
    
    https://blog.csdn.net/sD7O95O/article/details/78951171
    
    https://www.cnblogs.com/myzony/p/9071210.html
    

      

    注:看了mysql和php以及apache 才知道  一个服务对应一个docker容器 这样易扩展 

    微服务建议用docker来部署

    spring cloud这个是微服务,多模块dobbo算分布式

     跟在几台服务器没关系,这是服务器上的扩容而已。微服务是整个项目,业务上分成很多细小单一的模块,再拼接在一起
     每个模块都是独立部署
  • 相关阅读:
    OSI,TCP/IP,五层协议的体系结构,以及各层协议
    linux及安全期中总结——20135227黄晓妍
    linux及安全《Linux内核设计与实现》第四章——20135227黄晓妍
    linux及安全《Linux内核设计与实现》第三章——20135227黄晓妍
    linux及安全第八周总结——20135227黄晓妍
    linux及安全第七周总结——20135227黄晓妍
    linux及安全第六周总结——20135227黄晓妍
    linux及安全第五周总结——20135227黄晓妍
    linux及安全第四周总结——20135227黄晓妍
    linux及安全《Linux内核设计与实现》第二章——20135227黄晓妍
  • 原文地址:https://www.cnblogs.com/fger/p/10373249.html
Copyright © 2011-2022 走看看