当前位置: 首页 > news >正文

dockerfile避坑笔记(VMWare下使用Ubuntu在Ubuntu20.04基础镜像下docker打包多个go项目)

一、docker简介

docker是一种方便跨平台迁移应用的程序,通过docker可以实现在同一类操作系统中,如Ubuntu和RedHat两个linux操作系统中,实现程序的跨平台部署。比如我在Ubuntu中打包了一个go项目的docker镜像(镜像为二进制文件,相当于windows中的exe文件),这个镜像可以直接在另一台Ubuntu上运行,而无需再次配运行环境。下面这张图是我对docker的理解。
原始程序迁移方式在这里插入图片描述
docker镜像迁移方式
在这里插入图片描述

二、dockerfile编写

将项目打包为docker镜像通过编写dockerfile来实现,dockerfile的写法类似于shell编程。
PS:最终的dockerfile不易过长(但是调试时可以多些RUN,这样可以减少重复编译,提高调试速度),因为每个语句都会被编译为一个镜像,然后commit到一起形成一个最终的镜像。
其基本的结构如下:

FROM ***(指定基础镜像,即这个镜像在哪个操作系统下面运行)
#示例:FROM  Ubuntu:20.04MAINTAINER ***(指定维护者信息,选填)
#示例:MAINTAINER TomLABEL ***(docker build的启动入口,可以不写)
#示例:LABEL helloworldRUN ***(docker build时需要执行的命令,为shell指令)
#RUN git clone github.com/xxxx.gitADD/COPY ***(将宿主机的文件拷贝到目标镜像中,ADD会自动解压,COPY不会)
#示例:COPY 	. .
#前一个目录为当前文件夹下的相对路径,后一个文件为dockerfile镜像中的路径WORKDIR ***(设置当前工作目录,相当于进入容器后在哪个目录里面)VOLUME ***(存放文件的地方,也叫挂载主机目录,分布式存储中使用)EXPOSE ***(指定对外的端口)CMD ***(指定容器启动后要做的事情)

打包镜像:

docker build -t demo/go-hello:1.0 -f dockerfile .
#docker build为固定写法,-t表示生成目标镜像的名字以及版本号 -f表示dockerfile文件的名称,
#最后的‘.’表示当前目录下构建docker

构建运行容器:

docker run  -it -p xxx:xxx
#-i 以交互模式运行,-t 为容器分配一个命令行
#-p 容器端口映射到主机端口的模式

三、docker build原理

完成dockerfile后,需要运行docker build命令来执行程序。
docker build的执行过程如下:

1.将上下文打包发送到docker的守护进程

2.docker build 命令向docker server 发送http请求,请求包含上下文信息。

3.docker server开始构建镜像:
①创建一个临时目录,将上下文中的内容解压到临时目录下,然后读取dockerfile中的指令。
②将执行分发到不同的模块进行操作,为每一条指令构造一个临时容器并执行,执行完毕后commit。
③将所有commit的镜像合并,得到最终的镜像。

这里需要注意,docker build会将当前文件下的所有文件发送到docker server,如果有些文件在docker过程中并不需要,可以在当前目录下创建忽略 .dockerignore 文件,并写入忽略文件的文件名。

docker避坑笔记

调试背景

我在windows10下安装VMWare,WMware中安装了Ubuntu20.04,并使用桥接模式连接的windows10主机。(说明虚拟机与主机的IP地址互相独立,Ubuntu无法通过127.0.0.1访问Windos10),同时在Ubuntu20.04基础镜像下打包golang项目的镜像。

问题1:docker build运行dockerfile报错,E: Unable to locate package xxx

这里报错有很多原因,大概可以归为以下几类:
1、当前的apt-get不是最新版,所以无法找到这个库
解决方案,运行apt-get update

apt-get update

2、使用上述方法后,仍然报错,可能就是真的没这个包,或者这个包在外网下载,国内无法访问或访问速度过慢。这里采用换源的方法,看看能不能解决。
解决方案:在dockerfile中加入

RUN sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list

问题2:dockerfile安装golang时报错,显示Do you want to continue? [Y/n] Abort.

dockerfile运行过程中,无法接受用户的输入,但是有些软件包的安装过程需要用户进行交互,所以会出现问题。
解决方案:在dockerfile中加入下面两句话:

ENV DEBIAN_FRONTEND=noninteractive #关闭交互功能apt-get install -y xxx #-y表示所有的交互都是选择默认的选项,xxx为需要安装的包名

问题3:dockerfile运行apt-get install golang时报错,显示Undefined:any

开发环境为golang1.21.3,但是是用apt-get install golang默认下载的版本小于golang1.18,,而any关键字是golang1.18以后才引入的关键字,所以会没法编译。
解决方案:不使用apt-get install golang安装,更换下面的方式

#指定版本安装golang
RUN apt-get update && apt-get install -y wget && \wget https://mirrors.aliyun.com/golang/go1.21.3.linux-amd64.tar.gz && \tar -C /usr/local -xzf go1.21.3.linux-amd64.tar.gz && \rm go1.21.3.linux-amd64.tar.gz# 设置Go的环境变量
ENV PATH=$PATH:/usr/local/go/bin

问题4:开启容器后,使用Ubuntu访问容器端口,发现连接被重置(等于容器的端口连不上)。

这里涉及到了2个知识,
第一个知识是,容器默认的网络模式是桥接,即容器内部具有独立的IP地址,通过0.0.0.0IP对外提供服务。所以,如果程序内部原来通过127.0.0.1:8888的方式对其他容器或者主机提供服务,那么需要改为0.0.0.0:8888。如果主机想要通过127.0.0.1::8888访问容器,需要更改docker run语句如下:

docker run -d -p 127.0.0.1:8888:8888 <image_name>

这里说明了端口映射,将容器的0.0.0.0::8888端口映射到主机的127.0.0.1:8888端口。
第二个知识是防火墙有可能会拦截请求,最好把Ubuntu的防火墙关了。

#关闭防火墙服务
sudo systemctl stop ufw.service#检查防护墙服务是否关闭
sudo ufw status

我试了前面两个办法都不行,只能上大招,重启容器的网卡服务。

systemctl stop docker # 停止docker 服务
pkill docker # 杀掉docker进程
iptables -t nat -F # 清理iptables
ip link set docker0 down # 停止docker0网卡
brctl delbr docker0 # 删除docker0网卡--重点!
systemctl start docker # 启动docker服务

问题5:上述方法可以实现容器与主机的通信,但是容器之间的通信还需要获取到容器的IP地址才可以实现

但是我在本地编写的代码,都是用的127.0.0.1:xxxx的格式进行通讯,现在突然要换为容器的IP地址进行通讯,又需要更改代码,所以我采用了其他方式,将容器的网络模式更换为host模型,即与主机共享同一个IP空间。

最终的dockerfile

# 使用指定的基础镜像
FROM ubuntu:20.04ENV DEBIAN_FRONTEND=noninteractive# 换为清华源
# RUN sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.listRUN apt-get update && apt-get install -y gcc gitRUN apt-get update && apt-get install -y wget && \wget https://mirrors.aliyun.com/golang/go1.21.3.linux-amd64.tar.gz && \tar -C /usr/local -xzf go1.21.3.linux-amd64.tar.gz && \rm go1.21.3.linux-amd64.tar.gz# 设置Go的环境变量
ENV PATH=$PATH:/usr/local/go/bin# 创建工作目录并拷贝你的 Go 项目代码到容器中
WORKDIR /Cache
COPY . /Cache# 构建Go项目
RUN go build -o server2# 暴露应用程序所使用的端口
EXPOSE 9528
EXPOSE 8766# 定义容器启动命令,这里假设你的Go项目生成了一个名为server1的可执行文件
CMD ["./server2"]

最终的docker-compose.yml

version: '3'services:service1:build: ./server1network_mode: "host"service2:build: ./server2network_mode: "host"service3:build: ./server3network_mode: "host"

相关文章:

dockerfile避坑笔记(VMWare下使用Ubuntu在Ubuntu20.04基础镜像下docker打包多个go项目)

一、docker简介 docker是一种方便跨平台迁移应用的程序&#xff0c;通过docker可以实现在同一类操作系统中&#xff0c;如Ubuntu和RedHat两个linux操作系统中&#xff0c;实现程序的跨平台部署。比如我在Ubuntu中打包了一个go项目的docker镜像&#xff08;镜像为二进制文件&am…...

Qt 使用QtXlsx操作Excel表

1.环境搭建 QtXlsx是一个用于读写Microsoft Excel文件&#xff08;.xlsx&#xff09;的Qt库。它提供了一组简单易用的API&#xff0c;可以方便地处理电子表格数据。 Github下载&#xff1a;GitHub - dbzhang800/QtXlsxWriter: .xlsx file reader and writer for Qt5 官方文档…...

canal+es+kibana+springboot

1、环境准备 服务器&#xff1a;Centos7 Jdk版本&#xff1a;1.8 Mysql版本&#xff1a;5.7.44 Canal版本&#xff1a;1.17 Es版本&#xff1a;7.12.1 kibana版本&#xff1a;7.12.1 软件包下载地址&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1jRpCJP0-hr9aI…...

【力扣】面试经典150题——双指针

文章目录 125. 验证回文串392. 判断子序列167. 两数之和 II - 输入有序数组11. 盛最多水的容器15. 三数之和 125. 验证回文串 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字…...

6-8 最宽层次结点数 分数 10

文章目录 1.题目描述2.本题ac答案2.1法一: 代码复用2.2法二: 顺序队列实现层序遍历 3.C层序遍历求最大宽度3.1层序遍历代码3.2求最大宽度 1.题目描述 2.本题ac答案 2.1法一: 代码复用 //二叉树第i层结点个数 int LevelNodeCount(BiTree T, int i) {if (T NULL || i < 1)re…...

Linux学习第28天:Platform设备驱动开发(二): 专注与分散

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 三、硬件原理图分析 四、驱动开发 1、platform设备与驱动程序开发 53 /* 54 * 设备资源信息&#xff0c;也就是 LED0 所使用的所有寄存器 55 */ 56 static str…...

postgresql数组重叠(有共同元素)查询

直接上最终代码&#xff1a; select distinct id from a where string_to_array(in_area,,) && (select ARRAY_AGG( code) from areas where code like 11% or code 100000)::TEXT[] pg语法&#xff1a; 表 9.48显示了可用于数组类型的运算符。 表 9.48。数组运算符…...

ubuntu系统 生成RSA密钥对

在Ubuntu系统上生成密钥对通常指的是生成SSH密钥对&#xff0c;它常用于安全的远程登录、数据通信和其他安全网络操作。以下是如何在Ubuntu系统上生成SSH密钥对的步骤&#xff1a; 打开终端&#xff1a;你可以使用快捷键 Ctrl Alt T 在Ubuntu上打开一个终端窗口。 运行ssh-k…...

【RtpSeqNumOnlyRefFinder】webrtc m98: ManageFrameInternal 的帧决策过程分析

Jitterbuffer(FrameBuffer)需要组帧以后GOP内的参考关系 JeffreyLau 大神分析 了组帧原理而参考关系(RtpFrameReferenceFinder)的生成伴随了帧决策 FrameDecisionFrameDecision 影响力 帧的缓存。调用 OnAssembledFrame 传递已经拿到的RtpFrameObject 那么,RtpFrameObject…...

centos系统源码编译安装nginx,并编写服务脚本

1.安装编译所需的依赖项&#xff1a; yum install -y gcc pcre-devel openssl-devel zlib-devel2.下载 Nginx 源代码&#xff1a; wget http://nginx.org/download/nginx-1.21.3.tar.gz tar -xf nginx-1.21.3.tar.gz cd nginx-1.21.33.配置编译选项并进行编译和安装&#xff…...

2023下半年软考高项答题技巧!

2023下半年软考倒计时最后一天&#xff0c;一些软考高项答题技巧分享&#xff01; 高项答题技巧 1、综合知识 &#xff08;1&#xff09;首先是分析试题的技巧 –先看清楚问题&#xff0c;再看选项&#xff1b; –判断题目到底考察的是什么知识点&#xff0c;排除干扰项。…...

windows server 2016调优

1. 增加TCP连接的最大数量&#xff1a; 在您当前的注册表路径&#xff08;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters&#xff09;中的右侧窗格&#xff0c;右击空白处&#xff0c;选择“新建” -> “DWORD (32位) 值”。为新的值命名为TcpNu…...

Qt 插件开发详解

1.简介 Qt插件是一种扩展机制&#xff0c;用于将应用程序的功能模块化&#xff0c;并且可以在运行时动态加载和卸载。Qt框架为插件提供了一套标准的接口和管理机制&#xff0c;使得插件的使用和集成变得简单和灵活&#xff0c;通过插件机制&#xff0c;可以将应用程序的功能划…...

vue需求:实现签章/签字在页面上自由定位的功能(本质:元素在页面上的拖拽)

目录 第一章 效果展示 第二章 了解工具 2.1 draggable 2.1.1 了解draggable 2.1.2 draggable方法 2.1.3 利用例子理解方法 第三章 效果实现 3.1 实现思路 3.2 代码实现 3.2.1 涉及到的点 3.2.2 源代 第一章 效果展示 效果描述&#xff1a;通过点击左边栏的签名和…...

【深度学习基础】Pytorch框架CV开发(1)基础铺垫

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

uniapp原生插件之安卓热敏打印机打印插件

插件介绍 安卓热敏打印机打印插件&#xff0c;自动授权&#xff0c;打印机连接监听&#xff0c;打印文本&#xff0c;条形码&#xff0c;二维码&#xff0c;切纸&#xff0c;打印机状态&#xff0c;打印结果查询等 插件地址 安卓热敏打印机打印插件 - DCloud 插件市场 超级…...

巴菲特:卖比亚迪有助于资金配置

巴菲特表示&#xff0c;未来可能会有更多银行倒闭&#xff0c;但储户不必担心&#xff0c;他警告说&#xff0c;陷入困境的银行股不是价值投资&#xff0c;因为即使政府采取行动保护储户&#xff0c;股东的权益也会受到损失。他称&#xff0c;将加大对日本综合商社的投资&#…...

香港服务器有哪些特点

香港服务器具有以下特点&#xff1a; 速度快&#xff1a;香港服务器地理位置优越&#xff0c;与内地服务器相比&#xff0c;网络延迟更低&#xff0c;访问速度更快。 稳定性高&#xff1a;香港服务器位于全球重要的金融中心&#xff0c;网络环境稳定&#xff0c;服务器稳定性高…...

Leetcode76最小覆盖子串

思路&#xff1a;滑动窗口思想 1. 滑动窗口是什么&#xff1a;用一个滑动窗口为覆盖目标子串的字符串 2.怎么移动窗口&#xff1a;当不满足覆盖时右指针移动扩大范围&#xff0c;当覆盖了就移动左指针缩减范围直到再次不覆盖 3. 怎么判断是否覆盖&#xff1a;这里使用两个哈…...

GD32 单片机 硬件I2C死锁解决方法

死锁的复现方式 在I2C恢复函数下个断点&#xff08;检测到I2C多次超时之后&#xff0c;应该能跳转到I2C恢复函数&#xff09;使用镊子&#xff0c;将SCL与SDA短接&#xff0c;很快就能看到程序停到恢复函数的断点上&#xff0c;此时再执行恢复函数&#xff0c;看能否正常走出&…...

​源码级赋能:基于Spring Boot/Vue的企业级AI视频平台二次开发实战与架构解析(GB28181/边缘计算/算法商城)

引言&#xff1a;从“黑盒采购”到“源码可控”的行业变革 在安防集成商和技术决策者的会议室里&#xff0c;有一个共识正在形成&#xff1a;“黑盒软件”正在成为企业数字化转型的枷锁。 传统的视频监控软件往往依赖特定的硬件锁&#xff08;Key&#xff09;或封闭的API&…...

SeqGPT-560M金融信贷申请:申请人/收入证明/抵押物/授信额度结构化

SeqGPT-560M金融信贷申请&#xff1a;申请人/收入证明/抵押物/授信额度结构化 1. 项目概述 SeqGPT-560M是一个专门针对金融信贷场景深度优化的智能信息抽取系统。与通用聊天模型不同&#xff0c;这个系统专注于从复杂的非结构化文本中精准提取关键金融信息&#xff0c;特别适…...

墨语灵犀模型压缩与量化教程:降低部署资源消耗

墨语灵犀模型压缩与量化教程&#xff1a;降低部署资源消耗 你是不是也遇到过这种情况&#xff1a;好不容易找到一个效果不错的开源大模型&#xff0c;比如墨语灵犀&#xff0c;兴致勃勃地想部署到自己的服务器上试试&#xff0c;结果一看显存要求&#xff0c;直接傻眼了——动…...

收藏!小白程序员必备:从零入门大模型,抢占职场新风口(含学习资源包)

收藏&#xff01;小白程序员必备&#xff1a;从零入门大模型&#xff0c;抢占职场新风口&#xff08;含学习资源包&#xff09; CB Insights报告显示&#xff0c;AI智能体市场正爆发式增长&#xff0c;2024年融资达38亿美元。市场分为基础设施、通用应用和垂直应用三大板块&…...

【obs studio】从零开始:高效录制屏幕与声音的完整指南

1. 为什么选择OBS Studio录制屏幕与声音&#xff1f; 如果你正在寻找一款免费、开源且功能强大的屏幕录制工具&#xff0c;OBS Studio绝对是你的不二之选。我最初接触这款软件是因为需要录制一些技术教程&#xff0c;试过市面上不少付费软件后&#xff0c;发现OBS Studio不仅完…...

Ostrakon-VL-8B智能代理(Agent)实践:自动化巡检餐厅后厨

Ostrakon-VL-8B智能代理实践&#xff1a;自动化巡检餐厅后厨 你有没有想过&#xff0c;如果餐厅后厨能有一个不知疲倦、眼力超群的“数字监工”&#xff0c;每天自动检查安全隐患和操作规范&#xff0c;那会是什么场景&#xff1f;过去&#xff0c;这可能需要一个经验丰富的厨…...

ComfyUI自定义节点开发指南:从零构建你的专属AI工具链

1. 为什么需要自定义ComfyUI节点&#xff1f; 第一次用ComfyUI做AI绘画时&#xff0c;我就被它灵活的节点式操作吸引了。但用着用着发现一个问题&#xff1a;官方提供的节点虽然强大&#xff0c;但总有些特殊需求无法满足。比如想给生成的图片自动打水印、批量处理文件夹里的图…...

终极指南:如何利用MMKV在电商应用中实现高并发存储优化

终极指南&#xff1a;如何利用MMKV在电商应用中实现高并发存储优化 【免费下载链接】MMKV Tencent/MMKV: MMKV 是一个高效的键值对存储库&#xff0c;用于 Android 和 iOS 应用程序&#xff0c;具有高速&#xff0c;紧凑和易用的特点。 项目地址: https://gitcode.com/gh_mir…...

OpenClaw多任务调度:nanobot并行处理邮件与文件整理

OpenClaw多任务调度&#xff1a;nanobot并行处理邮件与文件整理 1. 为什么需要多任务调度 当我第一次尝试用OpenClaw自动化处理日常工作流时&#xff0c;遇到了一个典型问题&#xff1a;当同时需要监控邮件和处理大文件时&#xff0c;系统资源会被单一任务占满。比如在整理几…...

如何快速掌握React Email Editor:深入理解拖拽邮件编辑器的实现原理

如何快速掌握React Email Editor&#xff1a;深入理解拖拽邮件编辑器的实现原理 【免费下载链接】react-email-editor Drag-n-Drop Email Editor Component for React.js 项目地址: https://gitcode.com/gh_mirrors/re/react-email-editor React Email Editor是一个功能…...