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

广州网站建设程序开发/广告优化师适合女生吗

广州网站建设程序开发,广告优化师适合女生吗,绵阳营销型网站建设,贵阳做网站的大公司前言 Github传送门 最近回忆起了在学校那会儿趣事:刚开始上数据库原理课程,一开始装Microsoft SQL Server,全班同学都在吐槽,怨声载道——这个说数据库咋启动不了,那个说数据库咋卸载不干净,个个焦头烂额…

前言

Github传送门

最近回忆起了在学校那会儿趣事:刚开始上数据库原理课程,一开始装Microsoft SQL Server,全班同学都在吐槽,怨声载道——这个说数据库咋启动不了,那个说数据库咋卸载不干净,个个焦头烂额,实在是好一番风景。唉,那时候就在想,要是有一个类似于软件管家的东西托管Microsoft SQL Server,让我们一键安装/卸载,可不就好了。

进入工业界,接触了运维方面的知识,才了解到docker的存在。不同于当年常用的虚拟机软件(VMWare WorkStation),docker并未对操作系统的硬件支撑做虚拟化,只是操作系统的进程,但却模拟了一个操作系统的环境,因此相对于虚拟机而言,docker更加轻量。轻量的运行环境意味着基于docker的部署,在管理与调度上会更加容易。看,kubernetes!

再回到我们的学习生活,拿MySQL为例吧——有了docker,安装卸载MySQL,就会变得无比容易。首先docker pull mysql;而后整理一下配置——通过-v映射数据在本地的存储路径,通过-p暴露出来mysql容器的端口,通过-e设置MySQL密码等环境变量;之后docker run带上上面的设置,我们的MySQL就启动了!要彻底卸载的话,只需要三行命令:docker stop ${MySQL容器ID}docker rm ${MySQL容器ID}docker image rm ${MySQL镜像ID},就ok了,是不是EZPZ?

正好,docker是基于Golang编写。因此本期从零单排,我们就用Golang来挑战一下如何与docker交互吧~

编写Golang程序部署MySQL

首先,我们研究一下相关的技术栈:官方提供的Golang客户端库docker client为Golang与docker间搭建了桥梁,其实质是对docker engine api的抽象;而docker engine api实质则是一个HTTP后端,是对docker内部镜像与容器管理功能的抽象。

通过docker client库,我们只需关心相关的参数输入。库中的方法会自动拼装参数,发送至docker engine api,从而实现交互。docker client的一些小例子,可以参考这里。

接下来,我们必须研究一下,要部署MySQL容器,需要有哪些步骤:

  • 登录docker hub
  • 拉取MySQL镜像
  • 设置参数,启动容器
  • 开启日志

这四个步骤,我们可以抽象成为四个func:

  • login
  • pullImage
  • runImage
  • logImage

那么我们的主func便是:

// 主线程的上下文
var ctx = context.Background()func LaunchMySQL() {log.Println("Creating docker client...")cli, err := client.NewEnvClient()if err != nil {log.Fatalf("Error while creating docker client! %s", err.Error())}defer closeClient(cli)login(cli)pullImage(cli)id := runImage(cli)logImage(cli, id)
}

四个步骤,我们分开来看:

登录

func login(cli *client.Client) {log.Println("Logging in docker registry...")ok, err := cli.RegistryLogin(ctx, types.AuthConfig{Username: "用户名",Password: "密码",})if err != nil {log.Fatalf("Error while logging in docker registry! %s", err.Error())}log.Printf("%s --- Token: %s\n", ok.Status, ok.IdentityToken)
}

采用RegistryLogin方法,即可登录docker hub,之后就免去认证的步骤了~

拉取镜像

func pullImage(cli *client.Client) {log.Println("Pulling MySQL Image...")reader, err := cli.ImagePull(ctx,"docker.io/library/mysql",types.ImagePullOptions{})if err != nil {log.Fatalf("Error while pulling image! %s", err.Error())}_, err = io.Copy(os.Stdout, reader)if err != nil {log.Fatalf(err.Error())}log.Println("Successfully pulled MySQL Image!")
}

拉取镜像步骤,需要指定镜像的完整存储位置:docker.io/library/mysql

启动容器

// create and start image
func runImage(cli *client.Client) string {log.Println("Running MySQL Image...")resp, err := cli.ContainerCreate(ctx,&container.Config{Image: "mysql:latest",Env: []string{"MYSQL_ROOT_PASSWORD", "123456"},},&container.HostConfig{PortBindings: nat.PortMap{"3306/tcp": []nat.PortBinding{{HostIP: "0.0.0.0",HostPort: "3306",},},},Mounts: []mount.Mount{{Type:   mount.TypeBind,Source: "E:\\Tools\\MySQL",Target: "/var/lib/mysql",},},},nil,"MySQLDB")if err != nil {log.Fatalf("Error while creating image! %s", err.Error())}log.Printf("Successfully created MySQL image: %s!\n", resp.ID)err = cli.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{})if err != nil {log.Fatalf("Error while starting image! %s", err.Error())}log.Println("Successfully ran MySQL image!")return resp.ID
}

基于镜像与配置,我们便可以启动一个容器

Config里,设置环境变量MYSQL_ROOT_PASSWORD123456,而后在HostConfig里,暴露3306端口(MySQL默认端口)到宿主机的3306端口,而后宿主机的E:\Tools\MySQL路径与容器里/var/lib/mysql路径绑定,这样mysql的数据就能在我们的本机(宿主机)持久化了

开启日志

func logImage(cli *client.Client, containerID string) {log.Println("Fetching log on MySQL container...")reader, err := cli.ContainerLogs(ctx, containerID, types.ContainerLogsOptions{ShowStdout:true,ShowStderr:true,Timestamps:true,Follow:true,Details:true,})if err != nil {log.Fatalf("Error while logging image! %s", err.Error())}_, err = io.Copy(os.Stdout, reader)if err != nil {log.Fatalf(err.Error())}
}

在日志选项中,把所有bool项开启,日志数据便更加细节了

总结

golang与docker交互的例子繁不胜数,但总归还要业务来决定使用哪些功能。

另外不得不说,在9102年的今天,修习技术的同学,带的电脑必须得有个docker。

http://www.lbrq.cn/news/1253485.html

相关文章:

  • 前端做网站框架/百度权重什么意思
  • 企业网站建设对网络营销的影响主要表现在( )/百度seo排名帝搜软件
  • 做装饰材料的网站/外贸网络营销推广
  • 网站建设課程/免费入驻的卖货平台
  • 网站开发课表查询/百度关键词排名十大排名
  • 郴州哪里做网站/长沙百度百科
  • wordpress获取分类文件/seo项目培训
  • 客户管理系统推荐/seo发外链工具
  • 安徽建设监理协会/品牌关键词优化
  • php网站制作过程中遇到的问题及解决办法/新产品推广方案怎么写
  • 命理网站开发/营销网站的建造步骤
  • 临桂区住房和城乡建设局门户网站/免费推广公司
  • 宝山网站建设哪家好/免费b2b推广网站大全
  • 门户网站开发多少钱/seo搜索优化是什么意思
  • web前端就业岗位/短视频seo营销系统
  • 浏览器禁止网站怎么做/百度浏览器极速版
  • 哪些网站用vue.js做的/自己怎么优化网站
  • 网站地址搜索/排名优化怎么做
  • 网站建设优化服务新闻/株洲网站设计外包首选
  • 网站开发工程师薪资待遇/投诉百度最有效的电话
  • 法律网站建设实施方案/推推蛙品牌策划
  • 企业网站搭建流程/360搜索引擎下载
  • 湛江做网站设计公司/百度官方网平台
  • 给用ps做的网站加div/今日热点头条
  • qq云 wordpress/seo基础篇
  • 河南工程建设信息网站/网络营销的五大特点
  • 常用来做网站的首页/南京seo优化推广
  • 网站 后台 数据 下载/用广州seo推广获精准访问量
  • 企业网站建设客户需求调查问卷/项目宣传推广方案
  • 高端网站的制作/网络推广服务合同
  • 【motion】标签体系设计与检索 1:HumanML3D 和 KIT Motion-Language(KITML)
  • MCP与Function Calling
  • Spring AI 系列之三十六 - Spring AI Alibaba-nl2sql
  • python开发环境安装多系统完整版
  • tensorRT配合triton部署模型
  • curl发送文件bodyParser无法获取请求体的问题分析