在Windows下使用Docker,我们选择Docker Desktop这个软件,非常方便。

Docker Desktop介绍及安装

Docker Desktop是适用于Mac、Linux或Windows环境的一键安装应用程序,使您能够构建和共享容器化应用程序和微服务。

它提供了一个简单的GUI(图形用户界面),允许您直接从机器管理容器、应用程序和图像。Docker Desktop既可以单独使用,也可以作为CLI的补充工具。

Docker Desktop减少了在复杂设置上花费的时间,因此您可以专注于编写代码。它负责端口映射、文件系统问题和其他默认设置,并定期更新错误修复和安全更新。

安装Docker Desktop后,默认安装了以下组件:

  • Docker Engine
  • Docker CLI client
  • Docker Buildx
  • Extensions
  • Docker Compose
  • Docker Content Trust
  • Kubernetes
  • Credential Helper

Docker Desktop可与您选择的开发工具和语言配合使用,并使您能够访问Docker Hub中的大量认证图像和模板库。这使开发团队能够扩展他们的环境,以便使用安全的存储库快速自动构建、持续集成和协作。

官网地址

项目编译

发布项目运行框架为.net6.0,运行环境为linux-x64

Dockerfile内容及国内镜像源

Dockerfile是用来构建docker镜像的构建文件,它其实就像一个脚本文件,里面可以执行一些命令,通过它就可以指定或下载构建的镜像所需要的一些组件,然后打包成镜像文件。

下面是本教程使用的Dockerfile脚本文件内容,指定了使用asp.net6.0的运行时环境,并且在镜像系统的5000端口上提供http服务。同时更新sources.list使用国内镜像源,这里没有用阿里的镜像源,因为测试过程中阿里的镜像源在apt-get install -y libgdiplus的时候会提示找不到这个组件(坑)。因为使用的有基于System.Drawing绘制的验证码图片,所以需要在构建的时候把libgdiplus组件引用到镜像文件中,最后把镜像系统中的时区改成亚洲的时区。

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /WhiteList
EXPOSE 5000
COPY . . RUN touch /etc/apt/sources.list
RUN echo "" > /etc/apt/sources.list \
&& echo "deb http://mirrors.163.com/debian/ buster main non-free contrib" >> /etc/apt/sources.list \
&& echo "deb http://mirrors.163.com/debian/ buster-updates main non-free contrib" >> /etc/apt/sources.list \
&& echo "deb http://mirrors.163.com/debian/ buster-backports main non-free contrib" >> /etc/apt/sources.list \
&& echo "deb-src http://mirrors.163.com/debian/ buster main non-free contrib" >> /etc/apt/sources.list \
&& echo "deb-src http://mirrors.163.com/debian/ buster-updates main non-free contrib" >> /etc/apt/sources.list \
&& echo "deb-src http://mirrors.163.com/debian/ buster-backports main non-free contrib" >> /etc/apt/sources.list \
&& echo "deb http://mirrors.163.com/debian-security/ buster/updates main non-free contrib" >> /etc/apt/sources.list \
&& echo "deb-src http://mirrors.163.com/debian-security/ buster/updates main non-free contrib" >> /etc/apt/sources.list ENV TZ=Asia/Shanghai
RUN apt-get update -y
#RUN apt-get upgrade -y
RUN apt-get install -y libgdiplus
RUN apt-get clean
RUN ln -s /usr/lib/libgdiplus.so /usr/lib/gdiplus.dll
RUN ln -fs /usr/share/zoneinfo/${TZ} /etc/localtime \
&& echo ${TZ} > /etc/timezone ENV ASPNETCORE_URLS http://+:5000
ENTRYPOINT ["dotnet", "WhiteList.dll"]

同时可以添加.dockerignore文件来排除一些不需要打包到镜像里的文件,比如忽略到bin或者obj目录里的文件。

[b|B]in [O|o]bj

最后,千万不要忘记把wwwroot复制到发布的目录中,要不然访问的时候会没有样式。以上Dockerfile中的有些脚本命令可合并成一行。

Docker镜像打包发布

把Dockerfile和.dockerignore文件复制到发布目录中,然后运行PowShell,cd命令到发布目录(本文使用目录为bin\Release\net6.0\linux-x64)。

然后执行打包命令

docker build --tag whitelist:1.0 .

如一切正常,按上图的进度执行完成后,就可以在Docker Desktop中看到打包的镜像文件。

Docker Desktop中的Linux系统

我们点击镜像的运行按钮,填写好镜像名称,绑定端口(本机通过此端口用浏览器可以访问到容器内的服务),绑定的本地文件夹(可选)和其它参数(可选)后点击RUN按钮,如果没有端口冲突和名称冲突,就会得到一个运行成功的容器。





我们可以进入到容器的操作系统中查看一下系统信息。

cat /etc/issue

Debian GNU/Linux 10

cat /proc/version

Linux version 5.15.90.1-microsoft-standard-WSL2 (oe-user@oe-host) (x86_64-msft-linux-gcc (GCC) 9.3.0, GNU ld (GNU Binutils) 2.34.0.20200220)

Docker镜像导出

现在我们已经得到了一个基于Docker Desktop在Windows系统上构建的镜像文件,在使用中,我们需要把这个镜像运行在Linux系统中(比如CentOS),所以需要把镜像导出来进行分发(这里使用的是本地导出,不是导出到云镜像服务器)。

在Windows系统的PowerShell中执行下面命令,把镜像(whitelist):Tag名(1.0)导出到本地的d盘,文件名是whitelist.tar,

docker save -o d:\whitelist.tar whitelist:1.0

CentOS安装Docker

首先安装一下Docker所依赖的组件

yum install -y yum-untils device-mapper-persistent-data lvm2

然后配置数据源为国内的阿里云数据源

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安装Docker

yum install docker-ce

启动Docker

systemctl start docker

设置Docker为开机自启

systemctl enable docker

查看Docker的版本信息

docker --version

Docker version 24.0.2, build cb74dfc

查看当前Docker中的镜像

docker images



这里看到,目前Docker中没有任何镜像

CentOS Docker镜像导入

把镜像文件上传到/usr/data目录下,然后执行导入镜像的命令

docker load -i /usr/data/whitelist.tar



导入成功后,再查看Docker中的镜像,就会看到我们刚导入的镜像文件了。

随后我们执行运行镜像的命令,把CentOS系统的8080端口和容器的5000端口做映射。

docker run -d -p 8080:5000 --name whitelist whitelist:1.0

运行成功后会返回一个类似GUID的容器编号,然后我们可以查看一下当前运行的容器。

docker ps



如果防火墙没有放行8080端口,可用以下命令放开8080端口。

firewall-cmd --zone=public --add-port=8080/tcp --permanent

firewall-cmd --reload

最后我们本机打开浏览器访问CentOS系统的IP并带上8080端口,就可看到我们从Windows上打包的Docker镜像已经成功运行在了CentOS系统的Docker环境下了。

.NETCore项目在Windows下构建Docker镜像并本地导出分发到CentOS系统下的更多相关文章

  1. spring could Windows打包构建docker镜像到linux

    工程模拟参考:http://blog.csdn.net/forezp/article/details/70198649 一.工程结构 二.Pom配置 <build> <plugins ...

  2. Java SpringBoot 项目构建 Docker 镜像调优实践

    PS:已经在生产实践中验证,解决在生产环境下,网速带宽小,每次推拉镜像影响线上服务问题,按本文方式构建镜像,除了第一次拉取.推送.构建镜像慢,第二.三-次都是几百K大小传输,速度非常快,构建.打包.推 ...

  3. 打包应用和构建Docker镜像(docker在windows上)

    在构建Docker时编译应用 一般有两种方法在构建镜像时进行打包应用.第一种方法就是使用基本的镜像,该镜像包括应用平台和构建工具,因此在Dockerfile中,复制源代码到镜像中并在构建镜像时编译ap ...

  4. 使用Buildpacks高效构建Docker镜像

    1. 前言 Spring Boot 2.3.0.RELEASE 正式发布了几天了,其中有个新的特性:可以将Spring Boot应用代码直接打包为Docker镜像.这是什么科技?我赶紧去官网查了一番才 ...

  5. 使用Jenkins pipeline流水线构建docker镜像和发布

    新建一个pipeline job 选择Pipeline任务,然后进入配置页面. 对于Pipeline, Definition选择 "Pipeline script from SCM" ...

  6. Maven插件构建Docker镜像

    背景 微服务架构下,微服务在带来良好的设计和架构理念的同时,也带来了运维上的额外复杂性,尤其是在服务部署和服务监控上.单体应用是集中式的,就一个单体跑在一起,部署和管理的时候非常简单,而微服务是一个网 ...

  7. SpringBoot 构建 Docker 镜像的 3 种方式

    本文将介绍3种技术,通过 Maven 把 SpringBoot 应用构建成 Docker 镜像. (1)使用 spring-boot-maven-plugin 内置的 build-image. (2) ...

  8. apisix网关-构建docker镜像构建及插件化开发

    高能劝退:lua开发,适合小白看!!! 前段时间有个项目,用的java程序做网关,压测tps只有1k多点,惨不忍睹. 后来公司有个大佬改用apisix做网关,tps飙升到1w多. 于是对神奇的apis ...

  9. SpringBoot 构建 Docker 镜像的最佳 3 种方式

    本文将介绍3种技术,通过 Maven 把 SpringBoot 应用构建成 Docker 镜像. (1)使用 spring-boot-maven-plugin 内置的 build-image. (2) ...

  10. 多阶段构建Docker镜像

    在Docker 17.05及更高的版本中支持支持一种全新的构建镜像模式:多阶段构建: 多阶段构建Docker镜像的最大好处是使构建出来的镜像变得更小: 目前常见的两个构建镜像的方式为: 1.直接使用某 ...

随机推荐

  1. python入门教程之十五获取对象属性的几种方法

    当我们拿到一个对象的引用时,如何知道这个对象是什么类型.有哪些方法呢? 使用type() 首先,我们来判断对象类型,使用type()函数: 基本类型都可以用type()判断: >>> ...

  2. python 启动外部程序四种方法

    在Python中,可以方便地使用os模块来运行其他脚本或者程序,这样就可以在脚本中直接使用其他脚本或程序提供的功能,而不必再次编写实现该功能的代码.为了更好地控制运行的进程,可以使用win32proc ...

  3. python之PySimpleGUI(一)元素

    1themesg.theme_previewer()获取所有主题颜色sg.preview_all_look_and_feel_themes()同上theme_name_list = sg.theme_ ...

  4. windows如何拉取一个文件夹下的所有文件名

    问题描述:遇到一个问题,是说一个文件夹下的文件太多了,如何去批量的拉去文件名呢,今天用CMD+DIR的方式拉取 1.文件目录也很深,就从文件导航栏进入CMD窗口 2.在当前目录中输入cmd,然后回车 ...

  5. MySQL(三)数据目录

    目录 Mysql的主要目录结构 1 数据库文件的存放路径 /var/lib/mysql/ 2 相关命令目录 /usr/bin/mysql /usr/sbin/mysql 3 配置文件目录 /usr/s ...

  6. 一个基于Java线程池管理的开源框架Hippo4j实践

    @ 目录 概述 定义 线程池痛点 功能 框架概览 架构 部署 Docker安装 二进制安装 运行模式 依赖配置中心 接入流程 个性化配置 线程池监控 无中间件依赖 接入流程 服务端配置 三方框架线程池 ...

  7. 利用机器人类Robot写出自动登录QQ的小代码

    最近写了一个小代码控制鼠标键盘使他自己登录QQ,下面给大家分享下这一小代码. 这段小程序是用Java里的Robot类实现的,控制鼠标键盘的一个机器人类. 我们想要实现自动登录QQ首先得想要做到这一步需 ...

  8. Ubuntu-管理开机自启动服务

    1. 管理服务启停工具 systemctl -- 将应用程序抽象为一个service,然后对这个service进行创建.启停.状态查看.配合journalctl进行日志管理 子命令 效果 start ...

  9. ES6 新增的一些特性

    还有symbol和set,map, bind,call,apply 1. let关键字 (1)基本用法:let关键字用来声明变量,它的用法类似于var,都是用来声明变量. (2)块级作用域:let声明 ...

  10. [人脸活体检测] 论文:Aurora Guard- Real-Time Face Anti-Spoofing via Light Reflection

    Aurora Guard- Real-Time Face Anti-Spoofing via Light Reflection 论文简介 该论文提出的方法已经部署到百万台终端,整篇文章底气十足.作者设 ...