程式設計開發(C/C++&Java&Python&JavaScript&Go&PHP&Ruby&Perl&R&Erlang)

jephon發表於2017-03-16

使用Docker快速部署主流程式語言的開發、編譯環境及其常用框架,包括C、C++、Java、Python、JavaScript、Go、PHP、Ruby、Perl、R、Erlang等。

在今後採用程式語言開發和測試時,將再也不用花費大量時間進行環境配置了,只需簡單獲取容器映象,即可快速擁有相關的環境。

C/C++

C是一門古老的語言,在1969年由貝爾實驗室設計開發,今天仍然是系統領域和高效能運算的主要選擇。C語言具有高效、靈活、功能豐富、表達力強和較高的可移植性等特點。C++在C的基礎上,支援了資料的抽象與封裝、物件導向和泛型程式設計。功能與效能的平衡使C++成為了目前應用最廣泛的系統程式語言之一。

三款流行的C/C++開發工具,GCC、LLVM和Clang。

GCC

GCC(GNU Compiler Collection)是一套由GNU開發的程式語言編譯器,是一套以GPL及LGPL許可證所發行的自由軟體,也是GNU計劃的關鍵部分。GCC(特別是其中的C語言編譯器)通常被認為是跨平臺編譯器的事實標準。

GCC可處理C/C++,以及Fortran、Pascal、Objective-C、Java、Ada等多種語言。

將C/C++程式碼執行在容器內的最簡方法,就是將編譯指令寫入Dockerfile中,然後使用此Dockerfile構建自定義映象,最後直接執行此映象,即可啟動程式。

FROM gcc:4.9
COPY . /usr/src/myapp
WORKDIR /usr/src/myapp
RUN gcc -o myapp main.c
CMD ["./myapp"]

編輯main.c,內容如下:

#include
int main()
{
  printf("Hello World
");
  return 0;
}

現在,就可以使用Dockerfile來構建映象my-gcc-app:

$ docker build -t gcc-image .

建立並執行此容器,會編譯並執行程式,輸出Hello World語句。

$ docker run -it –rm –name gcc-container gcc-image

Hello World

如果只需要容器編譯程式,而不需要執行它,可以使用如下命令:

$ docker run –rm -v “$(pwd)”:/usr/src/myapp -w /usr/src/myapp gcc gcc -o myapp main.c

以上命令會將當前目錄(”$(pwd)”)掛載到容器的/usr/src/myapp目錄,並執行gcc -o myapp myapp.c。GCC將會編譯myapp.c程式碼,並將生成的可執行檔案輸出至/usr/src/myapp資料夾。

LLVM

LLVM(Low Level Virtual Machine)是伊利諾伊大學的一個研究專案,試圖提供一個現代化的,基於SSA的編譯策略,同時支援靜態和動態程式語言。和之前為大家所熟知的JVM以及.net Runtime這樣的虛擬機器不同,這個虛擬系統提供了一套中立的中間程式碼和編譯基礎設施,並圍繞這些設施提供了一套全新的編譯策略(使得優化能夠在編譯、連線、執行環境執行過程中,以及安裝之後以有效的方式進行)和其他一些非常有意思的功能。

Docker Hub中已經有使用者提供了LLVM映象。

$ docker pull imiell/llvm

Clang

Clang是一個由Apple公司用C++實現、基於LLVM的C/C++/Objective C/Objective C++編譯器,其目標就是超越GCC成為標準的C/C++編譯器,它遵循LLVM BSD許可。Clang很好地相容了GCC。

Clang特性包括:

  1. 快:在OSX上的測試中,Clang比GCC 4.0快2.5倍。
  2. 記憶體佔用小:Clang記憶體佔用一般比GCC要小的多。
  3. 診斷資訊可讀性強:Clang對於錯誤的語法不但有原始碼提示,還會在錯誤的呼叫和相關上下文上有更好的提示。
  4. 基於庫的模組化設計:Clang將編譯過程分成彼此分離的幾個階段,將大大增強IDE對於程式碼的操控能力。

在Docker Hub中已經有使用者提供了Clang的映象:

$ docker pull bowery/clang

Java

Java是一種擁有跨平臺、物件導向、泛型程式設計特點的編譯型語言,廣泛應用於企業級應用開發和移動應用開發領域,由SUN公司在1995年推出。Java是基於類的物件導向的高階語言,其設計理念是儘可能的減少部署依賴,致力於“開發一次,到處執行”。這就意味著Java的二進位制編碼不需要再次編譯,即可執行在異構的JVM上。Java在大型網際網路專案,特別是網際網路金融和電子商務專案中非常受歡迎。

在容器中執行Java程式碼最簡單的方法就是將Java編譯指令直接寫入Dockerfile。然後使用此Dockerfile構建並執行此映象,即可啟動程式。

在本地新建一個空目錄,在其中建立Dockerfile檔案。在Dockerfile中,加入需要執行的Java編譯命令,例如:

FROM java:7
COPY . /usr/src/javaapp
WORKDIR /usr/src/javaapp
RUN javac HelloWorld.java
CMD ["java", "HelloWorld"]

使用此Dockerfile構建映象java-image:

$ docker build -t java-image .

然後,執行此映象即自動編譯程式並執行:

$ docker run -it –rm –name java-container java-image

Hello, World

如果只需要在容器中編譯Java程式,而不需要執行,則可以使用如下命令:

$ docker run –rm -v “$(pwd)”:/usr/src/javaapp -w /usr/src/javaapp java:7 javac HelloWorld.java

Python

Python是一種解釋型的動態語言,物件導向設計,功能十分強大。它整合了模組(modules)、異常處理(exceptions)、動態型別(dynamic typing)、高階資料結構(元組、列表、序列)、類(classes)等高階特性。Python設計精良,語法簡約,表達能力很強。目前,所有主流作業系統(Windows、所有Linux、類Unix系統)都支援Python。

使用官方的Python映象

推薦使用者使用Docker官方提供的Python映象作為基礎映象。

第一步,建立Dockerfile檔案:

新建專案目錄py-official,進入此目錄,新建一個Dockerfile檔案,內容如下:

FROM python:3-onbuild
CMD [ "python3.5", "./py3-sample.py" ]

新建py3-sample.py檔案,計算Fibonacci數列:

def fib(n):
a, b = 0, 1
while a < n:
print(a, end=` `)
a, b = b, a+b
print()
fib(1000)

新建requirements.txt依賴檔案,可以在此檔案中加入專案依賴程式,如Django等。此處僅新建空檔案。

$ touch requirements.txt

第二步,使用docker build命令構建名為py2.7-sample-app的映象:

$ docker build -t py3-image .

第三步,通過docker run命令建立並執行容器:

$ docker run -it –rm –name py3-container py3-image

0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987

如果只需要執行單個Python指令碼,那麼無需使用Dockerfile構建自定義映象,而是通過以下命令直接使用官方Python映象,帶引數執行容器:

$ docker run -it –rm –name my-running-script -v “$(pwd)”:/usr/src/myapp -w /usr/src/myapp python:3 python your-daemon-or-script.py

使用PyPy

PyPy是一個Python實現的Python直譯器和即時編譯(JIT)工具,它專注與速度、效率,以及和CPython完全的相容性。PyPy通過JIT技術可以使得Python執行速度提高近十倍,同時保證相容性。

首先,設定專案目錄,並新建hi.py例項程式:

for animal in ["dog", "cat", "mouse"]:
print "%s is a mammal" % animal

然後,在根目錄新建Dockerfile,基於pypy3的onbuild版本映象:

FROM pypy:3-onbuild
CMD [ "pypy3", "./hi.py" ]

如果使用者需要使用pypy2,則可以使用:FROM pypy:2-onbuild。

onbuild版本的映象內含若干onbuild觸發器,它們可以再映象構建期間完成一些必要的初始化操作,便於專案的直接執行。pypy的onbuild映象會拷貝一個requirements.txt依賴檔案,執行RUN pip install安裝依賴程式,然後將當前目錄拷貝至/usr/src/app。

下面,使用者開始構建和執行此映象:

$ docker build -t my-python-app .

$ docker run -it –rm –name my-running-app my-python-app

如果使用者只需要執行單個pypy指令碼,並希望避免新建Dockerfile,那麼使用者可以直接使用以下指令:

$ docker run -it –rm –name my-running-script -v “$PWD”:/usr/src/myapp -w /usr/src/myapp pypy:3 pypy3 your-daemon-or-script.py

如果需要使用pypy2執行,則可以使用如下指令:

$ docker run -it –rm –name my-running-script -v “$PWD”:/usr/src/myapp -w /usr/src/myapp pypy:2 pypy your-daemon-or-script.py

JavaScript

JavaScript是目前所有主流瀏覽器上唯一支援的指令碼語言,這也是早期JavaScript的唯一用途。Node.js的出現,讓服務端應用也可以基於JavaScript進行編寫。

Node.js自2009年釋出,使用Google Chrome瀏覽器的V8引擎,採用事件驅動,效能優異。同時還提供了很多系統級API,如檔案操作、網路程式設計等。

使用Node.js環境

Node.js擁有3種官方映象:node:、node:onbuild、node:slim。

其中常用的是帶有版本標籤的,以及帶有onbuild標籤的node映象。

首先,在Node.js專案中新建一個Dockerfile:

FROM node:4-onbuild
EXPOSE 8888

然後,新建server.js檔案,內容如下:

`use strict`;
var connect = require(`connect`);
var serveStatic = require(`serve-static`);
var app = connect();
app.use(`/`, serveStatic(`.`, {`index`: [`index.html`]}));
app.listen(8080);
console.log(`MyApp is ready at http://localhost:8080`);

之後,通過npm init命令來新建node專案所必須的package.json檔案:

$ npm init

This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.
See `npm help json` for definitive documentation on these fields
and exactly what they do.
Use `npm install --save` afterwards to install a package and
save it as a dependency in the package.json file.
Press ^C at any time to quit.
name: (node) node
version: (1.0.0)
description: node-sample
entry point: (index.js)
test command:
git repository:
keywords:
author:
license: (ISC)
About to write to /Users/faxi/Docker/js/node/package.json:
{
"name": "node",
"version": "1.0.0",
"description": "node-sample",
"main": "index.js",
"scripts": {
"test": "echo "Error: no test specified" && exit 1"
},
"author": "",
"license": "ISC"
}
Is this ok? (yes) yes

下面使用docker build指令構建node映象:

$ docker build -t node-image .

最後,建立並執行node容器:

$ docker run -it -P node-image

npm info it worked if it ends with ok
npm info using npm@2.15.1
npm info using node@v4.4.3
npm info prestart node@1.0.0
npm info start node@1.0.0
> node@1.0.0 start /usr/src/app
> node server.js
MyApp is ready at http://localhost:8080

此時可以使用瀏覽器檢視到MyApp應用的服務頁面。

首先,使用docker ps指令檢視埠繫結情況:

$ docker ps

CONTAINER ID  IMAGE      COMMAND     CREATED   STATUS PORTS                          NAMES

7b6f666d4808  node-image “npm start” xxxago    Up xx  0.0.0.0:32771->8888/tcp    node-container

如果只需要執行單個node指令碼的容器,則無需通過Dockerfile構建映象,可以使用以下指令:

$ docker run -it –rm –name my-running-script -v “$(pwd)”:/usr/src/myapp -w /usr/src/myapp node:0.10 node your-daemon-or-script.js

Go

Go語言(也稱Golang)是一個由Google主導研發的程式語言,於2009年推出。它的語法清晰明瞭,設計精良,擁有一些先進的特性,還有一個龐大的標準庫。Go的基本設計理念是:編譯效率、執行效率和開發效率要三者兼顧。使用Go開發,既可以得到很多靈活的語法支援,又可以擁有C/C++的執行和編譯效率。此外,Go提供了輕量級的協程,支援大規模併發的場景。

搭建並執行Go容器

1.使用官方映象

執行Go語言環境的最簡方法是使用官方golang映象。可以使用docker run指令直接啟動Go語言的互動環境:

$ docker run -it golang /bin/bash

root@79afc2b64b06:/go# go versiongo version go1.7 linux/amd64

還可以將Go編譯指令寫入Dockerfile中,基於此Dockerfile構建自定義映象。具體步驟如下。

第一步,新建專案資料夾,並在根目錄新建Dockerfile:

FROM golang:1.6-onbuild          
#顯示宣告基礎映象版本,利於後期維護。onbuild版本Dockerfile的具體內容如下:
FROM golang:
1.6 RUN mkdir -p /go/src/app WORKDIR /go/src/app CMD ["go-wrapper", "run"] #通過`go-wrapper`程式執行當前目錄下的主函式 ONBUILD COPY . /go/src/app #拷貝當前專案程式碼至執行目錄 ONBUILD RUN go-wrapper download #下載依賴,具體實現參考`go-wrapper`原始碼 ONBUILD RUN go-wrapper install #安裝依賴,具體實現參考`go-wrapper`原始碼 # `go-wrapper`原始碼地址:`https://github.com/docker-library/golang/blob/master/go-wrapper` # Dockerfile原始碼地址: `https://github.com/docker-library/golang/blob/master/1.6/onbuild/Dockerfile`

第二步,新建自定義go程式go-sample.go:

package main
import "fmt"
func main() {
fmt.Println("Hello,世界")
}

第三步,使用docker build指令構建映象:

$ docker build -t golang-image .

最後,使用docker run指令執行Go容器:

$ docker run -it –rm –name golang-container golang-image exec app

Hello,世界

至此成功執行了Go語言的例項容器。

如果需要在容器中編譯Go程式碼,但是不需要在容器中執行它,那麼可以執行如下命令:

$ docker run –rm -v “$(pwd)”:/usr/src/myapp -w /usr/src/myapp golang go build -v_/usr/src/myapp

這會將Go專案資料夾作為Docker資料卷掛載起來並作為執行目錄。然後,Docker會在工作目錄中編譯程式碼,執行go build命令並輸出可執行檔案至myapp。

2.Go專案容器化

首先,下載Golang官方提供的outyet示例專案:

mkdir outyet

$ cd outyet

#使用go get下載:

$ go get github.com/golang/example/outyet

#或者直接使用wget下載:

$ wget https://github.com/golang/example/archive/master.zip

$ unzip master.zip

$ cd example-master/outyet

$ ls

Dockerfile      containers.yaml main.go         main_test.go

示例專案搭建成功後,可以按照以下模板去自定義專案的Dockerfile:

#使用golang基礎映象。基於Debian系統,安裝最新版本的golang環境。工作空間(GOPATH)配置是"/go"
FROM golang
#將本地的包檔案拷貝至容器工作目錄。
ADD . /go/src/github.com/golang/example/my-go
#在容器中構建my-go。可以在這裡手動或者自動(godep)管理依賴關係。
RUN go install github.com/golang/example/my-go
#設定容器自動執行my-go。
ENTRYPOINT /go/bin/my-go-app
#監聽8080埠。
EXPOSE 8080

如果使用onbuild版本的基礎映象,那麼原始檔拷貝、構建與配置等過程就會自動完成,無需在Dockerfile中逐一配置,如下所示:

FROM golang:onbuild
EXPOSE 8080

下面開始構建與執行此Golang專案。在outyet專案根目錄執行docker build指令,使用本地目錄下的Dockerfile:

$ docker build -t outyet .

構建過程中,Docker會從Docker Hub中獲取golang基礎映象,拷貝本地包檔案,構建專案並給映象打上outyet標籤。

下面,使用docker run指令執行此映象:

$ docker run -p 6060:8080 –name test –rm outyet

此時,例項專案的容器已經在執行狀態。開啟瀏覽器訪問http://localhost:6060/即可看到執行介面。

Beego

Beego是一個使用Go的思維來幫助開發者構建並開發Go應用程式的開源框架。Beego使用Go開發,思路來自於Tornado,路由設計來源於Sinatra。

使用方法如下。

第一步,下載安裝:

go get github.com/astaxie/beego

第二步,建立檔案hello.go:

package main
import "github.com/astaxie/beego"
func main() {
beego.Run()
}

第三步,編譯執行:

go build -o hello hello.go

./hello

第四步,開啟瀏覽器並訪問http://localhost:8080

至此,一個Beego專案成功構建了。

Gogs:基於Go的Git服務

Gogs的目標是打造一個最簡單、輕鬆的方式搭建自助Git服務。使用Go語言開發使得Gogs能夠通過獨立的二進位制分發,並且支援Go語言支援的所有平臺,包括Linux、Mac OS X、Windows以及ARM平臺。

可以使用docker run直接建立並執行映象:

$ docker run –rm –name gogs gogs/gogs

如果需要停止此映象,可以使用docker stop與docker rm指令:

$ docker stop gogs; docker rm gogs

如果需要將資料持久化,可以先新建資料資料夾,然後將其作為資料卷掛載至gogs容器中:

mkdir -p /srv/lxc/gogs/data

$ docker run -d –name gogs -p 8300:3000 -p 8322:22 -v /srv/lxc/gogs/data:/data gogs/gogs

PHP

PHP(Hypertext Preprocessor,超文字前處理器)是一種通用的開源指令碼語言。語法吸收了C、Java和Perl等語言的特點,利於學習,使用廣泛,主要適用於Web開發領域。PHP執行效率比完全生成HTML標記的CGI要高許多;PHP還可以執行編譯後程式碼,編譯可以達到加密和優化程式碼執行,使程式碼執行更快。

1.使用官方映象

第一步,在PHP專案的根目錄中新建一個Dockerfile:

FROM php:5.6-cli
COPY . /usr/src/myapp
WORKDIR /usr/src/myapp
CMD [ "php", "./hello.php" ]

新建hello.php檔案: 

echo “hello php

第二步,執行docker build命令構建映象:

$ docker build -t php-image .

最後,執行以下命令去執行Docker映象:

$ docker run -it –rm –name php-container php-image

hello php

2.掛載PHP專案

需要執行簡單的,甚至單檔案的PHP專案,那麼每次都寫Dockerfile會很麻煩。

這種情況下,可以用以下命令掛載PHP專案:

$ docker run -it –rm –name my-running-script -v “$(pwd)”:/usr/src/myapp -w /usr/src/myapp php:5.6-cli php your-script.php

3.配合Apache使用

通常情況下,PHP專案需要和Apache httpd/Nginx一起執行,這樣就需要PHP容器中內含Apache Web Server。

可以使用帶有apache標籤的映象,如php:5.6-apache。

第一步,在PHP專案的根目錄中新建一個Dockerfile,並使用Docker Hub官方的基礎映象:

FROM php:5.6-apache
COPY src/ /var/www/html/

其中,src/是當前包含所有PHP程式碼的目錄。

第二步,使用此Dockerfile構建自定義映象:

$ docker build -t my-php-app .

第三步,建立並執行此映象:

$ docker run -it –rm –name my-running-app my-php-app

建議添一個自定義的php.ini配置檔案,將其拷貝到/usr/local/lib。這樣可以對PHP專案做更多的定製化,如開啟某些PHP外掛,或者對PHP直譯器進行一些安全/效能相關的配置。

新增方法很簡單:

FROM php:5.6-apache
COPY config/php.ini /usr/local/lib/
COPY src/ /var/www/html/

src/是當前存放PHP程式碼的資料夾,config/資料夾包含php.ini檔案。

如果讀者希望直接使用官方映象執行PHP專案,可以執行如下命令:

$ docker run -it –rm –name my-apache-php-app -v “$(pwd)”:/var/www/html php:5.6-apache

Ruby

Ruby是一種動態的物件導向的指令碼語言,具有支援反射、跨平臺、設計精簡等特點,在Web應用領域應用頗多。Ruby的設計受到Perl、Smalltalk、Eiffel、Ada和Lisp的影響。Ruby支援多種程式設計正規化,如函式程式設計、物件導向程式設計、CLI互動式程式設計。Ruby還有動態的資料型別系統和自動的記憶體管理。

使用Ruby官方映象

首先,在Ruby專案中建立一個Dockerfile:

FROM ruby:2.1.2-onbuild
CMD ["./rb-sample.rb .rb"]

然後,新建rb-sample.rb例子程式:

say = "I love Ruby"
3.times { puts say }

將以上檔案放在app的根目錄(與Gemfile同級)。

使用的官方映象帶有onbuild標籤,意味著包含了啟動大部分Ruby專案所需的基本指令。

在構建映象的時候,Docker會執行COPY./usr/src/app以及RUN bundle install。

然後,構建名為ruby-image的映象:

$ docker build -t ruby-image .

最後,建立並執行此映象:

$ docker run -it –name ruby-container ruby-image

由於在構建時使用了帶有onbuild標籤的映象,所以在app目錄下需要有Gemfile.lock檔案。

可以在App的根目錄執行以下命令:

$ docker run –rm -v “$(pwd)”:/usr/src/app -w /usr/src/app ruby:2.1.2 bundle install –system

如果只需要執行單個的Ruby指令碼,那麼無需使用Dockerfile構建自定義映象,而是通過以下命令直接使用官方Ruby映象,帶引數執行容器:

$ docker run -it –rm –name my-running-script -v “$(pwd)”:/usr/src/myapp -w /usr/src/myapp ruby:2.1.2 ruby your-daemon-or-script.rb

JRuby

JRuby類似於Python的Jython,它可執行於JVM上並支援Java的介面和類。

第一步,使用者在JRuby專案中建立一個Dockerfile:

FROM jruby:.1.7.24-onbuild
CMD ["./jruby-sample.rb"]

第二步,新建Ruby示例程式碼jruby-sample.rb:

say = "I love JRuby"
3.times { puts say }

將此檔案放在app的根目錄(與Gemfile同級)。

使用的官方映象帶有onbuild標籤,意味著包含了啟動大部分JRuby專案所需的基本指令。在構建映象的時候,會執行COPY./usr/src/app以及RUN bundle install。

第三步,構建自定義映象:

$ docker build -t jruby-image .

第四步,建立並執行此映象:

$docker run -it –name jruby-container jruby-image

由於在構建時使用了帶有onbuild標籤的映象,所以在app目錄下需要有Gemfile.lock檔案。這時可以在app的根目錄執行以下命令:

$ docker run –rm -v “$(pwd)”:/usr/src/app -w /usr/src/app jruby:1.7.15 bundleinstall –system

如果只需要執行單個的JRuby指令碼,那麼無需使用Dockerfile構建自定義映象,而是通過以下命令直接使用官方JRuby映象,帶引數執行容器:

$ docker run -it –rm –name my-running-script -v “$(pwd)”:/usr/src/myapp -w /usr/src/myapp jruby:1.7.15 jruby your-daemon-or-script.rb

Ruby on Rails

Rails是使用Ruby語言編寫的網頁程式開發框架,目的是為開發者提供常用元件,簡化網頁程式的開發。只需編寫較少的程式碼,就能實現其他程式語言或框架難以企及的功能。經驗豐富的Rails程式設計師會發現,Rails讓程式開發變得更有樂趣。

1.使用官方映象

第一步,使用者在Rails專案中建立一個Dockerfile,將此檔案放在專案根目錄(與Gemfile同級)。

Dockerfile內容如下:

FROM rails:onbuild

可見使用者使用了onbuild標籤,即此基礎映象會自行完成一些基本的構建工作幷包含了大部分啟動一個Rails專案所需的基本指令。

Dockerfie內容如下:

FROM ruby:2.3
# throw errors if Gemfile has been modified since Gemfile.lock
RUN bundle config --global frozen 1
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
ONBUILD COPY Gemfile /usr/src/app/
ONBUILD COPY Gemfile.lock /usr/src/app/
ONBUILD RUN bundle install
ONBUILD COPY . /usr/src/app

第二步,構建自定義映象:

$ docker build -t rails-image .

第三步,建立並執行此映象:

$ docker run –name rails-container -d rails-image

此時使用者可以使用瀏覽器訪問http://container-ip:3000檢視服務,當然,也可以對映到本地主機埠。

$ docker run –name some-rails-app -p 8080:3000 -d my-rails-app

現在可以使用瀏覽器訪問http://localhost:8080或者http://host-ip:8080

2.使用Compose搭建Rails應用

下面使用Docker Compose來配置和執行一個簡單的Rails+PostgreSQL應用。

第一步,確定專案資料夾內容。新建一個名為rails-compose-example的專案資料夾,在其根目錄新建一個Dockerfile檔案,內容如下:

FROM ruby:2.2.0
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev
RUN mkdir /code
WORKDIR /code
ADD Gemfile /code/Gemfile
ADD Gemfile.lock /code/Gemfile.lock
RUN bundle install
ADD . /code

Gemfile內容如下:

source `https://rubygems.org`

gem `rails``4.2.0`

下面使用者新建docker-compose.yml檔案,內容如下:

version: `2`
services:
db:
image: postgres
web:
build: .
command: bundle exec rails s -p 3000 -b `0.0.0.0`
volumes:
- .:/myapp
ports:
- "3000:3000"
depends_on:
- db

第二步,構建Rails專案。可以使用docker-compose run指令構建並啟動此Rails專案:

$ docker-compose run web rails new . –force –database=postgresql –skip-bundle

Perl

Perl是一個高階的、動態的解釋型指令碼語言,它的設計借鑑了C、Shell、awk和sed。Perl最重要的特性是它內部整合了正規表示式的功能,以及巨大的第三方程式碼庫CPAN。Perl像C一樣強大,同時像awk、sed等指令碼語言一樣富有表達性。Perl常見於系統管理和檔案處理等程式,Perl多數情況下屬於Web方案中的膠水語言。

可以使用Docker官方的Perl映象作為基礎,在此之上進行必要的定製。

第一步,下載官方的Perl映象:

$ docker pull perl

如果對Perl的版本有要求,可以在以上命令中加入Tag標籤,以便於在下一步的Dockerfile的FROM指令中明確Perl版本號。官方映象都有明確的標籤資訊。

第二步,在Perl專案中新建Dockerfile:

FROM perl:5.20
COPY . /usr/src/myapp
WORKDIR /usr/src/myapp
CMD [ "perl", "./perl-sample.pl" ]

新建perl-sample.pl檔案:

#!/usr/bin/perl
print "Hello, World!
";

第三步,通過此Dockerfile,構建自定義的映象:

$ docker build -t perl-image .

構建成功後,使用者可以通過docker images檢視:

$ docker images

REPOSITORY          TAG       IMAGE ID        CREATED              VIRTUAL SIZE

perl-image          latest    bc28eba086ad    About a minute ago   654.9 MB

最後,建立容器並執行:

$ docker run -it –rm –name perl-container perl-image

Hello, World!

如果只需要執行單個的Perl指令碼,那麼無需使用Dockerfile構建自定義映象,而是通過以下命令直接使用官方Perl映象,帶引數執行容器:

$ docker run -it –rm –name perl-container -v “$(pwd)”:/usr/src/myapp -w /usr/src/myapp perl:5.20 perl perl-sample.pl

Hello, World!

如果需要執行Perl的Web專案,則最好先自建內建SSH服務的映象,然後以此為基礎定製Perl容器,這樣可以方便地通過SSH服務訪問Perl容器。

R

R是一個面向統計分析和繪圖的語言,是由紐西蘭奧克蘭大學統計學系的Ross Ihaka和Robert Gentleman共同創立。R帶有大量的統計軟體包,如常見的貝葉斯推斷、聚類分析、機器學習、空間統計、穩健統計等,在生物資訊、統計學等領域應用廣泛。

Rocker專案是一個Docker官方支援的專案,它提供了R語言的容器環境支援。官方提供的r-base映象就是基於Rocker專案的。

1.執行互動式R語言環境

可以直接執行官方提供的r-base映象,進入互動模式的R環境:

$ docker run -ti –rm r-base

退出互動命令列時,可以使用quit()指令,此時可以選擇是否儲存工作空間:

> quit()

Save workspace image? [y/n/c]:

2.執行R語言批量模式

可以通過連線工作目錄,來執行R語言的批量指令。把一個卷(volume)連線至容器時,最好使用一個非根使用者,這樣可以避免許可權問題:

$ docker run -ti –rm -v “$PWD”:/home/docker -w /home/docker -u docker r-base R 

3.執行R語言命令列模式

可以直接進入R容器的bash命令列:

$ docker run -ti –rm r-base bash

root@4a0bba3f4cb4:/#

在bash中如果希望進入R語言互動命令列,可以直接輸入R:

root@4a0bba3f4cb4:/bin# R

>

可以使用vim.tiny編輯器,新建r-demo.R指令碼:

print(“Hello,World!”)

儲存後,就可以使用Rscript指令執行此指令碼:

root@4a0bba3f4cb4:/bin# Rscript demo.R

Rscript demo.R

[1] “Hello,World!”

還可以在R語言互動命令列中執行R指令碼。

首先,在容器中新建hi.R指令碼:

hello <- function( name ) {
sprintf( "Hello, %s", name );
}

然後直接輸入R指令進入互動命令列,使用source()函式載入指令碼,再使用hello()函式呼叫使用者的列印邏輯:

> source(`/bin/hi.R`)
> hello(`docker`)
[1] "Hello, docker"
>

4.使用自定義容器

在使用者將手頭的R專案容器化的過程中,往往需要加入自己的環境構建邏輯,也需要執行自定義容器。

這種情況下,使用者就需要基於官方提供的r-base基礎映象,完成自定義的Dockerfile,例如:

FROM r-base:latest
COPY . /usr/local/src/r-scripts
WORKDIR /usr/local/src/r-scripts
CMD ["Rscript", "running-r-scripts.R"]

其中running-r-scripts.R內容可以簡寫為:print(“My R Container!”)

然後,使用docker build指令構建:

$ docker build -t my-r-container /directry/of/Dockerfile

然後使用docker run指令執行容器,並通過docker ps指令檢視執行狀態:

$ docker run -d my-r-container

e86739e8226a081372d9bb0fb9f62a32405814b5172a543487b0751839c2e57f

Erlang

Erlang是一種用來構建大規模彈性、實時、高併發、高可用系統的程式語言,被廣泛應用於電信、銀行、電子商務和即時訊息領域。Erlang的執行時系統內建支援併發、分散式和容錯機制。Erlang由愛立信所轄的CS-Lab於1987年開發,目的是創造一種可以應對大規模併發活動的程式語言和執行環境。

1.使用官方映象

可以使用erlang映象,直接進入Erlang互動命令列Eshell:

$ docker run -it –rm erlang:latest

Erlang/OTP 18 [erts-7.3.1] [source] [64-bit] [async-threads:10] [hipe] [kernel-poll:false]
Eshell V7.3.1  (abort with ^G)
1> uptime().
3 minutes and 3 seconds
ok
2>

可以使用ctl+G進入任務切換模式,其中j為列出所有任務:

User switch command
--> j
1* {shell,start,[init]}
--> q

$ docker run -it –rm -h erlang.local erlang erl -name allen

Erlang/OTP 18 [erts-7.3.1] [source] [64-bit] [async-threads:10] [hipe] [kernel-poll:false]
Eshell V7.3.1  (abort with ^G)
(allen)1> erlang:system_info(otp_release).
"18"
(allen)2>
User switch command
--> q

2.直接執行Erlang指令碼

可以直接使用docker run指令,通過escript執行Erlang指令碼。

下面以斐波那契數列作為例子進行講解。

首先,新建fab.erl檔案:

#!/usr/bin/env escript
%% -*- erlang -*-
main([String]) ->
try
N = list_to_integer(String),
F = fac(N),
io:format("factorial ~w = ~w
", [N,F])
catch
_:_ ->
usage()
end;
main(_) ->
usage().
usage() ->
io:format("usage: factorial integer
"),
halt(1).
fac(0) -> 1;
fac(N) -> N * fac(N-1).

儲存後,使用docker run指令執行:

$ docker run -it –rm –name erlang-inst1 -v “$PWD”:/usr/src/myapp -w /usr/src/myapp erlang escript fab.erl 5

factorial 5 = 120

可見已輸出factorial 5=120計算結果。

 

 

 


相關文章