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

以前在公司的时候,使用同事准备的容器化环境,直接在 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

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

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

相关文章

吴恩达《机器学习》8-3->8-4:模型表示I、模型表示II

8.3、模型表示I 一、大脑神经网络的基本原理 为了构建神经网络模型,首先需要理解大脑中的神经网络是如何运作的。每个神经元都可以被看作是一个处理单元或神经核,它包含多个输入(树突)和一个输出(轴突)。…

在vue3中使用Element-plus的图标

首先安装Element-Plus-icon # 选择一个你喜欢的包管理器# NPM $ npm install element-plus/icons-vue # Yarn $ yarn add element-plus/icons-vue # pnpm $ pnpm install element-plus/icons-vue 如何使用 Element-Plus-icon官方文档链接Icon 图标 | Element Plus (element-…

【操作系统】1.1 操作系统的基础概念、功能以及特性

📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍…

Unity之NetCode多人网络游戏联机对战教程(8)--玩家位置同步

文章目录 前言添加相机玩家添加对应组件服务端权威(server authoritative)客户端权威(client authoritative)服务端同步位置阅读与理解PlayerTransformSync.csNetworkVariableUploadTransformSyncTransform 后话 前言 承接上篇&a…

LOW-POWER AUDIO KEYWORD SPOTTING USING TSETLIN MACHINES

基于TM的低功耗语音关键字识别 摘要1介绍2TM的介绍3KWS的音频预处理技术4实验结果MFC4.1C设置分位数数量4.3增加关键词数量4.4 声音相似的关键词4.5 每个类别的子句数量对KWS-TM的比较学习收敛和复杂性分析 摘要 在本文中,我们探讨了一种基于TM的关键词识别&#x…

《算法通关村——透彻理解二叉树中序遍历的应用》

《算法通关村——透彻理解二叉树中序遍历的应用》 直接上题 108. 将有序数组转换为二叉搜索树 给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。 高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高…

同一个Unity项目打开两个Unity Editor实例

特殊情况下,同一个项目需要同时打开两个编辑器做测试,如多人在线游戏,或者有通信功能的时候就有这样的需求。同时也为了方便调试和观察日志。并且修改的是同一份代码。 命令介绍: 实现思路: 使用 mklink 命令 分别创建…

深入研究SVN代码检查的关键工具:svnchecker vs. SonarQube,选择最适合你的代码检查工具

目录 一、SVN代码检查(整合svnchecker)1、创建SVN代码库2、下载安装包3、修改SVN配置4、新建代码检查配置文件(名称自定义)5、hooks目录添加配置文件6、设置只对Java文件进行检查7、测试 二、SonarQube代码检测1、什么是SonarQube2、MySQL数据库的安装3、SonarQube服务端软件安…

530. 二叉搜索树的最小绝对差

题目描述 给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数,其数值等于两值之差的绝对值。 示例 1: 输入:root [4,2,6,1,3] 输出:1示例 2: ) 输入&#…

边缘分布式机器学习

目录 通信机制同步Synchronous异步Asynchronous半同步/延时同步通信的拓扑结构基于迭代式MapReduce的通信(同步模式)基于MPI之AllReduce的通信(同步模式)AllReduce有很多变种 基于参数服务器的通信(多为异步&#xff0…

[mysql]索引优化-2

目录 一、分页查询优化1.根据自增且连续的主键排序的分页查询2.根据非主键字段排序的分页查询 二、Join关联查询优化1.嵌套循环连接 Nested-Loop Join(NLJ) 算法2.基于块的嵌套循环连接 Block Nested-Loop Join(BNL)算法 三、count(*)查询优化1.查询mysql自己维护的总行数2.sho…

Linux进程空间地址

程序地址空间回顾 问题引入 ---------------明天再写0.0

Zyxel NBG2105 身份验证绕过

直接访问如下payload则会以管理员身份跳转到 home.htm页面 ​​/login_ok.htm漏洞证明 查看本页面的cookie,login为1 文笔生疏,措辞浅薄,望各位大佬不吝赐教,万分感谢。 免责声明:由于传播或利用此文所提供的信息、…

Linux文件缓冲区

文章目录 1. 缓冲区现象2. 用户级和系统级缓冲区3. 缓冲区刷新4. 为什么要有缓冲区5. 文件打印的全缓冲6. 模拟实现C语言文件标准库 本章gitee代码仓库:重定向、模拟C语言文件标准库 1. 缓冲区现象 我们这里分别调用了4个差不多的函数,但是结果是有一定差…

【云备份项目两万字总结】服务端篇 -----附源码

项目总结 整体回顾逐步实现utill.hppconfig.hppdata.hpphot.hppservice.hpp 代码 整体回顾 服务端的目标是: 对客户端的请求进行处理管理客户端上传的文件 于客户端进行数据交换,我们需要引入网络,所以我们引入第三方库----httplib.h库&am…

如何在 Python 中执行 MySQL 结果限制和分页查询

Python MySQL 限制结果 限制结果数量 示例 1: 获取您自己的 Python 服务器 选择 “customers” 表中的前 5 条记录: import mysql.connectormydb mysql.connector.connect(host"localhost",user"您的用户名",password"您的密码"…

xml schema中的sequence的含义

https://www.w3.org/TR/xmlschema-1/#element-sequence xml schema中的sequence的含义:包含的元素必须按规定的顺序出现。通过属性maxOccurs和minOccurs可以定义最多、最少出现的次数。最多可以定义不限制次数,最少可以定义0次。默认是最少出现1次&…

Python基础入门例程54-NP54 被5整除的数字(循环语句)

最近的博文: Python基础入门例程53-NP53 前10个偶数(循环语句)-CSDN博客 Python基础入门例程52-NP52 累加数与平均值(循环语句)-CSDN博客 Python基础入门例程51-NP51 列表的最大与最小(循环语句)-CSDN博客 目录 最近的博文: 描述 输入描述&#xf…

Spring面试题:(六)Spring注解开发原理

ioc过程 发现只要将bean注册到BeanDefinitionMap中就可以创建bean对象 如何将xml配置的bean注册到BeanDefinitionMap 通过注解注册的bean过程一样 注册bean的接口:BeanDefinitionRegistryPostProcessor 开启组件扫描的两种方式:xml和注解 xml方式…