製作docker映像(二)--golang應用程序

本文以簡單golang應用爲例,介紹docker映像製作。

1.創建Dockerfile

工程目錄結構如下:

[lanyang@localhost docker_demo]$ mkdir -p myapp2
[lanyang@localhost docker_demo]$ cd myapp2/
[lanyang@localhost myapp]$ ll
$ ll
total 8
-rw-rw-r--. 1 lanyang lanyang 115 Feb 15 17:26 Dockerfile
-rw-rw-r--. 1 lanyang lanyang  94 Feb 15 17:23 hello.go

Dockerfile文件內容如下:

FROM golang:1.13
RUN mkdir -p /opt/app
WORKDIR /opt/app
COPY hello.go .
RUN go build -o hello hello.go
CMD ./hello

使用golang編寫程序hello.go,編譯並在容器中執行。

FROM 指定基礎映像,golang:1.13.

RUN mkdir 在映像中創建路徑。

WORKDIR 指定工作目錄。

COPYhello.go拷貝到映像中。

RUN go build 編譯文件。

CMD 執行編譯生成的可執行文件。

每條命令的具體含義可參考上一篇文章製作docker映像(一)

hello.go文件

文件內容如下:

package main

import (
        "fmt"
        "time"
)

func main() {

        for i:=0; i<10; i++ {
                fmt.Println("Hello golang from Docker!")
                time.Sleep(10*time.Second)
        }
}

每10s打印一條日誌,一共打印10次。

2.構建映像

接着,使用上面創建的Dockerfile構建映像。

命令如下:

[lanyang@localhost myapp2]$ docker build -t myapp2 .
Sending build context to Docker daemon  3.072kB
Step 1/6 : FROM golang:1.13
 ---> 297e5bf50f50
Step 2/6 : RUN mkdir -p /opt/app
 ---> Using cache
 ---> 0d3903be2f95
Step 3/6 : WORKDIR /opt/app
 ---> Using cache
 ---> e0ab81b9f435
Step 4/6 : COPY hello.go .
 ---> Using cache
 ---> 1fc2b5d0f117
Step 5/6 : RUN go build -o hello  hello.go
 ---> Running in 83e1f900eaf2
Removing intermediate container 83e1f900eaf2
 ---> 7914106a6f5b
Step 6/6 : CMD ./hello
 ---> Running in 6510a8727de9
Removing intermediate container 6510a8727de9
 ---> ea93c8e5b411
Successfully built ea93c8e5b411
Successfully tagged myapp2:latest

其中,

-t 給構建映像打標籤,標籤格式name:tag。這裏沒有指定tag, 默認latest

. 上下文路徑,會將路徑下的所有文件打包到docker映像。
如果沒有指定,那麼默認上下文路徑就是 Dockerfile 所在的位置。

3.測試映像

使用剛纔創建的映像啓動容器:

[lanyang@localhost ~]$ docker run -d --name myapp2-test myapp2
697b681f73e0e7f2322ea2548bb8ea73e2df0ae4a41e997898000a42c7f8d228

其中,
myapp2 是映像名稱。

-d 表示後臺運行容器,並打印container id。

--name 指定容器名稱, 這裏構建的容器名稱爲myapp2-test

查看容器是否啓動:

[lanyang@localhost ~]$ docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS               NAMES
697b681f73e0        myapp2              "/bin/sh -c ./hello"   7 seconds ago       Up 6 seconds                            myapp2-test

查看容器打印的日誌:

[lanyang@localhost ~]$ docker logs myapp2-test
Hello golang from Docker!
Hello golang from Docker!
Hello golang from Docker!

[lanyang@localhost myapp2]$ docker logs myapp2-test
Hello golang from Docker!
Hello golang from Docker!
Hello golang from Docker!
Hello golang from Docker!

[lanyang@localhost myapp2]$ docker logs myapp2-test
Hello golang from Docker!
Hello golang from Docker!
Hello golang from Docker!
Hello golang from Docker!
Hello golang from Docker!
Hello golang from Docker!
Hello golang from Docker!
Hello golang from Docker!
Hello golang from Docker!

容器創建後,可以使用docker start啓動容器, 並使用-i參數,讓容器直接輸出到當前終端:

[lanyang@localhost ~]$ docker start myapp2-test -i
Hello golang from Docker!
Hello golang from Docker!
Hello golang from Docker!
Hello golang from Docker!
Hello golang from Docker!
Hello golang from Docker!
Hello golang from Docker!
Hello golang from Docker!
Hello golang from Docker!
Hello golang from Docker!
[lanyang@localhost ~]$ 

在容器中執行命令,查看拷貝的文件信息:

[lanyang@localhost myapp2]$ docker exec -it myapp2-test bash
root@697b681f73e0:/opt/app# 
root@697b681f73e0:/opt/app# pwd
/opt/app
root@697b681f73e0:/opt/app# ls
hello  hello.go
root@697b681f73e0:/opt/app# 

在容器中執行命令,需要容器正在運行,否則會出現錯誤。

可以看到,hello.go已拷貝到容器中,並被編譯成可執行 hello

4.參考

Docker Hub

發佈了471 篇原創文章 · 獲贊 170 · 訪問量 208萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章