docker-01 创建一个自己的镜像并运行容器

news2024/9/20 16:44:25

docker-01 创建一个自己的镜像并运行容器

前言

我们都知道使用Docker的镜像可以快速创建和部署应用,大大的节约了部署的时间。并且Docker 的镜像提供了除内核外完整的运行时环境,确保代码的环境一致性,从而不会在出现这段代码在我机器上没问题这类问题。

但是如果我们想创建一个镜像来运行自己的应用,该怎么做呢?我们在这里进行一个简单的尝试。

1、准备工作

  • 首先我们要准备一个Linux环境,这里我使用的是Ubuntu 20.04。
  • 其次,我们需要安装好Docker。可以通过docker info命令查看当前操作系统中是否安装了docker。
  • 通过vscode连接到Linux环境,并安装好Go语言。

2、编写测试应用

我们创建一个文件夹docker-test,用来编写测试应用。

首先进行初始化,在当前的docker-test目录下执行go mod init docker-test命令,创建go.mod文件。

然后,创建一个main.go文件,内容如下:

package main

import (
	"fmt"
	"time"
)

func main() {
	for {
		fmt.Println("Hello, world!")
		time.Sleep(10 * time.Second)
	}
}

这个文件只会每隔10秒输出一次"Hello, world!"。

为了在容器中可以编译运行Go语言程序,我们需要下载一个Go 官方提供的预装 Go 编译器的 Docker 镜像。

执行docker pull golang:latest命令,下载golang镜像。

使用docker images,查看当前系统中已经下载的镜像。

在这里插入图片描述

出现,golang:latest镜像,说明已经成功下载了golang:latest镜像。

3、构建镜像,并运行容器

3.1 构建镜像

现在我们已经准备好了测试应用,可以开始构建镜像了。
我们需要在当前docker-test目录下创建一个Dockerfile文件,用于构建镜像,内容如下:

# 使用官方 Go 镜像作为基础镜像
FROM golang:latest

# 设置工作目录
WORKDIR /app

#将当前目录下的所有文件复制到镜像的工作目录中
COPY .  .
 
# 构建 Go 应用
RUN go build -o main main.go

# 运行可执行文件

# 运行 go 程序,(CMD:在启动容器时才执行此行。RUN:构建镜像时就执行此行)
CMD ["./main"]

这个Dockerfile文件中,我们使用golang:latest作为基础镜像,设置工作目录为/app,将当前目录下的所有文件复制到镜像的工作目录中,构建Go应用,并运行可执行文件。

执行docker build -t docker-test:latest . 命令,构建镜像。

其中,docker-test 是镜像的名称。latest 是镜像的标签(tag)。如果不指定 -t 选项,则 Docker 会为镜像分配一个默认的无标签状态。

标签帮助我们管理不同版本的镜像。例如,可以有 docker-test:1.0, docker-test:2.0 等版本。latest表示最新版本。

最后的. 表示构建上下文路径,构建镜像时,默认会在上下文路径中查找名为 Dockerfile 的文件,并依据这个文件来构建镜像。如果你想依据其他文件来构建镜像,或者Dockerfile在其他路径下,你可以用 -f 选项来指定 Dockerfile 的路径。

执行完成之后,再次运行docker images命令,可以看到我们新构建的镜像 docker-test:lastest。

在这里插入图片描述

3.2 运行容器

现在,我们已经构建好了镜像,可以运行容器了。

执行docker run -d -it --name docker-test docker-test:latest命令,运行容器。

其中:

  • -d: 后台运行容器
  • -it: 交互式运行容器,进入容器后可以输入命令
  • –name: 为容器指定一个名称
  • docker-test:latest: 运行的镜像名称

执行完成之后,运行docker ps命令,可以看到我们新运行的容器,容器的名称为docker-test。
在这里插入图片描述

3.3 进入容器,查看效果

容器运行成功后,我们可以通过docker logs docker-test命令查看容器的日志。
在这里插入图片描述

可以看到,容器已经打印出多次"Hello, world!"。

也可以通过docker attache查看实时打印的消息。

执行docker exec -it docker-test /bin/bash命令,进入容器。

发现容器已经进入容器的/app目录,即我们在 Dockerfile中设置的工作目录
执行ls -l命令,可以看到 docker-test 目录下的所有文件已经成功复制到镜像的工作目录中。

在这里插入图片描述

4、总结

本文介绍了如何创建自己的镜像并运行容器,通过这个例子,我们可以更加熟悉Dockerfile的编写,以及Docker镜像的相关操作。
文章参考了docker从安装到部署项目,一篇文章教会你。想要学习更多docker知识的小伙伴可以移步大佬的文章。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通过mxGraph在ARMxy边缘计算网关上实现工业物联网

在当今的工业4.0时代,工业物联网(IIoT)已经成为制造业转型升级的关键技术之一。ARMxy边缘计算网关作为工业自动化和物联网的重要组成部分,能够为工厂车间提供实时的数据处理能力和智能化服务。而mxGraph作为一种流行的JavaScript库…

ABB的IO板卡配置

ABB的IO板卡配置 标准IO板卡DSQC651IO板卡的配置数字量输入信号配置数字量输出信号配置组合输入信号配置组合输出信号配置模拟量输出信号配置 标准IO板卡DSQC651 DSQC651可以处理8路输入数字量,8路输出数字量和2路模拟量输出信号。 X1是数字量输出,接线…

agentuniverse快速开始和踩坑

https://github.com/alipay/agentUniverse/tree/mastergithub地址:https://github.com/alipay/agentUniverse/tree/master 老大看了演示demo也想跟着做个agent工具,但踩坑太多,含泪写下博客 前置环节 git clone https://github.com/alipay/agentUniverse.git conda create -n…

轻松发高分的好思路:GNN+时间序列预测!新SOTA效率翻了5倍

在时序预测领域,通过合理构建和应用图结构,GNN能有效捕捉时空数据中的复杂依赖关系,轻松提高预测的准确性。因此GNN时序预测在学术界和工业界都广受欢迎。 最近这个方向出现了很多效果很好的研究,比如GraFITi模型,利用…

[AHK]Listbox with incremental search

可以根据文本框中的输入内容,实时动态从列表中搜索并定位所搜索内容。 AHK V1代码 #Requires AutoHotkey v1.0 Gui Add, Edit, w300 h20 vsearchedString gIncrementalSearch Gui Add, ListBox, vchoice gListBoxClick w300 h250 hscroll vscroll Gui Add, Button, …

Excel怎么截图?快速捕捉工作表的多种方法

大家好,这里是效率办公指南! 📸 在日常工作中,我们经常需要对Excel工作表进行截图,无论是为了记录数据、制作演示还是进行数据对比。今天,我们就来学习几种在Excel中截图的方法以及它们的快捷键。 一、使…

迈向智能制造:数字化转型的核心策略与实践

在全球经济不断变革的背景下,制造业正迎来一场深刻的数字化变革。随着技术的快速进步,特别是工业4.0概念的普及,制造企业正在向智能制造方向转型。 智能制造是通过数字化技术的集成和应用,全面提升制造过程的自动化、信息化和智能…

Java项目: 基于SpringBoot+mybatis+maven新闻推荐系统(含源码+数据库+毕业论文)

一、项目简介 本项目是一套基于SpringBootmybatismaven新闻推荐系统 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美观、操作简单、…

信息安全数学基础(6)整除的进一步性质

1. 传递性 如果 a 能被 b 整除,且 b 能被 c 整除(记作 a∣b 和 b∣c),则 a 能被 c 整除(记作 a∣c)。 2. 线性组合 如果 a∣b 且 a∣c,则对于任意整数 x 和 y,都有 a∣(bxcy)。这个性…

Vue2踩坑记录 - el-input无法接收键盘输入,对响应式对象的深入理解-对象和数组的响应式

今天发现,某对话框打开后,其中的input无法接收键盘输入,我在页面上劈里啪啦敲了一堆,页面输入框空空如也,的确是用了v-model来实现双向绑定。但是显然,它没有实现双向数据传输。那么,双向数据传…

JMeter在Mac下的安装使用

目录 Mac OS Jmeter安装运行1、Jmeter下载2、运行Jmeter3、编写或导入脚本 前言 开发过程中需要对系统进行性能测试,可以选用jemter对接口进行压测,jemter优点如下: 开源许可证:Jmeter完全免费,允许开发者使用源代码…

SM7015非隔离电磁炉/电饭煲电源芯片12V/18V输出

SM7015特点: 拓扑结构支持:低成本 BUCK、BUCK-BOOST 等方案 采用 730V 单芯片集成工艺 85Vac~265Vac 宽电压输入 待机功耗小于 120mW220Vac 集成高压启动电路 集成高压功率开关 60KHz 固定开关频率 内置抖频技术,提升 EMC 性能 电流模式 PWM…

使用designer.exe实现设计ui界面(以及解决遇到的问题)

引言: 若自己构想一个简洁的页面,有个布局的草图,且使用python实现,似乎是可行的,但是若对于比较复杂的界面,且不说每个模块在布局中所在的位置,再说每个模块所对应的功能以及程序的实现,都会是十分繁杂的任务。所以此时就需要寻找更加直观的设计方法。 其实python中的…

指针之旅(5)—— 万能指针与回调函数的搭配:万能排序qsort函数的使用规则及其模拟实现。

目录 1. 回顾:万能指针void* 与 回调函数 的特性 1.1 万能指针void* 1.2 回调函数 2. qsort函数的使用规则 2.1 qsort的头文件和排序方向 2.2 qsort的函数参数表解析 2.3 结构体数组排序举例 3. 冒泡排序模拟万能排序qsort的实现 3.1 冒泡排序的回顾与疑问…

前端自定义下载文件名

data数据格式如下 "data": [{"createBy": "system","createTime": "2024-09-11 14:08:56","updateBy": "","updateTime": null,"beginTime": null,"endTime": null,&qu…

18068 选择排序

### 思路 1. **初始化**:定义变量i, j, k和临时变量tmp。 2. **外层循环**:遍历数组的每个元素,i从0到n-2。 3. **内层循环**:从i1到n-1,找到最小元素的索引k。 4. **交换**:将最小元素与当前元素交换。 #…

源码安装python3.10.8后pip3无法使用问题

一、背景: CentOS7.7上默认已经存在python2.7,但需要python3,所以计划源码安装python3。 下载python3.10.8 wget https://www.python.org/ftp/python/3.10.8/Python-3.10.8.tgz 二、编译安装 安装用户为普通linux用户,拥有sudo权…

实战案例(2)防火墙+二交换机VLAN组网

案例二:防火墙充当三层交换机与路由器角色功能进行组网 拿到这样的拓扑后,首先要了解好客户的需求,然后根据需求进行划分 比如客户那边有监控跟办公网络,可以通过VLAN划分不同的区域,然后二层交换机对接终端的口划入到…

C++中的I/O流

本节主要看代码理解 I/O流继承关系 iostream 主要类 cin cout cerr clog while(cin>>str) { //处理 } 当接收ctrl z 或 ctrl c时,会停止, 原理:重载操作符bool,令指定istr…

python学习——对无人机影像有RGB转换到HSV

问题描述 最近需要对无人机影像中绿色植被信息进行提取,查看相关论文,发现用的比较多的就是HSV色彩转换方法,动手实践一下。 解决思路 #mermaid-svg-5ejGodIusPv6zFVS {font-family:"trebuchet ms",verdana,arial,sans-serif;fon…