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

这篇具有很好参考价值的文章主要介绍了dockerfile避坑笔记(VMWare下使用Ubuntu在Ubuntu20.04基础镜像下docker打包多个go项目)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、docker简介

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

二、dockerfile编写

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

FROM ***(指定基础镜像,即这个镜像在哪个操作系统下面运行)
#示例:FROM  Ubuntu:20.04

MAINTAINER ***(指定维护者信息,选填)
#示例:MAINTAINER Tom

LABEL ***(docker build的启动入口,可以不写)
#示例:LABEL helloworld

RUN ***(docker build时需要执行的命令,为shell指令)
#RUN git clone github.com/xxxx.git

ADD/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空间。文章来源地址https://www.toymoban.com/news/detail-745356.html

最终的dockerfile

# 使用指定的基础镜像
FROM ubuntu:20.04

ENV DEBIAN_FRONTEND=noninteractive

# 换为清华源
# RUN sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list

RUN apt-get update && apt-get install -y gcc git

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

# 创建工作目录并拷贝你的 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: ./server1
    network_mode: "host"

  service2:
    build: ./server2
    network_mode: "host"

  service3:
    build: ./server3
    network_mode: "host"

到了这里,关于dockerfile避坑笔记(VMWare下使用Ubuntu在Ubuntu20.04基础镜像下docker打包多个go项目)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Ubuntu】在VMWare虚拟机中安装Ubuntu20.04【教程】

    具体的安装方法,可以参考这一篇博客,这里就不详细介绍了 在指向的链接中,直接下载Ubuntu最新的长期支持版本的 .iso 文件。下载地址 直接选择下载即可,注意一定要保存到一个自己能找到的位置。 首先,打开安装好的VMWare,点击创建虚拟机 然后,选择典型,进行下一步

    2024年02月15日
    浏览(34)
  • 本人亲测树莓派4B ubuntu20.04server连接wifi 设置wifi静态ip 连接Xshell 详细避坑

    镜像安装 网上有很多教程,注意的是我安装20.04MATE版时会出现安装系统崩溃的情况,而安装server版本则不会。 我的显示器是24寸,在连接显示器时需要在usercfg.txt中键入如下命令: 显示屏不显示很可能是因为 接触不良 !!!在连接显示器时大家记得把树莓派以引脚面向上的

    2024年02月08日
    浏览(33)
  • 【一生一芯】Chap.1 “一生一芯”实验环境配置| VMware安装Ubuntu20.04 | PA工程配置 | 解决llvm版本问题

    前言:搞环境搞了三个晚上,解决了llvm的问题,成功下载“一生一芯”框架代码即南大计算机PA,成功编译运行。 PA0 - 世界诞生的前夜: 开发环境配置 PA0的讲解实验讲义   PA:(Programming Assignment)。是一个小型项目,来自于南京大学计算机科学与技术系《计算机系统基础课程

    2023年04月24日
    浏览(32)
  • Docker笔记--Ubuntu20.04安装Nvidia-Docker

    目录 1--添加软件包存储库 2--安装Nvidia-Docker2 3--测试         安装 nvidia-docker2 软件包并重新加载 docker 守护程序配置:         执行 sudo apt-get install -y nvidia-docker2,可能会出现以下错误:E: Unable to locate package nvidia-docker2,解决方法是完整执行完第 1 步;         重启

    2024年02月16日
    浏览(31)
  • Ubuntu20.04点Ubuntu software没反应,打不开的解决方案(Ubuntu笔记)

    首先检查Ubuntu Software的状态,在终端输入:systemctl status snap.ubuntu-software.ubuntu-software.service 如果状态显示为inactive,则需要启动snap.ubuntu-software.ubuntu-software.service,在终端输入:sudo systemctl start snap.ubuntu-software.ubuntu-software.service 如果状态显示为active,则需要重新启动snap.ubuntu-

    2024年02月10日
    浏览(26)
  • Ubuntu:18.04/20.04使用netplan设置网络

    通常,Ubuntu的默认设置是通过DHCP服务器自动获取IP地址,这对台式机系统来说非常有用,因为它不需要任何更改。 但是,始终建议为Ubuntu服务器分配一个静态IP地址,因为该静态IP地址将在重新启动后保持不变。 Ubuntu 17.10及更高版本使用“Netplan”作为默认网络管理工具。因此

    2024年02月05日
    浏览(35)
  • Ubuntu 20.04 实时查看GPU使用情况

    使用两种方法,实时查看 GPU 使用情况;彻底杀死制定进程 使用终端命令 nvidia-smi 查看显卡信息 如果你想实时检测显卡使用情况,添加 watch -n 即可 其中,4 是指 4 秒刷新一次终端,可以根据自己的需求设置 安装过程很简单,直接 pip 即可(本人是这样),使用 gpustat --json 以

    2024年02月13日
    浏览(39)
  • Ubuntu 20.04 上安装和使用 Docker

    Ubuntu 20.04 上安装和使用 Docker 在 Ubuntu 上安装 Docker 非常直接。我们将会启用 Docker 软件源,导入 GPG key,并且安装软件包。 首先,更新软件包索引,并且安装必要的依赖软件,来添加一个新的 HTTPS 软件源: 使用下面的 curl 导入源仓库的 GPG key: 将 Docker APT 软件源添加到你的

    2024年02月03日
    浏览(42)
  • 【Ubuntu20.04】使用 systemd 进行服务部署

    ExecStart,改成自己脚本的路径,比如程序启动脚本 Restart,异常重启 RestartSec,异常后多少秒后重启 StartLimitInterval,异常后重试多少次,0 一直重试 将上述文件命名为 your_app.serivce ,放入 /etc/systemd/system 目录下 比如,你的服务名称叫 your_app 服务启用 服务启动 服务重新启动

    2024年04月25日
    浏览(25)
  • 笔记--Ubuntu20.04安装Nvidia驱动、CUDA Toolkit和CUDA CuDNN

    目录 1--安装Nvidia驱动 2--安装CUDA 2-1--禁用nouveau 2-2--选择CUDA Toolkit 2-3--下载和安装CUDA Toolkit 2-4--配置环境变量 2-5--测试是否安装成功: 3--安装CUDA CuDNN 4--测试pytorch能否使用Cuda ① 查看可安装的Nvidia驱动版本: ② 安装相应版本的Nvidia驱动: 博主这里选择的是第一个,也可以安

    2024年02月02日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包