如何使用docker部署c/c++程序

如何使用docker部署c/c++程序版权声明 本文为博主原创文章 未经博主允许不得转载 Docker 介绍 Docker 是一个开源的容器引擎 它有助于更快地交付产品 Docker 可将应用程序和基础设施层隔离 并且将基础设施当作程序一样进行管理 使用 Docker 可以更快地打包 测试以及部署应用程序 并可以缩短从编程到部署运行代码的周期 docker 部署 c c 程序关于 docker 的使用网上有很多的教程但是很少有介绍如

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

docker部署c/c++程序

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

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

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

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

#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. 下载镜像到宿主主机:

//产看版本: docker search gcc 
//下载镜像 docker pull gcc //查看本地已经下载的镜像 docker images 

这里写图片描述

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

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"] 

执行命令:

docker build -t mygcc-test:v1 . //再次执行 docker images //这时我们就可以看到在本地镜像中多了一个叫做mygcc-test的镜像,TAG为v1 

这里写图片描述
4. 启动制作好的镜像:

//执行命令: docker run -d mygcc-test:v1 //启动镜像 //执行命令: docker ps //查看容器的运行情况 

这里写图片描述

//接下来我们进入到容器当中,查看a.out程序在后台执行的情况: docker exec -it mystifying_mclean /bin/bash 

进阶教程:

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

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

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的镜像

docker build -t mygcc-test:v2 . 
2.将一个启动之前需要设置环境变量的可执行程序复制到镜像中,制作镜像:

现在我们有DataImportClient.tar.gz这样的一个可执行程序压缩包,解压之后的目录如下,lib是存放client程序所依赖的动态库,startup.sh是启动client程序的脚本,在startup.sh启动之前我们首先会设置环境变量LD_LIBRARY_PATH
这里写图片描述
下面我们还是通过Dockerfile 来创建一个镜像,这次我们选用ubuntu作为基础镜像,Dockerfile的内容如下:

FROM ubuntu:latest ADD ./DataImportClient.tar.gz /usr/src/myapp WORKDIR /usr/src/myapp/DataImportClient CMD ["./startup.sh"] 
#!/bin/bash export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./lib ./client & 

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

正确的Dockerfile:

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/

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

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

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

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

(0)
上一篇 2025年11月30日 下午2:01
下一篇 2025年11月30日 下午2:22


相关推荐

  • mac电脑卸载软件_docker卸载镜像

    mac电脑卸载软件_docker卸载镜像  在Mac上卸载docker,首先要关闭docker软件,然后进入/usr/local/bin/目录,依次使用如下命令:##1)进入docker的安装目录cd/usr/local/bin/##2)删除与docker相关的文件夹sudorm-rfdocker*sudorm-rfcom.docker.*sudorm-rfhub-tool*sudorm-rfkube*sudorm-rfvpnkit*  如图(1)所示:图(1)完成删除

    2022年8月30日
    8
  • 用docker部署jar包_docker run 参数

    用docker部署jar包_docker run 参数小小总结一、思路1、将docker容器中的指定文件夹挂载到宿主机上,更新jar包只需上传到宿主机指定路径,方便更新2、利用bash文件运行jar包,并构建该bash的镜像,代替构建直接运行jar包的镜像,利于镜像与jar包解耦。例如,app-1.0.0.jar升级到app-2.0.0.jar,只须更改bash文件的内容,而无须构建新的镜像。二、准备工作1、创建存放docker配置文件、jar包的文件夹在宿主机上,创建文件夹:/home/admin/app,用于存放bash文件和jar包。然

    2026年4月15日
    4
  • docker访问宿主机端口_docker 访问宿主机局域网

    docker访问宿主机端口_docker 访问宿主机局域网有时候就需要在docker容器里访问宿主机提供的服务。例如容器里的应用需要访问宿主机的mysql服务。方案一:宿主机执行ifconfig会看到docker0那个ip,可以使用来访问宿主机方案二:docker18.03加入了一个feature,在容器中可以通过host.docker.internal来访问主机UseyourinternalIPaddres…

    2022年8月21日
    10
  • CentOS部署基于flannel网络的docker

    CentOS部署基于flannel网络的docker

    2021年6月2日
    97
  • 如何保证docker2375端口的安全

    如何保证docker2375端口的安全情景再现:之前有很多朋友提过,当使用docker-maven-plugin打包SpringBoot应用的Docker镜像时,服务器需要开放2375端口。由于开放了端口没有做任何安全保护,会引起安全漏洞,被人入侵、挖矿、CPU飙升这些情况都有发生,今天我们来聊聊如何解决这个问题。问题产生的原因首先我们要明白问题产生的原因,才能更好地解决问题!Docker为了实现集群管理,提供了远程管理的端口。DockerDaemon作为守护进程运行在后台,可以执行发送到管理端口上的Docker命令。当我们修改do

    2022年6月13日
    79
  • Docker暴露2375端口,引起安全漏洞

    Docker暴露2375端口,引起安全漏洞作者信息:廖煜,电子科技大学计算机和金融学双硕士,负责Ghostcloud的产品运营。曾任EMC西南区架构师。国内顶级Docker技术专家,Docker开源项目贡献者。拥有丰富的虚拟化、云计算和企业级软件经验。前几天有小伙伴发现Docker暴露出2375端口,引起了安全漏洞。我现在给大家介绍整个事情的来龙去脉,并告诉小伙伴们,怎么修复这个漏洞。为了实现集群管理,Docker提供了远程管理接…

    2022年6月5日
    53

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号