记一次IDE的Docker插件实战(Dockfile篇)

news2024/12/25 2:24:48

IDEA下使用Docker插件制作镜像、推送及运行

前言

本部分主要根据IDEA的Docker插件实战(Dockerfile篇)_程序员欣宸的博客-CSDN博客_idea编写dockerfile一文所述内容进行实践,并对其中遇到的问题进行解答,从而串接多个知识点。

如何编写Dockfile

在Intellij中,Dockfile只能自己创建并编写,并没有什么工具会帮你自动生成,这一点和.NET平台下的工具不同,需要注意。Dockfile的编写主要是了解语法,还需要选择合适的基础镜像。语法课参考这篇文章:

Docker Dockerfile | 菜鸟教程 (runoob.com)

镜像选择需要自行前往Dockerhub进行镜像查找,网址为:

Docker Hub Container Image Library | App Containerization

深入理解镜像

docker image是什么,存储在什么位置。 - chinaxuzw的日志 About云开发-梭伦科技 - (aboutyun.com)

Docker镜像分层 - 知乎 (zhihu.com)

在上述文章中详细解释了Docker中镜像是如何分层、如何构建的,理解了这些也就明白了为什么Dockfile中要尽可能少些语句或多条语句合并成一条语句,都是为了降低打包后的镜像大小。

代码中的时区问题

如果按照前言中文章的指南一步步操作,应该不会有其他问题,除了显示的时区不对。时区不对的根源是容器中的时区为UTC,宿主机时间为CST,相差了8小时。具体方法参考:

Docker容器时间与宿主机时间不一致的问题 - 人艰不拆_zmc - 博客园 (cnblogs.com)

这里边可能会涉及进入容器的问题,因为本文使用的基础镜像为alpine,进入容器不是正常的/bin/bash,而是进入/bin/sh

VisualStudio下使用Docker插件制作镜像、推送

前言

VS对Docker的支持仅限于.NET Core项目,这一点需要留意。VS中的Docker插件功能和IDEA中完全不一样:VS要求当前主机必须安装Docker,制作的镜像只推送到本机的Docker。而VS的使用者大多数都用的是Windows系统,这就意味着当前主机得开启一套虚拟环境以运行Windows版本的Docker,大概需要2G的内存占用。IDEA充分利用了Docker的远程访问功能,所以对本机的要求很低。VS中也可以把镜像打包后推送到远程Docker服务器,但是需要开启服务器Docker的Registry功能,相当于得部署一套私有的Docker仓库。

添加Docker支持

在创建.NET Core工程时,如果勾选了Docker支持,那么VS会自动创建Dockfile。当然如果项目创建初期没有添加,后面也可以通过右击工程,选择“添加”,再选择“添加Docker”支持来创建(如果没有该选项,大概率是安装VS的时候少勾选了相关容器组件)。如果对Docker很熟悉,也可以完全自行创建,当然最好是先利用VS创建一个基础的Dockfile,然后自行添加或删除一些内容。

在服务器上启动Docker的Registry功能

所谓的Registry功能就是在服务器上使用Docker官方提供的Registry镜像创建一个容器,外部程序通过HTTP/HTTPS协议和Registry容器交互,从而推送或拉取镜像。创建步骤可以参考该链接:

部署注册表服务器| Docker文档 (xy2401.com)

配置可外部访问的Registry

上步所述的操作可以让本机的应用程序推送镜像,但如果希望外部系统也能操作,那么就需要进行相关配置。如果是有域名证书的伙伴,那么配置外部访问非常容易,直接参照上节的链接描述来做就行。但是很多情况下我们是局域网操作,只想通过HTTP协议访问Registry,那么我们在远程服务器上创建容器时就不能指定证书,同时客户端的机器上需要添加对该远程Docker的信任,具体可参考:

测试不安全的注册表| Docker文档 (xy2401.com)

配置HTTP访问

以上内容简单解释一下。先使用下述指令创建Registry服务:

# 创建不指定证书的容器,同时无用户名密码验证
docker run -d -p 5000:5000 --restart=always --name registry registry:2
# 登陆服务器上的容器
docker login http://192.168.x.x:5000
# 推送容器
docker push NAME[:TAG]

运行此条指令后创建的registry容器就是不指定证书的,此时外部系统可以通过访问http://192.168.x.x:5000来操作该容器,而且无需用户名和密码。

配置HTTPS访问

那么如果我想要添加用户名和密码呢?这时候就需要配置TLS,开启服务器认证:

# 首先创建自签名证书
mkdir -p certs
openssl req \
  -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key \
  -x509 -days 365 -out certs/domain.crt
# 接着创建需要指定证书的容器
docker run -d \
  --restart=always \
  --name registry \
  -v "$(pwd)"/certs:/certs \
  -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
  -p 443:443 \
  registry:2

通过以上操作,服务端算是配置好了,所有的访问请求必须通过HTTPS协议,服务端收到请求后把自签名证书发给客户端。

客户端配置以信任服务端证书

这时候问题就来了,因为是自签名证书,客户端不认,会报错,所以需要客户端信任该证书。

如果客户端是Windows系统,信任证书很容易操作:将服务器上的domain.crt文件拷贝到客户端,直接双击安装证书,下面贴几张安装证书的图。

请务必按照上图的方式导入到“根证书颁发机构”,否则客户端还是无法进行证书认证!此时通过下述指令便可登陆成功:

# 服务端容器使用的是HTTPS协议默认的443端口,所以这里就不需要指定端口了
docker login 192.168.x.x

如果客户端是Linux主机,需要将服务器的证书文件服务到当前主机的/etc/docker/certs.d/myregistrydomain.com:443/目录下,在这里myregistrydomain.com就是192.168.x.x。

服务端启用用户名密码验证

服务端启用用户名密码验证的前提是已经配置了HTTPS访问,所以这一步写在最后:

# 创建用户名为testuser、密码为testpassword的文件,使用bcrypt加密
mkdir auth
docker run \
  --entrypoint htpasswd \
  registry:2 -Bbn testuser testpassword > auth/htpasswd

# 创建需要进行访问认证的容器
docker run -d \
  -p 443:443\
  --restart=always \
  --name registry \
  -v "$(pwd)"/auth:/auth \
  -e "REGISTRY_AUTH=htpasswd" \
  -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
  -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
  -v "$(pwd)"/certs:/certs \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
  registry:2

和上一节相比,本节创建容器的过程多了3个变量用于开启访问认证。这里有必要解释下第一步创建认证文件的意图。

htpasswd是一个创建认证文件的组件,可以在宿主机上直接安装该组件,也可以像Docker官方提供的文档中介绍的那样,通过创建一个htpasswd的容器并运行来创建认证文件。注意这里传入的参数是-B,也就是使用bcrypt加密,加密强度更高。如果不加,默认就是MD5加密。Registry组件内部使用的是bcrypt加密方式,所以创建认证文件必须传入-B参数。

有了认证文件,在创建容器时就需要指定认证文件的地址,因此需要将宿主机的带有认证文件的目录挂载到容器上。此时再登陆Docker,就需要以下指令:

# 在命令行显示输入密码会看到一个Docker返回的Warnning,在意的话不要加入-p
docker login 192.168.x.x -u testuser -p testpassword

发布镜像

以上扯了那么多的主要原因还是VS下的Docker插件不好用,而且使用发布功能推送镜像时必须通过HTTPS访问。那下面来看看如何推送镜像:

  1. 右击项目,选择“发布”
  2. 发布目标选择“Docker容器注册表”
  3. 特定目标选择“其他Docker容器注册表”。这里插一句,如果不要求私密性,只是为了学习,那么直接发布到DockerHub就好了,上述内容统统不用关心。我们这里主要谈的是发布到私有仓库,所以才需要配置那么多。
  4. 注册表URL输入:192.168.x.x:443
  5. 输入用户名(如果设置)
  6. 输入密码(如果设置)
  7. 点击完成

顺利的话,我们会看到VS提示镜像已上传成功。如何确认服务器上的确有镜像呢?

curl -XGET -u testuser:testpassword https://192.168.x.x:443/v2/_catalog

题外话

笔者自己有个威联通的NAS,且具备公网访问条件,所以冒出了个想法,就是在自己的NAS上部署Docker私库。虽然笔者对部署私库已了然于胸,但在NAS上部署时还是踩了很多坑,如果大家感兴趣,我将再写一篇文章来介绍威联通NAS上如何部署私库。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/358180.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【elasticsearch】elasticsearch es读写原理

一、前言: 今天来学习下 es 的写入原理。 Elasticsearch底层使用Lucene来实现doc的读写操作: Luence 存在的问题: 没有并发设计 lucene只是一个搜索引擎库,并没有涉及到分布式相关的设计,因此要想使用Lucene来处理海量…

「可信计算」与软件行为学

可信计算组织(Ttrusted Computing Group,TCG)是一个非盈利的工业标准组织,它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立,并采纳了由可信计算平台联盟(the Trusted Computing Platform Alli…

亮个相吧小宝贝儿,五款压箱底的软件

今天要给大家推荐5款压箱底的宝贝软件了,百度搜索一下就能找到下载链接了。 1.开源浏览器——Firefox Firefox是一个自由的,开放源码的浏览器,适用于 Windows, Linux 和 MacOS X平台,Mozilla Firefox官方版体积小速度快&#xf…

【项目】Vue3+TS CMS 登录模块搭建

💭💭 ✨:Vue3 TS   💟:东非不开森的主页   💜: keep going💜💜   🌸: 如有错误或不足之处,希望可以指正,非常感谢😉   Vue3TS一、…

微服务面试题:熔断和降级有什么区别?

文章目录引言1.概念不同1.1 熔断概念1.2 降级概念2.熔断器模型3.种状态之间的转换关系4.熔断策略5.熔断和降级的关系6.降级方式6.1、熔断降级(不可用)6.2、超时降级6.3、限流降级7.题外话8.总结引言 熔断和降级都是系统自我保护的一种机制,但…

进阶C语言 第四章-------《自定义类型》 (结构体、枚举、联合)知识点+完整思维导图+深入细节+通俗易懂+基本练习题+建议收藏

绪论 书接上回,通过上章的一些函数,我们可以让我们对于一些数值的调整有很大的帮助,本章自定义类型在C语言中同样也有着非常重要的地位,相信只要认真的阅读了本章,一定会对你有很大的帮助。 所以安全带系好&#xff0c…

使用Cmake从源码编译Lua

前置要求:电脑已经设置好了Cmake能够使用 首先下载Lua源码,文件后缀是tar.gz 各版本可以从这里找到:Lua - Version history 解压下载文件至所需目录,文件内容如下图: 解压即可。 在解压的文件夹(本例是lua…

使用PyTorch-LSTM进行单变量时间序列预测的示例教程

时间序列是指在一段时间内发生的任何可量化的度量或事件。尽管这听起来微不足道,但几乎任何东西都可以被认为是时间序列。一个月里你每小时的平均心率,一年里一只股票的日收盘价,一年里某个城市每周发生的交通事故数。在任何一段时间段内记录…

Python控制本地浏览器并获取网页数据

1、前言 在自动化办公中,我们经常需要利用爬虫技能去批量获取网页的数据,但是有时候我们在利用爬虫的时候,会遇到一个问题,就是登录的时候要携带参数,不如账号、密码、其他的加密信息 就好比我现在公司,好…

JSP 质量管理系统myeclipse定制开发sqlserver数据库网页模式java编程jdbc

一、源码特点 JSP 质量管理系统是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开 发,数据库为SQLServer2008&#xff0c…

狂飙Linux平台,软件部署大全

📢📢📢📣📣📣 哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】!😜&am…

图形的面积与周长计算程序-课后程序(JAVA基础案例教程-黑马程序员编著-第四章-课后作业)

【案例4-7】图形的面积与周长计算程序 欢迎点赞关注收藏 【案例介绍】 案例描述 长方形和圆形都属于几何图形,都有周长和面积,并且它们都有自己的周长和面积计算公式。使用抽象类的知识设计一个程序,可以计算不同图形的面积和周长。 运行…

Redis服务器配置

服务器基础配置服务器端设定 设置服务器以守护进程的方式运行daemonize yes|no 绑定主机地址bind 127.0.0.1 设置服务器端口号port 6379 设置数据库数量databases 16日志配置 设置服务器以指定日志记录级别loglevel debug|verbose|notice|warning开发期 debug 线上no…

【蓝桥杯PythonB组备赛】【Acwing周赛】第91场非常详细的过程思路分析理解分享Python解

好难哈哈哈我依旧只做对了第一题,第二题在比赛结束后才做出来…… 不过没关系每天努力一点啦~ 分享一下个人做的解析,供大家参考,一起努力哇! 目录 A AcWing 4861. 构造数列 1.题目描述 2.思路分析 3.代码实现 B Ac…

从每刻到金蝶云星空通过接口配置打通数据

对接源平台:每刻刻报销是每刻科技旗下的产品,是国内领先的企业差旅及费用管理云平台,为事前差旅预订,事后报销的全流程费用管控服务。每刻报销融合人工智能云计算、移动互联网大数据等先进技术,融合财务共享和信用管理的理念&…

SPDK应用框架

SPDK应用框架SPDK应用框架1)对CPU core和线程的管理2)线程间的高效通信3)I/O的处理模型及数据路径的无锁化机制SPDK用户态块设备层1.内核通用块层2.SPDK用户态通用块层SPDK架构解析3.通用块层的管理4.逻辑卷1)内核LVM2&#xff09…

企业级信息系统开发学习笔记1.2 初探Spring——利用组件注解符精简Spring配置文件

文章目录零、本讲学习目标一、课程引入二、打开项目【SpringDemo2021】三、利用组件注解符精简Spring配置文件1、创建net.hw.spring.lesson02包2、将lesson01子包的四个类拷贝到lesson02子包3、修改杀龙任务类 - SlayDragonQuest4、修改救美任务类 - RescueDamselQuest5、修改勇…

2022爱分析·事务型关系数据库市场厂商评估报告:万里数据库

目录 1. 研究范围定义 2. 事务型关系数据库市场定义 3. 厂商评估:万里数据库 4. 入选证书 1. 研究范围定义 在国内数字化转型以及信创建设持续推进的大背景下,众多厂商入局国内数据库市场,为企业提供了面向多种应用场景的数据库&am…

taobao.trade.memo.update( 修改交易备注 )

¥开放平台基础API必须用户授权 需要商家或以上权限才可调用此接口,可重复调用本接口更新交易备注,本接口同时具有添加备注的功能 公共参数 点击获取 请求示例 TaobaoClient client new DefaultTaobaoClient(url, appkey, secret); Trade…

2022年AI顶级论文 —生成模型之年(上)

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 过去十年来,人工智能技术在持续提高和飞速发展,并不断冲击着人类的认知。 2012年,在ImageNet图像识别挑战赛中,一种神经网络模型(AlexNet&…