原文地址:https://blog.csdn.net/len_yue_mo_fu/article/details/80189035

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镜像中制作一个新的镜像

#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镜像制作我们自己的镜像:

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

 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

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

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

 进阶教程:

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 .

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

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

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

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

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

其实在docker中一个容器运行的时间长短,其实就是CMD后面跟的命令的执行时间,startup.sh就是一个脚本,执行结束之后就退出了,所以容器很快也就退出了。这个地方环境变量没有设置成功的可能原因是,docker容器总执行shell命令可能不是在同一个终端,也就是不是同一个进程中,设置了变量在./client中并不能生效。 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 创建镜像之后,我们再次启动一个容器,看看效果:

以上就是如何使用docker来部署一个c/c++的程序了

原文地址:https://blog.csdn.net/len_yue_mo_fu/article/details/80189035

【转载】如何使用docker部署c/c++程序的更多相关文章

  1. Docker部署Python应用程序

    Docker部署Python应用程序 1. 单个py文件部署 生成Dockerfile 文件 插件用的豆瓣的镜像,,重置时间(容器的默认时间是UTC时间与宿主机的相差8小时). 文中需要三个插件(pe ...

  2. Docker部署NETCORE应用程序

    Docker部署NETCORE应用程序 创建.netcore项目,本文以ASP.NET Core2.2 版本为例 设置Dockerfile属性始终复制 编辑Dockerfile内容 FROM micr ...

  3. docker 部署net core程序 curl访问地址 提示 Connection reset by peer

    最近研究netcore 部署到docker上.在参考https://www.cnblogs.com/subendong/p/8992285.html教程之后,部署成功.但是curl访问对应的主机端口地 ...

  4. docker 部署一个 aspnetmvc 程序

    准备mvc的程序[asp.net mvc5 网站]  使用刚才创建的镜像,并把上诉文件目录挂载到iis指定磁盘docker run -d -p 83:80 --name docker-drgs -v  ...

  5. docker部署java应用程序

    https://docs.docker.com/get-started/ 安装docker   1.安装docker  apt install docker 2.配置docker加速器 安装完成后在 ...

  6. Docker 使用指南 (六)—— 使用 Docker 部署 Django 容器栈

    版权声明:本文由田飞雨原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/98 来源:腾云阁 https://www.qclou ...

  7. 如何使用Docker部署一个Go Web应用程序

    熟悉Docker如何提升你在构建.测试并部署Go Web应用程序的方式,并且理解如何使用Semaphore来持续部署. 简介 大多数情况下Go应用程序被编译成单个二进制文件,web应用程序则会包括模版 ...

  8. Asp.Net Core 程序部署到Linux(centos)生产环境(二):docker部署

    运行环境 照例,先亮环境:软件的话我这里假设你已经批准好了.net core 运行环境,未配置可以看我的这篇[linux(centos)搭建.net core 运行环境] 腾讯云 centos:7.2 ...

  9. 使用Docker部署ASP.NET Core应用程序实践

    前言 最近把很火的Docker给看了,于是就磨拳擦掌要去实践一下.于是就拿之前一个aps.net core的项目(已被停止)去练手.该项目之前在ubuntu14.04上确保可以正常运行,所以docke ...

随机推荐

  1. SAP ABAP编程 字符串加密-MD5_CALCULATE_HASH_FOR_CHAR

    DATA: str1 TYPE c LENGTH 12 VALUE 'zxcv',       str2 TYPE c LENGTH 32,       str3 TYPE c LENGTH 32. ...

  2. golang 操作 Redis & Mysql & RabbitMQ

    golang 操作 Redis & Mysql & RabbitMQ Reids 安装导入 go get github.com/garyburd/redigo/redis import ...

  3. [Compose] 16. Apply multiple functors as arguments to a function (Applicatives)

    We find a couple of DOM nodes that may or may not exist and run a calculation on the page height usi ...

  4. NBU7.0 RMAN 异机恢复 not found in NetBackup catalog

    问题描写叙述: RMAN>  run { 2>  allocate channel t1 type 'sbt_tape'; 3>  send 'NB_ORA_SERV=netback ...

  5. 关于用WebView或手机浏览器打开连接问题

    1.通常情况下 大家可能都想使用WebView打开网页内部链接而不想再调用手机浏览器,我们可以通过以下两种方法实现: (1)为WebView设置一个WebViewClient,并重写shouldOve ...

  6. .net core——Docker化开发和部署

    原文:.net core--Docker化开发和部署 本篇文章是使用Vs2017生成的Dockerfile进行部署的. 目录 VS2017生成Docker部署项目 Dockerfile内容 在开发服务 ...

  7. webtool小问题

    webtool小问题 erlang的观察工具如crashdump,appmon,cover等工具有二种不同的界面:gs(wx)和web.这些tool都遵循一定的接口,用户可以自行扩展这些功能,使的能够 ...

  8. 自动化部署脚本,给每一台主机装上JDK,且配好环境变量

    centos6.7 当我们有很多台主机,想在每台机器上都安装一样的某些软件,当然,一台机器一台机器安装也是可以的,但是如果有一键安装所有机器上的软件那是不是很激动人心呢! 首先我们需要制作一台服务器, ...

  9. 还是Qt 通过stylesheet或者palette设置背景色的问题

    关于Qt,设置一个widget的背景色后,希望子对象不受影响. 很久以前在QtForum上问过一个问题:http://www.qtforum.org/post/94103/setting-backgr ...

  10. 【64.52%】【codeforces 697D】Puzzles

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...