翔云

Just try, don't shy. 最新文章请点击
随笔 - 294, 文章 - 0, 评论 - 27, 阅读 - 49万
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

制作docker映像(二)--golang应用程序

Posted on   翔云123456  阅读(219)  评论(0编辑  收藏  举报

本文以简单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

编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示