docker-01 创建一个自己的镜像并运行容器
前言
我们都知道使用Docker的镜像可以快速创建和部署应用,大大的节约了部署的时间。并且Docker 的镜像提供了除内核外完整的运行时环境,确保代码的环境一致性,从而不会在出现这段代码在我机器上没问题这类问题。
但是如果我们想创建一个镜像来运行自己的应用,该怎么做呢?我们在这里进行一个简单的尝试。
1、准备工作
- 首先我们要准备一个Linux环境,这里我使用的是Ubuntu 20.04。
- 其次,我们需要安装好Docker。可以通过
docker info
命令查看当前操作系统中是否安装了docker。 - 通过vscode连接到Linux环境,并安装好Go语言。
2、编写测试应用
我们创建一个文件夹docker-test,用来编写测试应用。
首先进行初始化,在当前的docker-test目录下执行go mod init docker-test
命令,创建go.mod文件。
然后,创建一个main.go文件,内容如下:
package main
import (
"fmt"
"time"
)
func main() {
for {
fmt.Println("Hello, world!")
time.Sleep(10 * time.Second)
}
}
这个文件只会每隔10秒输出一次"Hello, world!"。
为了在容器中可以编译运行Go语言程序,我们需要下载一个Go 官方提供的预装 Go 编译器的 Docker 镜像。
执行docker pull golang:latest
命令,下载golang镜像。
使用docker images
,查看当前系统中已经下载的镜像。
出现,golang:latest镜像,说明已经成功下载了golang:latest镜像。
3、构建镜像,并运行容器
3.1 构建镜像
现在我们已经准备好了测试应用,可以开始构建镜像了。
我们需要在当前docker-test目录下创建一个Dockerfile文件,用于构建镜像,内容如下:
# 使用官方 Go 镜像作为基础镜像
FROM golang:latest
# 设置工作目录
WORKDIR /app
#将当前目录下的所有文件复制到镜像的工作目录中
COPY . .
# 构建 Go 应用
RUN go build -o main main.go
# 运行可执行文件
# 运行 go 程序,(CMD:在启动容器时才执行此行。RUN:构建镜像时就执行此行)
CMD ["./main"]
这个Dockerfile文件中,我们使用golang:latest作为基础镜像,设置工作目录为/app,将当前目录下的所有文件复制到镜像的工作目录中,构建Go应用,并运行可执行文件。
执行docker build -t docker-test:latest .
命令,构建镜像。
其中,docker-test 是镜像的名称。latest 是镜像的标签(tag)。如果不指定 -t 选项,则 Docker 会为镜像分配一个默认的无标签状态。
标签帮助我们管理不同版本的镜像。例如,可以有 docker-test:1.0, docker-test:2.0 等版本。latest表示最新版本。
最后的.
表示构建上下文路径,构建镜像时,默认会在上下文路径中查找名为 Dockerfile 的文件,并依据这个文件来构建镜像。如果你想依据其他文件来构建镜像,或者Dockerfile在其他路径下,你可以用 -f 选项来指定 Dockerfile 的路径。
执行完成之后,再次运行docker images
命令,可以看到我们新构建的镜像 docker-test:lastest。
3.2 运行容器
现在,我们已经构建好了镜像,可以运行容器了。
执行docker run -d -it --name docker-test docker-test:latest
命令,运行容器。
其中:
- -d: 后台运行容器
- -it: 交互式运行容器,进入容器后可以输入命令
- –name: 为容器指定一个名称
- docker-test:latest: 运行的镜像名称
执行完成之后,运行docker ps
命令,可以看到我们新运行的容器,容器的名称为docker-test。
3.3 进入容器,查看效果
容器运行成功后,我们可以通过docker logs docker-test
命令查看容器的日志。
可以看到,容器已经打印出多次"Hello, world!"。
也可以通过docker attache
查看实时打印的消息。
执行docker exec -it docker-test /bin/bash
命令,进入容器。
发现容器已经进入容器的/app目录,即我们在 Dockerfile中设置的工作目录。
执行ls -l
命令,可以看到 docker-test 目录下的所有文件已经成功复制到镜像的工作目录中。
4、总结
本文介绍了如何创建自己的镜像并运行容器,通过这个例子,我们可以更加熟悉Dockerfile的编写,以及Docker镜像的相关操作。
文章参考了docker从安装到部署项目,一篇文章教会你。想要学习更多docker知识的小伙伴可以移步大佬的文章。