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

news/2024/4/20 0:13:22/文章来源:https://blog.csdn.net/u012441819/article/details/129122431

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.luyixian.cn/news_show_71564.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【YOLOv5】 3060显卡 GPU版本环境搭建与运行

YOLOv5环境搭建步骤创建虚拟环境使用anaconda新建一个python版本为3.7的虚拟环境查看电脑支持的cuda版本由于30系列的的显卡暂时不支持CUDA11以下版本。因此,这里得安装超过CUDA11.0的版本。通过如下命令来查看可以安装的cuda的版本:conda search cuda安…

JVM类加载子系统

1、类加载子系统在内存结构中所处的位置通过内存结构图,我们先知道类加载子系统所处的位置,做到心中有图。2、类加载器作用类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识。ClassLoader只负责cla…

火花幻境加深与亚马逊云科技的合作,为玩家创造更加美好的游戏体验

元宇宙可谓是2022年科技界的“当红炸子鸡”,该概念的兴起为游戏产业带来了更多的发展机遇,游戏与元宇宙的结合,为玩家带来了更好的全息感官体验与游戏乐趣。元宇宙游戏市场前景广阔,企业能否快速抢滩市场,不断缩短游戏…

如何配置git,使其支持多用户

如何配置git,使其支持多用户? 在多数时候, 我们使用git进行操作时,只需要在本地配置一个用户的ssh key,就可以完成基本的pull/push操作。如果现在我有两个github的账号,并需要在一台电脑中操作其中的repo&…

java网络编程-nio学习:阻塞和非阻塞

一、阻塞 阻塞模式下,相关方法都会导致线程暂停 ServerSocketChannel.accept 会在没有连接建立时让线程暂停 SocketChannel.read 会在没有数据可读时让线程暂停 阻塞的表现其实就是线程暂停了,暂停期间不会占用 cpu,但线程相当于闲置 单线…

PyQt5数据库开发1 4.3 QSqlTableModel 之 相关槽函数的实现(多图长文详解)

目录 一、打开数据库表 1. 写打开数据库的槽函数 2. 运行后发现数据库可以打开了 3. ODBC配通了,数据库还是打不开 4. 写在tableView上显示数据库表的函数 5. 运行后发现表可以显示了 6. 代码分析 7. 添加列名称 8. 根据内容调整列宽 9. 备注:…

三、NetworkX工具包实战3——特征工程【CS224W】(Datawhale组队学习)

开源内容:https://github.com/TommyZihao/zihao_course/tree/main/CS224W 子豪兄B 站视频:https://space.bilibili.com/1900783/channel/collectiondetail?sid915098 斯坦福官方课程主页:https://web.stanford.edu/class/cs224w NetworkX…

数据库事务AICD以及隔离级别

目录一.事务的ACID二.隔离级别三.并发事务中的问题1.脏写2.脏读3.不可重复读4.幻读四.MVCC机制五.读锁与写锁六.大事务的影响七.事务优化一.事务的ACID 原子性(Atomicity):一个事务中的所有操作,要么全部成功,要么失败全部回滚,不…

linux集群技术(一)--LVS(负载均衡)(一)

集群功能分类负载均衡LVS概述LVS工作模式轮训算法 1.集群功能分类 1.1 LB (一)简介 LB:Load Balancing,负载均衡(增加处理能力),有一定高可用能力,但不是高可用集群,是以提高服务的…

「文档数据库之争」MongoDB和CouchDB的比较

MongoDB和CouchDB都是基于文档的NoSQL数据库类型。文档数据库又称mdocument store,通常用于存储半结构化数据的文档格式及其详细描述。它允许创建和更新程序,而不需要引用主模式。移动应用程序中的内容管理和数据处理是可以应用文档存储的两个字段。Mong…

SSH 服务支持弱加密算法

漏洞扫描有SSH 服务支持弱加密算法,解决方案有两个: 方案一:修改 SSH 配置文件,添加加密算法: vi /etc/ssh/sshd_config 最后添加一下内容(去掉 arcfour、arcfour128、arcfour256 等弱加密算法)…

游戏服务器算法-AOI基本介绍

一、直接比较所有对象 最直观也是最效率最低的一种方法。当一个事件发生,我们需要获得AOI范围以内的物体时,直接遍历游戏中所有的对象,并且进行坐标判断,如果小于或者等于AOI的范围,则为需要的游戏对象。 这种方法实…

智慧校园信息化管理平台技术方案

1.2总体架构设计 智慧校园平台是以学校现有网络为基础,以服务于全校师生的教学、科研、生活为目的,建立在学校数据中心平台之上,涵盖了学校的学校管理、学生管理、教学管理、班级管理、家校共育、教务管理等全方位的管理信息平台与信息服务平…

积分球原理及积分球类型介绍

标题积分球标准型积分球LED积分球均匀光源便携式高亮度积分球均匀光源微光积分球均匀光源积分球均匀光源iSphere高光谱响应光学积分球其他分类积分球 积分球原理:由于球体内整涂有白色漫反射材料的空腔球体,球壁上开有采样口,当待测样品光源进入积分球的…

公司缺人面了8个测试员,他们都有一个相同的缺点.....

年后公司缺人,面了不少测试,结果竟然没有一个合适的。 一开始瞄准的就是中级的水准,也没指望来大牛,提供的薪资在10-20k,面试的人很多,但平均水平很让人失望。 看简历很多都是3年工作经验,但面…

约束优化:约束优化的三种序列无约束优化方法(罚函数法)

文章目录约束优化:约束优化的三种序列无约束优化方法(罚函数法)外点罚函数法L2-罚函数法:非精确算法对于等式约束对于不等式约束L1-罚函数法:精确算法内点罚函数法:障碍函数法参考文献约束优化:…

Docker实用命令手册

Docker实用命令手册 大家好,我是比特桃。本文汇总了超实用的Docker命令手册,本文适用于有一定Docker基础的同学。如果你对Docker不了解,可能无法直接使用这些命令。但别担心,Docker本身是一个工具,如果只是用起来其实…

算法专题训练营

动归算法专题 1.拆分词句 是不是,在不在都是可以用动归解决的 状态转义方程不一定都是等式,也有可能是条件 2.三角形 动归算法也不是一定要借助新开空间,也是可以用自己原来的空间 3.背包问题 4.分割回文串-ii 5.不同的子序列 贪心算法专题 只管一步的最优结果, 1.分割平衡…

高并发系统设计之负载均衡

本文已收录至Github,推荐阅读 👉 Java随想录 文章目录DNS负载均衡Nginx负载均衡负载均衡算法负载均衡配置超时配置被动健康检查与主动健康检查LVS/F5Nginx当我们的应用单实例不能支撑用户请求时,此时就需要扩容,从一台服务器扩容到…