卸载本地开发环境,拥抱容器化开发

news2024/12/22 17:01:00

以前在公司的时候,使用同事准备的容器化环境,直接在 Docker 内进行开发,爽歪歪呀。也是在那时了解了容器化开发的知识,可惜了,现在用不到那种环境了。所以打算自己在本地也整一个个人的开发环境,不过因为我本地已经按照好了开发环境(我现在主要使用Go,平时会写一些Python脚本,所以我本地安装了它们两个),也就没有动力推动自己去学习了。因为这个想法已经拖了很久了,再拖下去就不可能再去弄了。所以,今天就激进一点,直接把本地的开发环境卸载,强迫自己去开始容器化开发环境。

卸载本地的开发环境

不过,这里我只卸载了 Go 的开发环境,因为 Python 是解释型语言,在本地有一个还是很有必要的。

请添加图片描述

然后打开 VSCode,可以发现 Go 的插件已经报错了,哈哈。

请添加图片描述

安装 Docker Desktop

因为现在用的是 Windows,不是 Linux 了,所以先在 Windows 上安装 Docker Desktop。不过我还是更喜欢在 Linux 上面开发,Windows 的话,无法使用哪些命令行工具了。

在这里插入图片描述
我这里只有一个 Docker,因为我尝试开启它的 Kubernetes,但是一直都无法启动,不知道是哪里的问题了。然后我就转向了 Rancher Desktop 了,不过 Docker Desktop 的 docker 功能还是不错的,用 docker 的话就用它了。如果是 k8s 再用 Rancher desktop。

在这里插入图片描述

拉取镜像

在这里插入图片描述

这里可以看出,两个镜像的大小差距还是蛮大的。其实看 golang 的镜像 tag 就能看出来了,它是基于 alpine 这个 Linux 发行版的。那么什么是 alpine 呢,这里简单提一嘴吧,这个名字是欧洲的 阿尔卑斯山,看下面的封面也能看出来了。它明显的特点就是小,大概只有 5 MB。
所以,这个 golang 的镜像,几乎全部内容都是 go 本身的东西了。但是 Python 就不一样了,因为它是一个解释型的语言,所以一般都是用那种比较大的镜像来作为基础镜像。

在这里插入图片描述

注意:这里的 golang 镜像是我在 docker hub 随便选择的,它可能太简陋了。如果是用作开发镜像的话,可以选择基于 Ubuntu 的更加丰富(这里不说它大,因为大是缺点,丰富是优点)的镜像。

docker hub 的 golang 镜像官方用法

有些同学可能网络不是很通畅,我这里把这块内容截取过来了,我们照着下面的用法做就行了。

在这里插入图片描述

PS: 为什么大是缺点?因为东西越多,潜在的漏洞就越多;反之,漏洞就越少,更加的安全。这里可以简单了解一下 CVE:What is a CVE

在这里插入图片描述

Hello World

docker run --rm -it python:3.12 python -c 'print("Hello World")'
在这里插入图片描述
这个例子算是比较简单的了,它也说明了基于容器进行开发的可能性。

我们再来看一个比较复杂的,golang 的例子吧,我在本地 hello 下,建立了一个 main.go 文件。

在这里插入图片描述

请添加图片描述

启动 golang 的镜像,把本地目录下的 main.go 挂载到容器的 /go/src/hello 下,并启动一个交互式的 shell 终端。
这里要了解一下容器挂载的知识:

在这里插入图片描述
那么你可能还需要了解一下 UFS 的知识了,不过长话短说,挂载目录就是把一个特定的本地目录挂载到容器目录下。

更进一步

前面介绍了一些简单的东西,直接启动一个镜像的方式演示是一个极佳的示例,但是对于真正的开发来说还是过于简陋了。如果需要在容器内开发,还是要构建一个自己的镜像才是比较好的方式。而且真正的开发需要的环境还是要复杂的多了。工欲善其事必先利其器,既然是开发当然需要一个趁手的工具了,这里我用的是 VSCode。

安装相关插件

在这里插入图片描述

强烈推荐大家阅读 VSCode 官方的 documentation: Developing inside a Container 在容器内开发

在这里插入图片描述

然后注意看上面的第二个框选内容,它(Dev Containers extention)支持两种基本的操作模型:

  • 你可以使用一个容器作为你的全职开发环境
  • 你可以连接到一个正在运行的容器去检查它。

在项目(随便一个项目,就算是刚才用作演示的 hello 也可以的)中创建一个 Dockerfile

FROM golang:1.20.11-alpine3.18

WORKDIR /usr/src/app
# pre-copy/cache go.mod for pre-downloading dependencies and only redownloading them in subsequent builds if they change
COPY go.mod go.sum ./
RUN go mod download && go mod verify

COPY . .

具体的内容可以看上面推荐的 VSCode 官方文档,里面已经说得很详细了。不过我之前使用的是 attaching 到一个正在运行的容器,这次使用的是其它的方式。

在这里插入图片描述

在这里插入图片描述

然后会让你选择,我这里只选择安装一个 zsh (alpine),不过第一次启动还是有点慢了。如果你感觉无聊的话,可以看看日志输出,这样可以缓解等待的焦虑。
这里可以直接安装 zsh 还是非常棒的!

在这里插入图片描述

这里我就只是在命令行启动项目了,因为我也没有安装相关的 golang 插件,它提示我安装了,我没有安装,也可以在插件那里选择你想要的进行安装。

在这里插入图片描述

VSCode 还是很人性的,自动给开了端口转发,不需要手动设置了(因为你现在是在容器中的,不能从外部直接访问的)。

在这里插入图片描述

这里我就简单的演示一下吧,因为这个 golang 的镜像可能不太合适,所以我还是需要弄一个自己的定制开发环境才比较好(也就是一个 Dockfile 或者复杂一点 docker-compose.yaml)。

PS

Dev Container

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

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

相关文章

SMART PLC MODBUSTCP速度测试

SMART PLC MODBUSTCP通信详细介绍请参看下面文章链接: S7-200SMART PLC ModbusTCP通信(多服务器多从站轮询)_matlab sumilink 多个modbustcp读写_RXXW_Dor的博客-CSDN博客文章浏览阅读6.4k次,点赞5次,收藏10次。MBUS_CLIENT作为MODBUS TCP客户端通过S7-200 SMART CPU上的…

【python】sys-psth和模块搜索路径

我们在导入一个模块的时候,比如说: import math它必然是有搜索路径的,那到底是在哪个目录下面找呢?Python解释器去哪里找这个文件呢?只有找到这个文件才能读取、装载运行该模块文件。 它一般按照如下路径寻找模块文件…

经典OJ题:重排链表

题目: 给定一个链表,在进行重排前: 进行重排链表后: 如上图所示,所谓的重拍链表,就是将第一个节点连接第倒数第一个节点,第二个节点连接倒数第二个节点,以此类推,最后在连…

贝锐蒲公英X1解决远程访问NAS难题

由于经常在外出差和旅游,需要实现即使在外地也能远程登录回去家里的NAS去处理事情或传输文件,因此解决方案之一是搭建一个安全简易的个人私有云。 实施难度 (1)家庭网络无公网IP,且公网IP价格昂贵(2&…

今起不再“没完没了的接龙斗嘴”

今天本“人民体验官”推广人民日报官方微博(转央视网)的文化产品《数字减负不能比减脂还难》。 截图:来源“人民体验官”推广平台 在时下的一些网络自媒体平台之上,的确存在“越拉越多的群,没完没了的接龙&#xff0c…

在使用Vuex时,5个方法让你保证数据的更新及时性

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

hosts文件修改完成之后无法保存的解决方法

系列文章目录 centos7配置静态网络常见问题归纳_张小鱼༒的博客-CSDN博客 目录 系列文章目录 前言 一、hosts文件为何不能保存的原因 二、Hosts文件无法保存解决方法 1.需要用到hosts的地方 2.具体的操作步骤 总结 前言 Hosts文件是系统中的重要文件,它能屏…

Spring面试题:(五)Spring注解开发@Component,@Autowired,@Bean,@Configuration

Bean基本注解 spring提供注解的版本 Component注解替代bean标签 bean其它属性的相关注解: scope 替代scopelazy 替代lazy-initPostConstruct 替代init-methodPreDestroy 替代destroy-method 使用Component注解的前提是开启注解扫描 衍生注解Repository,Servi…

博客积分上一万一千了

博客积分上一万一千了 充满自信,继续前进。

GCC工具详解【Linux知识贩卖机】

很多人在喧嚣声中登场,也有少数人在静默中退出。 --单独中的洞见2 文章目录 简介程序到可执行文件链接动态链接和静态链接动态库和静态库动态库和静态库的打包打包静态库打包动态库选项 -static 总结 简介 GCC(GNU Compiler Collection) 是一…

移动硬盘和u盘的区别哪个好 移动硬盘和u盘有啥区别

在数字时代的今天,数据存储已经成为我们生活中的重要一环。当我们需要移动、备份或传输大量数据时,常常会不知道是选择移动硬盘还是U盘。其实,对于许多人来说,移动硬盘和U盘之间的区别并不清晰。下面我们就来看移动硬盘和u盘的区别…

【C语言:深入理解指针一】

文章目录 1.指针存在的意义2.指针变量和地址3.指针变量类型的意义3.1指针解引用3.2指针 - 整数3.3void* 4.关键字const4.1const修饰变量4.2 const修饰指针 5.指针运算5.1指针 -整数5.2指针-指针5.3指针比较大小 6. 野指针7.assert断言8. 数组名的理解9.一维数组传参的本质 1.指…

SpringBoot自动装配定义先后顺序失效原因极其解析

SpringBoot自动装配定义先后顺序失效原因极其解析 1、场景分析1.1、问题总结 2、使用AutoConfigureBefore、AutoConfigureAfter和AutoConfigureOrder注解指定加载顺序2.2、AutoConfigureXX注解失效原因总结 3、使用静态内部装配类提升加载顺序4、bean加载顺序规则 1、场景分析 …

腾讯云优惠券介绍、作用、领取方法及使用教程

随着云计算技术的发展,越来越多的企业和个人选择使用云服务进行数据存储、计算等业务。腾讯云作为国内知名的云服务商,提供了一整套完善的云解决方案,并不定期发放优惠券以吸引更多的客户。本文将为大家详细介绍腾讯云优惠券的作用、领取方法…

leetcode刷题日记:111. Minimum Depth of Binary Tree(二叉树的最小深度)

给我们一个二叉树,我们应该如何来求二叉树的最小深度呢? 二叉树的最小深度指的是叶子结点到所处的位置最小的,这就是二叉树的最小深度,也就是说我们要找的是离根结点最近的叶子结点。如果我们从根结点向下出发寻找叶子节点&#x…

【matlab】KMeans KMeans++实现手写数字聚类

目录 matlab代码kmeans matlab代码kmeans MNIST DATABASE下载网址: http://yann.lecun.com/exdb/mnist/ 聚类 将物理或抽象对象的集合分成由类似特征组成的多个类的过程称为聚类(clustering)。 对于给定N个n维向量x1,…,xN∈Rn,聚类的目标…

解决wrong fs type, bad option, bad superblock on /dev/sda1问题

1 背景 某天挂载硬盘的时候,系统提示了如下错误: 在此记录排查过程以及解决方案。 2 排查过程 出现这种问题应该先尝试从日志入手,输入: sudo dmesg | tail输出如下: 关键信息: [ 164.750178] ntfs3:…

【Mybatis小白从0到90%精讲】16: Mybatis like语句四种传参方式

文章目录 前言方式一:Java代码拼接方式二:MySQL CONCAT函数方式三:Mybatis bind标签方式四:SQL拼接前言 在实际开发中,SQL中使用 模糊查询like使用非常普遍,在MyBatis中,为了防止SQL注入攻击,可以使用#{}来传递参数,切记like语句不要使用${}的方式! 这里我总结了 四…

【离散数学必刷题】谓词逻辑(第二章 左孝凌版)刷完包过!

专栏:离散数学必刷题 本章需要掌握的重要知识: 1.利用谓词表达式表示命题 2.变元的约束 3.谓词公式的定义、谓词公式的赋值 4.谓词公式的翻译(注意在全总个体域时使用特性谓词) 5.有限论域上量词的消去 6.谓词公式中关于量词的等价…

【算法每日一练]-单调队列,滑动窗口(保姆级教程 篇1) #滑动窗口 #求m区间的最小值 #理想的正方形 #切蛋糕

今天讲单调队列 目录 题目:滑动窗口 思路: 题目:求m区间的最小值​ 思路: 题目:理想的正方形 思路: 题目:切蛋糕 思路: 一共两种类型:一种是区间中的最值&…