1. 程式人生 > >【轉載】如何使用docker部署c/c++程序

【轉載】如何使用docker部署c/c++程序

代碼 設置環境變量 類與對象 期待 txt include printf docker容器 教程

原文地址: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的內容:

 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

【轉載】如何使用docker部署c/c++程序