docker-部署

使用Docker 以及Docker Compose部署Go程序 为什么需要docker 使用docker的主要目标是其容器化。可以为应用程序提供一致的环境,而不依赖它运行的主机 部署示例 1.准备代码 package main import ( "fmt" "net/http" ) func main() { http.HandleFunc("/", hello) server := &http.Server{ Addr: ":8888", } fmt.Println("server startup...") if err := server.ListenAndServe(); err != nil { fmt.Printf("server startup failed, err:%v\n", err) } } func hello(w http.ResponseWriter, _ *http.Request) { w.Write([]byte("hello liwenzhou.com!")) } 这里是简单代码 2.创建Docker镜像 镜像(image)包含运行应用程序所需的所有东西——代码/二进制文件、运行时、依赖项以及所需的任何其它人间系统对象 简单讲,镜像是定义应用程序以及运行所需的一切 3.编写Dockerfile 要创建Docker镜像(image)必须在配置文件中的指定步骤,这个文件默认称为Dockerfile ...

September 28, 2024 · 3 min · Chen-Hang

dockerfile-学习

学习自 一篇文章带你吃透 Dockerfile - 掘金 (juejin.cn) Dockerfile reference 全网最详细的Docker-Compose详细教程 - 掘金 (juejin.cn) docker compose 配置文件 .yml 全面指南 - 知乎 (zhihu.com) compose-spec/spec.md at master · compose-spec/compose-spec · GitHub 前言 学习Dockers前期,通过Docker的官方镜像仓库拉取里面的镜像,根据这些镜像创建出容器并运行 实际上,Docker官方镜像也是通过一定的方式构建出来的,只要弄清其中的逻辑,我们也可以仿照官方镜像的构建过程,构建出自己的镜像 Dockerfile就是这样一个用于描述Docker镜像构建过程的文本文件,dockerfile可以包含多条构建指令,以及相关的描述 1.什么是容器 容器是计算机上的沙盒进程,与主机上的其它进程隔离,这种隔离利用了内核命名空间和cgroups。简而言之容器是: 是image的可运行实例 可以在本地计算机、虚拟机上运行或部署到云中 是可移植的 与其它容器隔离,并运行自己的软件,二进制文件和配置 2.什么是容器映射 当容器运行时,它使用了隔离的文件系统。这个自定义的文件系统由容器映像container image提供。因为image包含了容器的问价系统,使用image必须包含所有的运行应用程序所必须的所有东西——依赖项、配置、脚本、二进制文件等等。 沙盒进程是指在计算机系统中,为了保障安全和隔离性而采用的一种技术,将应用程序运行在一个受限制的环境中,限制它们能访问的资源和操作范围,从而避免恶意程序和授权程序对系统的破坏 3.容器是怎么运行的 当一个容器运行时,它为其文件系统使用来image的各个层。每个容器都有自己的命名空间来创建/更新/删除文件。在另一个容器中不会看到任何更改,即使它们使用相同的image 4.容器卷[container volumes] 每个容器启动时都是从容器的定义开始的。在容器中可以创建、更新和删除文件,但当容器被删除时,这些改变将回丢失,所有更变都被隔离在各个容器中 卷:提供了将容器的特定文件系统路径链路到主机的能力。如果在主机上的某个文件被挂载,那么当容器中该文件路径下的文件发送更改时,我们在主机上同样也可以看到更改。同样的,启动另一个挂载了同一个文件目录的容器,它也可以访问到相同的文件 镜像构建原理 1.Docker架构模式 docker使用了client/server的架构模式。构建镜像时,用户在dockers client输入构建命令。docker引擎以 REST API的形式,像 docker daemon发送构建请求,如何dockers daemon就根据构建请求的内容,开始镜像构建的工作,并向Client持续放回构建过程的信息。 2.镜像分层模型 docker镜像是用于创建容器的只读模板,是通过 Dockerfile中定义的指令构建而成的,构建结束后,会在原有的镜像层上生成一个新的镜像层,如下所示 在 tomcat 镜像创建一个容器后,会在tomcat镜像之上新创建一个可写的容器层,在容器中写文件时,会保存到这个容器层中 3.基础镜像与父级镜像 用于构建基础镜像的 Dockerfile 不指定父级镜像,Docker约定使用如下形式基础镜像 FROM scratch 这里的 scratch是一个空镜像,可以从零开始构建镜像,常用来构建最小镜像,如busybox,debian,alpine等镜像,省去很多linux命令,因此很小。一般,不需要自己去构建基础镜像。 ...

September 28, 2024 · 4 min · Chen-Hang

vscode 快捷键

常用 General 按 Press 功能 Function Ctrl + Shift + P,F1 显示命令面板 Show Command Palette Ctrl + P 快速打开 Quick Open Ctrl + Shift + N 新窗口/实例 New window/instance Ctrl + Shift + W 关闭窗口/实例 Close window/instance Ctrl + , 用户设置 User Settings Ctrl + K Ctrl + S 设置键盘快捷方式 Keyboard Shortcuts 基础编辑 Basic editing 按 Press 功能 Function Ctrl + X 剪切行(空选定) Cut line (empty selection) Ctrl + C 复制行(空选定)Copy line (empty selection) Alt + ↑ / ↓ 向上/向下移动行 Move line up/down Shift + Alt + ↓ / ↑ 向上/向下复制行 Copy line up/down Ctrl + Shift + K 删除行 Delete line Ctrl + Enter 在下面插入行 Insert line below Ctrl + Shift + Enter 在上面插入行 Insert line above Ctrl + Shift + | 跳到匹配的括号 Jump to matching bracket Ctrl + ] / [ 缩进/缩进行 Indent/outdent line Home 转到行首 Go to beginning of line End 转到行尾 Go to end of line Ctrl + Home 转到文件开头 Go to beginning of file Ctrl + End 转到文件末尾 Go to end of file Ctrl + ↑ / ↓ 向上/向下滚动行 Scroll line up/down Alt + PgUp / PgDown 向上/向下滚动页面 Scroll page up/down Ctrl + Shift + [ 折叠(折叠)区域 Fold (collapse) region Ctrl + Shift + ] 展开(未折叠)区域 Unfold (uncollapse) region Ctrl + K Ctrl + [ 折叠(未折叠)所有子区域 Fold (collapse) all subregions Ctrl + K Ctrl + ] 展开(未折叠)所有子区域 Unfold (uncollapse) all subregions Ctrl + K Ctrl + 0 折叠(折叠)所有区域 Fold (collapse) all regions Ctrl + K Ctrl + J 展开(未折叠)所有区域 Unfold (uncollapse) all regions Ctrl + K Ctrl + C 添加行注释 Add line comment Ctrl + K Ctrl + U 删除行注释 Remove line comment Ctrl + / 切换行注释 Toggle line comment Shift + Alt + A 切换块注释 Toggle block comment Alt + Z 切换换行 Toggle word wrap 导航 Navigation 按 Press 功能 Function Ctrl + T 显示所有符号 Show all Symbols Ctrl + G 转到行… Go to Line… Ctrl + P 转到文件… Go to File… Ctrl + Shift + O 转到符号… Go to Symbol… Ctrl + Shift + M 显示问题面板 Show Problems panel F8 转到下一个错误或警告 Go to next error or warning Shift + F8 转到上一个错误或警告 Go to previous error or warning Ctrl + Shift + Tab 导航编辑器组历史记录 Navigate editor group history Alt + ← / → 返回/前进 Go back / forward Ctrl + M 切换选项卡移动焦点 Toggle Tab moves focus 搜索和替换 Search and replace 按 Press 功能 Function Ctrl + F 查找 Find Ctrl + H 替换 Replace F3 / Shift + F3 查找下一个/上一个 Find next/previous Alt + Enter 选择查找匹配的所有出现 Select all occurences of Find match Ctrl + D 将选择添加到下一个查找匹配 Add selection to next Find match Ctrl + K Ctrl + D 将最后一个选择移至下一个查找匹配项 Move last selection to next Find match Alt + C / R / W 切换区分大小写/正则表达式/整个词 Toggle case-sensitive / regex / whole word 多光标和选择 Multi-cursor and selection 按 Press 功能 Function Alt +单击 插入光标 Insert cursor Ctrl + Alt +↑/↓ 在上/下插入光标 Insert cursor above / below Ctrl + U 撤消上一个光标操作 Undo last cursor operation Shift + Alt + I 在选定的每一行的末尾插入光标 Insert cursor at end of each line selected Ctrl + L 选择当前行 Select current line Ctrl + Shift + L 选择当前选择的所有出现 Select all occurrences of current selection Ctrl + F2 选择当前字的所有出现 Select all occurrences of current word Shift + Alt + → 展开选择 Expand selection Shift + Alt + ← 缩小选择 Shrink selection Shift + Alt + (拖动鼠标) 列(框)选择 Column (box) selection Ctrl + Shift + Alt +(箭头键) 列(框)选择 Column (box) selection Ctrl + Shift + Alt + PgUp / PgDown 列(框)选择页上/下 Column (box) selection page up/down 丰富的语言编辑 Rich languages editing 按 Press 功能 Function Ctrl + 空格 触发建议 Trigger suggestion Ctrl + Shift + Space 触发器参数提示 Trigger parameter hints Shift + Alt + F 格式化文档 Format document Ctrl + K Ctrl + F 格式选定区域 Format selection F12 转到定义 Go to Definition Alt + F12 Peek定义 Peek Definition Ctrl + K F12 打开定义到边 Open Definition to the side Ctrl + . 快速解决 Quick Fix Shift + F12 显示引用 Show References F2 重命名符号 Rename Symbol Ctrl + K Ctrl + X 修剪尾随空格 Trim trailing whitespace Ctrl + K M 更改文件语言 Change file language 编辑器管理 Editor management 按 Press 功能 Function Ctrl + F4, Ctrl + W 关闭编辑器 Close editor Ctrl + K F 关闭文件夹 Close folder Ctrl + | 拆分编辑器 Split editor Ctrl + 1 / 2 / 3 聚焦到第 1,第 2 或第 3 编辑器组 Focus into 1st, 2nd or 3rd editor group Ctrl + K Ctrl + ← / → 聚焦到上一个/下一个编辑器组 Focus into previous/next editor group Ctrl + Shift + PgUp / PgDown 向左/向右移动编辑器 Move editor left/right Ctrl + K ← / → 移动活动编辑器组 Move active editor group 文件管理 File management 按 Press 功能 Function Ctrl + N 新文件 New File Ctrl + O 打开文件… Open File… Ctrl + S 保存 Save Ctrl + Shift + S 另存为… Save As… Ctrl + K S 全部保存 Save All Ctrl + F4 关闭 Close Ctrl + K Ctrl + W 关闭所有 Close All Ctrl + Shift + T 重新打开关闭的编辑器 Reopen closed editor Ctrl + K Enter 输入保持打开 Enter Keep Open Ctrl + Tab 打开下一个 Open next Ctrl + Shift + Tab 打开上一个 Open previous Ctrl + K P 复制活动文件的路径 Copy path of active file Ctrl + K R 显示资源管理器中的活动文件 Reveal active file in Explorer Ctrl + K O 显示新窗口/实例中的活动文件 Show active file in new window/instance 显示 Display 按 Press 功能 Function F11 切换全屏 Toggle full screen Shift + Alt + 0 切换编辑器布局 Toggle editor layout Ctrl + = / - 放大/缩小 Zoom in/out Ctrl + B 切换侧栏可见性 Toggle Sidebar visibility Ctrl + Shift + E 显示浏览器/切换焦点 Show Explorer / Toggle focus Ctrl + Shift + F 显示搜索 Show Search Ctrl + Shift + G 显示 Git Show Git Ctrl + Shift + D 显示调试 Show Debug Ctrl + Shift + X 显示扩展 Show Extensions Ctrl + Shift + H 替换文件 Replace in files Ctrl + Shift + J 切换搜索详细信息 Toggle Search details Ctrl + Shift + C 打开新命令提示符/终端 Open new command prompt/terminal Ctrl + Shift +U 显示输出面板 Show Output panel Ctrl + Shift + V 切换 Markdown 预览 Toggle Markdown preview Ctrl + K V 从旁边打开 Markdown 预览 Open Markdown preview to the side Ctrl + K Z 打开禅模式( Esc 键退出) Zen Mode (Esc Esc to ecit) 调试 Debug 按 Press 功能 Function F9 切换断点 Toggle breakpoint F5 开始/继续 Start/Continue Shift + F5 停止 Stop F11 / Shift + F11 下一步/上一步 Step into/out F10 跳过 Step over Ctrl + K Ctrl + I 显示悬停 Show hover 集成终端 Integrated terminal 按 Press 功能 Function Ctrl + ` 显示集成终端 Show integrated terminal Ctrl + Shift + ` 创建新终端 Create new terminal Ctrl + C 复制选定 Copy selection Ctrl + V 粘贴到活动端子 Paste into active terminal Ctrl + ↑ / ↓ 向上/向下滚动 Scroll up/down Shift + PgUp / PgDown 向上/向下滚动页面 Scroll page up/down Ctrl + Home / End 滚动到顶部/底部 Scroll to top/bottom

September 6, 2024 · 6 min · Chen-Hang

HTTP的协议有什么特点? HTTP协议基于文本传输的,支持不同的****数据格式,例如HTML、JSON、XML等数据格式,并且http是无状态的,每个http请求之间相互独立,采用了请求-应答模式,有很好的扩展性,可以通过扩展头部、方法等支持行方式 HTTP报文格式?怎么分割 http的报文格式分为请求头、请求行、请求体,请求头包含了请求方式、url、http版本,请求行包含了key-value对的信息,有connection,content-lenth等字段,请求体包含了实际的请求数据;请求头和请求行通过/r/n进行分割,请求行和请求体通过一行空白行进行分割 HTTP有什么方法? GET、PUT、DELETE、post、head、options、trace、connect 哪些http方法是安全的?哪些是幂等的 get、head是安全的 post、put、delete是不安全的 get、head、put、delete是幂等的 post是不幂等的 GET和POST请求的区别?追问:GET请求一定是安全且幂等的吗? get请求是从服务器获取资源,post请求向服务器提交数据, get请求是读操作,是安全且幂等的;post请求因为会修改服务器的资源,且多次post请求会创建多个资源,所以是不安全且不幂等的 get请求一般是将请求参数放在url的查询字符串中,浏览器对url的长度有限制,所以get请求的请求参数有长度限制。post请求的数据放在请求体,post请求的请求参数没有长度限制 HTTP有哪些状态码? 100类:属于提示信息,为协议处理中的中间状态 200类:表示服务器成功处理客户端的请求 200:表示成功处理,返回期望的结果 204:与200状态码相似,但是响应头没有body数据 206:http分块下载或断点续传的几次, 300类:表示请求的资源发生了变动,需要客户端用新的URL重新发送请求,就是重定向 301:永久性的重定向,后续请求可以直接重定向访问 302:临时访问, 304: 400类:表示客户端发送的报文有误,服务器无法处理 403:请求的权限不够 404:请求的资源不存在 500类:表示服务器处理 时内部发生了错误,属于服务器端的错误码 什么情况下会出现502错误码? 502(Bad GateWay)表示码表示服务器在充当网关或代理时,在尝试满足请求时从它访问的入站服务器接收到无效响应 如果客户端访问服务是通过nginx来反向代理到应用服务器,那么如果应用服务器出现故障,导致nginx无法从应用服务获得响应,这时候nginx就会返回502错误码给客户端 有个服务出现504错误码,这个服务出现了什么问题 504是网关超时错误,通过nginx将请求代理到后端应用,后端程序没有在规定时间内返回数据,需要开发检查接口超时问题,比如是否出现死循环、sql慢查询等 重定向是哪一类状态码?临时重定向和永久重定向有什么区别? 重定向是300类状态码,301表示永久重定向,302表示临时重定向 永久重定向,客户端会记忆重定向后的url,下次访问的时候不需要访问旧url,直接跳转新url访问 临时重定向,客户端会收到302状态码,不会记忆重定向后的url,下次访问依旧访问旧url,再跳转到新的url HTTP1.1和2.0的区别 2.0引入stream概念,可以在同一个tcp连接中,实现并发传输,而1.1不能并发传输,必须在一个请求结束之后才能进行下一个请求应答,浏览器是通过建立多个tcp连接,实现http1.1的并发,比较消耗内存 报文改进,1.1发生的是文本数据,2.0发生二进制数据,通过HPACK算法压缩HTTP头部,提高了传输效率 http2.0支持服务器主动推送数据 HTTP2.0和HTTP3.0的区别? HTTP2.0和HTTP3.0的最大区别是传输层使用的协议不同了,HTTP2.0使用的是TCP协议连接,HTTP3.0使用UDP协议; HTTP2.0会出现TCP队头阻塞问题,(http2.0的tcp阻塞问题,是因为http2.0的并发传输是在一条TCP连接上实现的,在传输过程中,如果某个stream发生了丢包,服务端不仅不能处理这个stream,也不会处理其他的stream,必须等丢失的包重传,才能继续处理其他stream,这个就发生了tcp队头阻塞),但是HTTP3.0通过一个在UDP协议上实现了一个可靠的QUIC协议,当stream发生丢包时,只会阻塞这个stream,其他stream不会受影响 http3.0建立连接比http2.0高效,http3.0:3次握手就能建立连接+TLS握手成功;http2.0需要3次TCP握手+TLS四次握手 http3.0在网络切换的环境下无需重新建立连接,通过在应用层的唯一id来确定连接 简述JWT的原理和校验机制 jwt的数据个数是header.payload.signature,头部、负载、签名三部分组成, header包含:令牌的类型以及令牌签名的算法 payload:向服务器传递的数据,比如包含认证信息 签名:对前面两部分的签名,防止数据篡改(使用在Header中公开的特点签名算法,通过特定的密钥(由服务器进行保密),对前面两部分进行加密计算 验证JWT令牌的流程: 服务端接收到客户端发来的JWT,取出header+payload,然后服务端根据自己的加密密钥进行加密计算 把加密的结果和客户端发来JWT的signature进行对比,如果完全相同,则表示前面两部分没有动,如果不相同表示被篡改了 当令牌没有被篡改后,服务端可以进行其它验证:令牌过期,用户是否有权限访问等 jwt令牌是由3个部分组成,分别是头部、负载、签名,头部包括类型和签名算法,负载包含了用户信息等数据,签名是对头部和负载两部分的签名,使用头部的签名算法,通过服务器的密钥对前面两部分内容进行加密计算 校验jwt的过程是服务端接收到客户端发过来的jwt令牌后,服务端会取出头部和负载数据,然后用自己的密钥对头部和负载进行加密计算,将得到的加密结果和客户端发送过来的jwt的签名机械能对比,如果相同,表示前面两部分没有内中间人篡改,这个时候服务器可以进行其他检查,比如检查jwt是否过期,如果没有问题,正常执行业务逻辑 什么是跨域?什么情况下会发生跨域? 当网页尝试访问不同源的资源的使用,就会发生跨域,只要域名、协议、端口这三个信息任意一个不同,都认为是不同源的URL 可以用跨域资源共享技术,在服务器需要的响应头上添加Access-Control-Allow-Origin的字段, 什么是Restful?RestFul请求的url有什么特点? restful是一种api接口设计规范,用url定位资源,用http方法表示接口的动作,用http状态码表示接口处理的情况 HTTP和HTTPS有什么区别? 安全性:HTTP使用明文传输,HTTPS通过SSL/TLS协议对数据进行加密处理,提供更高的安全性和数据保护 建立连接:HTTP建立只需要TCP三次握手;HTTPS在TCP三次握手后还需要进行SSL/TLS的握手过程 端口:HTTP的端口是80;HTTPS的端口是443 证书:HTTPS需要使用数字证书来验证服务器的身份,并确保数据传输的安全性。证书由第三方机构颁发,用于证明服务器的身份和所有权。而HTTP没有使用证书进行身份验证和加密。 ...

1 min · Chen-Hang

TCP三次握手 TCP头部有哪些字段? tcp报文段 : tcp头部+tcp数据部分 tcp头部: 源端口:16位 目的端口:16位 序号:32位 确认号:32位 数据偏移:4位 保留:6位 窗口:16位 校验和:16位 紧急指针:16位 选项和填充:最多为40字节 控制位: URG:紧急指针标志,为1时标识紧急指针有效,该报文应该优先传送,为0则忽略紧急指针 ACK:确认序号标志,为1时表示确认号有效。携带ACK标识的TCP报文段被称为确认报文段 RST:重置连接 SYN:表示请求建立一个连接 FIN:用于释放连接 PSH:为1表示带有push标志的数据,优先将这个报文提交给应用程序,而不是缓冲区排队 tcp头部的最长是60字节 数据部分:。。。 回答:tcp头部主要是源端口、目的端口、序列号、确认号、标记位:SYN、RST、ACK、FIN、头部长度、窗口大小,可扩展的选项等 其中序列号和确认号的大小为32位,序列号保证数据的有序性,接收方按照发送方顺序发来的数据来组装有序的数据;确认号保证数据的可靠性,当发送方已发送的数据,超过一段时间没收到确认报文,就会重传报文。 源端口和目的端口的大小是16位,源端口是发送方的端口号,目的端口是接收方使用的端口号,端口的作用是标识TCP连接是哪个进程 TCP之报文首部格式 - Jummyer - 博客园 TCP三次握手连接过程 客户端和服务端一开始都处于close状态,服务端会监听一个端口,处于listen状态 第一次握手:客户端产生随机初始化序号,放到tcp报文头部的序号字段,同时把SYN标志设置位1,标识SYN报文。接着把SYN报文发送给服务端,之后客户端处于SYN_SEND状态 服务端收到SYN报文后,服务端也生成随机初始化序号,放到TCP报文头部的序号字段中,对客户端的初始化序号+1作为确认号,放到TCP报文头部的确认应答字段中,并将SYN和ACK标志设置为1,表示SYN-ACK报文,把报文发送给客户端,之后服务端处于SYN_RECD状态 客户端收到服务端SYN-ACK报文后,客户端发送一个ACK确认报文,该报文的确认号为服务端的初始化序号+1,并将ACK标志设置为1。客户端处于ESTABLISHED状态 服务端收到ACK确认报文,服务端也处于ESTABLISHED状态 以上就是TCP三次握手的过程 4.1 TCP 三次握手与四次挥手面试题 为什么需要三次握手?两次握手不行吗? 避免历史连接的建立,避免资源浪费 三次握手可以确认客户端和服务端是否同时具备发送和接收的能力 如果第二次握手丢包,会发送什么? 超时重传机制,第二次SYN-ACK报文中有 第二次报文中的ACK,是第一次握手的确认报文,那么当第二次报文丢包时,会导致客户端一直没有接收到ACK而触发超时重传机制,重传SYN包,即第一次握手 第二次报文中的SYN,是服务端建立TCP连接的报文,当第二次报文丢失后,客户端没有发送ACK报文,服务端没有收到第三次握手,于是服务端会触发超时重传机制,重传SYN-ACK报文 如果第三次握手丢包,会发生什么? 我的理解是第三次握手如果发生丢包,服务端会迟迟接收不到第三次握手的ACK包,触发超时重传机制,服务端会重新发生第二次握手的SYN-ACK包,直到最大重传次数的限制,或者收到第三次握手 TCP的半连接队列和全连接队列? 在tcp三次握手的时候,linux内核会维护两个队列,分别是: syn队列:半连接队列 accept队列:全连接队列 服务端收到客户端发起的SYN请求后,内核会将为握手完成的连接存储到半连接队列,等待完成三次握手后转移到全连接队列 全连接队列:服务端收到客户端的第三次握手,内核会将连接从半连接队列移除,然后创建新的完全连接,并将其添加到全连接队列,等待进程调用accept函数将连接取出 4.4 TCP 半连接队列和全连接队列 TCP四次挥手 TCP四次挥手的过程 tcp的四次挥手(断开连接)是可以客户端或者服务端断开 客户端关闭连接,此时会发生一个fin报文,之后客户端进入fin_wait_1状态, 服务端收到fin报文后,将向客户端发送ack报文,接着服务端进入close_wait状态 客户端接收到ack应答报文后,之后进入fin_wait_2状态 等待服务端处理完数据后,向客户端发送fin报文,服务端进入last_ack状态 客户端收到服务端的fin报文后,回一个ack应答报文,客户端进入time_wait状态 服务端接收到ack报文后,进入close状态,至此服务端完成连接的关闭 ...

1 min · Chen-Hang