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是一种方便跨平台迁移应用的程序,通过docker可以实现在同一类操作系统中,如Ubuntu和RedHat两个linux操作系统中,实现程序的跨平台部署。比如我在Ubuntu中打包了一个go项目的docker镜像(镜像为二进制文件&am…...
Qt 使用QtXlsx操作Excel表
1.环境搭建 QtXlsx是一个用于读写Microsoft Excel文件(.xlsx)的Qt库。它提供了一组简单易用的API,可以方便地处理电子表格数据。 Github下载:GitHub - dbzhang800/QtXlsxWriter: .xlsx file reader and writer for Qt5 官方文档…...
canal+es+kibana+springboot
1、环境准备 服务器:Centos7 Jdk版本:1.8 Mysql版本:5.7.44 Canal版本:1.17 Es版本:7.12.1 kibana版本:7.12.1 软件包下载地址:链接:https://pan.baidu.com/s/1jRpCJP0-hr9aI…...
【力扣】面试经典150题——双指针
文章目录 125. 验证回文串392. 判断子序列167. 两数之和 II - 输入有序数组11. 盛最多水的容器15. 三数之和 125. 验证回文串 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字…...
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 * 设备资源信息,也就是 LED0 所使用的所有寄存器 55 */ 56 static str…...
postgresql数组重叠(有共同元素)查询
直接上最终代码: 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语法: 表 9.48显示了可用于数组类型的运算符。 表 9.48。数组运算符…...
ubuntu系统 生成RSA密钥对
在Ubuntu系统上生成密钥对通常指的是生成SSH密钥对,它常用于安全的远程登录、数据通信和其他安全网络操作。以下是如何在Ubuntu系统上生成SSH密钥对的步骤: 打开终端:你可以使用快捷键 Ctrl Alt T 在Ubuntu上打开一个终端窗口。 运行ssh-k…...
【RtpSeqNumOnlyRefFinder】webrtc m98: ManageFrameInternal 的帧决策过程分析
Jitterbuffer(FrameBuffer)需要组帧以后GOP内的参考关系 JeffreyLau 大神分析 了组帧原理而参考关系(RtpFrameReferenceFinder)的生成伴随了帧决策 FrameDecisionFrameDecision 影响力 帧的缓存。调用 OnAssembledFrame 传递已经拿到的RtpFrameObject 那么,RtpFrameObject…...
centos系统源码编译安装nginx,并编写服务脚本
1.安装编译所需的依赖项: yum install -y gcc pcre-devel openssl-devel zlib-devel2.下载 Nginx 源代码: wget http://nginx.org/download/nginx-1.21.3.tar.gz tar -xf nginx-1.21.3.tar.gz cd nginx-1.21.33.配置编译选项并进行编译和安装ÿ…...
2023下半年软考高项答题技巧!
2023下半年软考倒计时最后一天,一些软考高项答题技巧分享! 高项答题技巧 1、综合知识 (1)首先是分析试题的技巧 –先看清楚问题,再看选项; –判断题目到底考察的是什么知识点,排除干扰项。…...
windows server 2016调优
1. 增加TCP连接的最大数量: 在您当前的注册表路径(HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters)中的右侧窗格,右击空白处,选择“新建” -> “DWORD (32位) 值”。为新的值命名为TcpNu…...
Qt 插件开发详解
1.简介 Qt插件是一种扩展机制,用于将应用程序的功能模块化,并且可以在运行时动态加载和卸载。Qt框架为插件提供了一套标准的接口和管理机制,使得插件的使用和集成变得简单和灵活,通过插件机制,可以将应用程序的功能划…...
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 源代 第一章 效果展示 效果描述:通过点击左边栏的签名和…...
【深度学习基础】Pytorch框架CV开发(1)基础铺垫
📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍…...
uniapp原生插件之安卓热敏打印机打印插件
插件介绍 安卓热敏打印机打印插件,自动授权,打印机连接监听,打印文本,条形码,二维码,切纸,打印机状态,打印结果查询等 插件地址 安卓热敏打印机打印插件 - DCloud 插件市场 超级…...
巴菲特:卖比亚迪有助于资金配置
巴菲特表示,未来可能会有更多银行倒闭,但储户不必担心,他警告说,陷入困境的银行股不是价值投资,因为即使政府采取行动保护储户,股东的权益也会受到损失。他称,将加大对日本综合商社的投资&#…...
香港服务器有哪些特点
香港服务器具有以下特点: 速度快:香港服务器地理位置优越,与内地服务器相比,网络延迟更低,访问速度更快。 稳定性高:香港服务器位于全球重要的金融中心,网络环境稳定,服务器稳定性高…...
Leetcode76最小覆盖子串
思路:滑动窗口思想 1. 滑动窗口是什么:用一个滑动窗口为覆盖目标子串的字符串 2.怎么移动窗口:当不满足覆盖时右指针移动扩大范围,当覆盖了就移动左指针缩减范围直到再次不覆盖 3. 怎么判断是否覆盖:这里使用两个哈…...
GD32 单片机 硬件I2C死锁解决方法
死锁的复现方式 在I2C恢复函数下个断点(检测到I2C多次超时之后,应该能跳转到I2C恢复函数)使用镊子,将SCL与SDA短接,很快就能看到程序停到恢复函数的断点上,此时再执行恢复函数,看能否正常走出&…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
