【转载】如何使用docker部署c/c++程序

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

Docker介绍c++

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

docker部署c/c++程序 docker

      关于docker的使用网上有不少的教程可是不多有介绍如何使用docker来部署一个c/c++程序,笔者做为一个c/c++程序员,在学习docker的时候没有找到相关的使用,通过博主这几天的研究使用终于在docker中成功的运行了c/c++程序,下面博主就来介绍一下使用方法: 想要把c/c++程序运行在docker的容器中,就必须先建立一个docker镜像,经过镜像建立容器,来使咱们的程序在容器中运行起来。shell

#简单介绍一下docker中镜像和容器的关系:编程

• Images (镜像)ubuntu

Docker镜像是一个只读模板,包含建立Docker容器的说明。Docker镜像能够运行Docker镜像中的程序。 centos

• Container (容器)bash

容器是镜像的可运行实例。镜像与容器相似与面向对象中类与对象的关系。可经过Docker API或者CLI命令起停,移动,删除等。app

明白了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的内容: 

 1 FROM gcc:latest
 2 
 3 RUN  mkdir /usr/src/myapp
 4 
 5 COPY test.c /usr/src/myapp
 6 
 7 WORKDIR /usr/src/myapp
 8 
 9 RUN  gcc test.c 
10 
11 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

相关文章
相关标签/搜索