前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++ docker_docker部署mysql

C++ docker_docker部署mysql

作者头像
全栈程序员站长
发布2022-11-02 15:39:49
6670
发布2022-11-02 15:39:49
举报

版权声明:本文为博主原创文章,未经博主允许不得转载。

#Docker介绍 Docker是一个开源的容器引擎,它有助于更快地交付产品。Docker可将应用程序和基础设施层隔离,并且将基础设施当作程序一样进行管理。使用Docker,可以更快地打包,测试以及部署应用程序,并可以缩短从编程到部署运行代码的周期

docker部署c/c++程序

关于docker的使用网上有很多的教程但是很少有介绍如何使用docker来部署一个c/c++程序,笔者作为一个c/c++程序员,在学习docker的时候没有找到相关的使用,经过博主这几天的研究使用终于在docker中成功的运行了c/c++程序,下面博主就来介绍一下使用方法:

想要把c/c++程序运行在docker的容器中,就必须先创建一个docker镜像,通过镜像创建容器,来使我们的程序在容器中运行起来。 #######简单介绍一下docker中镜像和容器的关系: • Images (镜像) Docker镜像是一个只读模板,包含创建Docker容器的说明。Docker镜像可以运行Docker镜像中的程序。 • Container (容器) 容器是镜像的可运行实例。镜像与容器类似与面向对象中类与对象的关系。可通过Docker API或者CLI命令起停,移动,删除等。

明白了docker中镜像和容器的关系之后,我们想要把程序执行起来,其实就是将程序放在镜像中,通过镜像启动一个容器,在容器中执行我们的程序。

那么我们运行一个c/c++程序到底该选择怎么样的镜像呢?其实也很简单,我们只要知道我们的程序如果不使用docker他是在什么系统或者说是环境中使用,那么我们就可以通过docker官方的仓库去下载这样的镜像来供我们创建包含我们程序的镜像了。

我们现在有这样的一段代码,功能就是给一个叫t.txt的文件中写hello world!!!。下面我们就通过这个简单的代码来示范如果把一个c/c++程序放到docker镜像中制作一个新的镜像

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>


int main()
{
	FILE* file = fopen("t.txt","w+");
	if (file == NULL)
	{
		return 0;
	}

	char buf[20]="hello world!!!\n";
	int len = strlen(buf);

	while(1)
	{
		fputs(buf,file);
		fflush(file);
	//	printf("%s",buf);
		sleep(1);
	}

	fclose(file);

	return 0;
}

1. 镜像的选择:

c/c++程序我们都是直接运行在linux系统上,所以我们可以直接选择centos或者ubuntu镜像,在这里我们是要把.c文件编译成一个可执行程序,docker还有一个gcc或者g++的镜像,使用gcc或者g++镜像的话,我们就不需要在ubunt或者centos镜像中再安装gcc 、g++了。

推荐三种镜像:

  1. gcc 或者g++
  2. ubuntu
  3. centos

2. 下载镜像到宿主主机:

代码语言:javascript
复制
//产看版本:
docker search gcc

下面是执行结果:

这里写图片描述
这里写图片描述

这里我们选择第一个下载:

代码语言:javascript
复制
//下载镜像
docker pull gcc
//查看本地已经下载的镜像
docker images
这里写图片描述
这里写图片描述

3. 使用gcc镜像制作我们自己的镜像:

制作镜像有两种方式,在这里就不做赘述了,可以产看博主单独接受制作镜像的博客: 在这里我们通过Dockerfile的方式创建自己的镜像,下面是Dockerfile的内容:

代码语言:javascript
复制
FROM gcc:latest

RUN  mkdir /usr/src/myapp

COPY test.c /usr/src/myapp

WORKDIR /usr/src/myapp

RUN  gcc test.c 

CMD ["./a.out"]

执行命令:

代码语言:javascript
复制
docker build -t mygcc-test:v1 .
//再次执行
docker images
//这时我们就可以看到在本地镜像中多了一个叫做mygcc-test的镜像,TAG为v1
这里写图片描述
这里写图片描述

##4. 启动制作好的镜像:

代码语言:javascript
复制
//执行命令:
docker run -d mygcc-test:v1 //启动镜像
//执行命令:
docker ps //查看容器的运行情况
这里写图片描述
这里写图片描述
代码语言:javascript
复制
//接下来我们进入到容器当中,查看a.out程序在后台执行的情况:
docker exec -it mystifying_mclean /bin/bash

进入到容器之后我们执行top命令,查看a.out:

这里写图片描述
这里写图片描述

查看当前目录发现已经生成了t.txt文件说明,a.tou程序执行正常:

这里写图片描述
这里写图片描述

##进阶教程:

1.直接将一个可执行程序复制到镜像中,制作镜像

还是刚才那个test.c文件,我们直接在本地虚拟机,将他编译成可执行程序a.out,下面是Dockerfile的内容:

代码语言:javascript
复制
FROM gcc:latest

RUN  mkdir /usr/src/myapp

COPY a.out /usr/src/myapp

WORKDIR /usr/src/myapp

#RUN  gcc test.c 

CMD ["./a.out"]

我们通过下面命令制作一个名字是mygcc-test,但是tag是v2的镜像

代码语言:javascript
复制
docker build -t mygcc-test:v2 .

镜像制作好了之后,我们再运行一个该镜像的容器,还是通过上面的命令,在这里就不列出来了,直接上截图了,看看效果:

这里写图片描述
这里写图片描述

还是top,查看a.out是否在后台运行,在查看t.txt的执行情况:

这里写图片描述
这里写图片描述
2.将一个启动之前需要设置环境变量的可执行程序复制到镜像中,制作镜像:

现在我们有DataImportClient.tar.gz这样的一个可执行程序压缩包,解压之后的目录如下,lib是存放client程序所依赖的动态库,startup.sh是启动client程序的脚本,在startup.sh启动之前我们首先会设置环境变量LD_LIBRARY_PATH

这里写图片描述
这里写图片描述

下面我们还是通过Dockerfile 来创建一个镜像,这次我们选用ubuntu作为基础镜像,Dockerfile的内容如下:

代码语言:javascript
复制
FROM ubuntu:latest

ADD ./DataImportClient.tar.gz  /usr/src/myapp

WORKDIR /usr/src/myapp/DataImportClient

CMD ["./startup.sh"]

直接上截图了,通过上面的方法我们发现我们期待的结果并没有出现,docker ps 发现什么也没有:

这里写图片描述
这里写图片描述

这就很让人困扰了,按理说通过./startup.sh会将环境变量设置,并且执行./client,但是我们事实却并不是这样,我们查看日志,发现退出的原因是找不到动态库:

这里写图片描述
这里写图片描述

其实在docker中一个容器运行的时间长短,其实就是CMD后面跟的命令的执行时间,startup.sh就是一个脚本,执行结束之后就退出了,所以容器很快也就退出了。这个地方环境变量没有设置成功的可能原因是,docker容器总执行shell命令可能不是在同一个终端,也就是不是同一个进程中,设置了变量在./client中并不能生效。 startup.sh的内容如下:

代码语言:javascript
复制
#!/bin/bash

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./lib

./client &

但是我们观察COMMAND发现命令是**”./client”,所有可以大致推断出,CMD一定是将startup中的命令,分成多个CMD来执行,但是Dockerfile**的语法是,CMD只执行最后一个,这样就能解释为什么找不到动态库的原因了。

这里写图片描述
这里写图片描述

正确的Dockerfile:

代码语言:javascript
复制
FROM ubuntu:latest

ADD ./DataImportClient.tar.gz  /usr/src/myapp

WORKDIR /usr/src/myapp/DataImportClient

ENV  LD_LIBRARY_PATH=./lib:$LD_LIBRARY_PATH.

#RUN echo $LD_LIBRARY_PATH

CMD ["./client"]

通过ENV来设置环境变量LD_LIBRARY_PATH 创建镜像之后,我们再次启动一个容器,看看效果:

这里写图片描述
这里写图片描述
如果要做一个很小的镜像,如果有需求的伙伴可以查看博主下面文章:https://blog.csdn.net/len_yue_mo_fu/article/details/88899743

以上就是如何使用docker来部署一个c/c++的程序了,如果小伙伴们有什么问题,欢迎大家留言提问。

版权声明:本文为博主原创文章,未经博主允许不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/180380.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年10月19日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • docker部署c/c++程序
    • 1. 镜像的选择:
      • 2. 下载镜像到宿主主机:
        • 3. 使用gcc镜像制作我们自己的镜像:
        相关产品与服务
        容器服务
        腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档