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