如果你是处学者,连docker是什么都不知道,那么我这篇博客将直接上手docker,帮助打包第一个项目代码。
首先我们先要明白docker它是什么东西,主要干什么。初学者理解docker只要知道他是一个可以让你的代码放在别人的电脑上也能顺利运行的东西,那么干的就是把你电脑上的代码运行的环境一起打包到别人的电脑上,这样听起来有点麻烦,环境这么大的一个东西,要放到被人电脑上一个还好很多个的话不直接炸了吗,哎,这就是docker的最便捷的地方,他不是给每个程序都复制一整套操作系统,而是通过镜像、分层和复用,把真正需要的东西组织起来。好了涉及到专业名词了,接下来让我
镜像是什么,他有什么用,首先镜像和镜子一点边都不沾,你只要知道他是一个做月饼模具,可以做出同一个形状的月饼。就像镜像里面提前准备好了程序运行所需要的环境和文件。根据同一个镜像,我们可以做出一个、两个甚至很多个环境相同的容器,做出来下一步就是吃了,哈哈,月饼可以说吃,但容器就是用了,那容器是什么呢?简单来说,容器就是根据镜像这个模板创建出来的一个实际运行环境,你的代码会在这个环境里真正运行起来。所以你可以先记住一句话:镜像是模具,容器是根据模具做出来并运行起来的东西。
那这个和打包有什么关系,聪明的你肯定想到了可以将你代码运行所需要的环境、依赖和相关文件打包成一个Docker镜像,只要把你的镜像传到别人的电脑里就可以运行你的代码了,没错这就是打包的核心概念,其余的步骤都在围绕怎么让这个打包出来的东西更小、更高效,以及怎么让我们管理和运行这些容器更加方便。
好了废话不多说直接上命令
假如说这是你的一个项目,代码结构分为客户端和服务端两个部分,那应该怎么打包呢?很明显,客户端和服务端虽然属于同一个项目,但它们实际上是两个需要独立运行的程序,所以我们不能简单地把它们全部塞进一个容器里。一般来说,我们会分别为客户端和服务端构建镜像,也就是一个项目对应两个镜像。那问题来了,镜像到底怎么构建?这时候就需要用到Dockerfile。Dockerfile是什么?一句话就是告诉docker,这个镜像我要使用什么基础环境、把哪些代码复制进去、安装哪些依赖、怎么编译程序,以及容器启动之后应该执行什么命令。例如:
# 1. 准备 Go 编译环境 FROM golang:alpine # 2. 设置容器里的工作目录 WORKDIR /app # 3. 把 go.mod 复制进去 COPY go.mod ./ # 4. 下载项目依赖 RUN go mod download # 5. 把项目代码复制进去 COPY . . # 6. 编译服务端程序 RUN go build -o server ./cmd/server # 7. 声明服务端使用 8080 端口 EXPOSE 8080 # 8. 容器启动时运行 server CMD ["./server"]这样虽然看起来很麻烦,但是你只需要知道一个dockerfile文件有什么就行,至于怎么写你当然可以直接发给ai,按照格式书写。接下来就是客户端了,和此格式可能会有些出入,主要还是以ai为主。
其实这样写,就可以把这个文件上传到虚拟机(可以自行搜索怎么把windows上的文件上传倒虚拟机里),然后通过命令来构建环境
docker build -f Dockerfile.server -t chat-room-server .如果是客户端:
docker build -f Dockerfile.client -t chat-room-client .可以把这个过程理解成:
Dockerfile + 项目代码 ↓ docker build ↓ Docker 镜像其中:
docker build 开始构建镜像 -f Dockerfile.client 指定使用 Dockerfile.client -t chat-room-client 给构建出来的镜像命名 . 使用当前目录作为构建上下文镜像构建完成之后,可以通过docker images 来查看镜像是否构建完成
镜像构建完成之后就可以开始做“月饼”了,就是构建并启动容器:
docker run -d --name chat-room-server -p 8080:8080 chat-room-server这里要涉及到一个特别的点
-p 8080:8080
这两个8080 不是同一个东西,分别代表
-p 宿主机端口 : 容器端口 ↑ ↑ 8080 8080也就是:
把虚拟机(宿主机)的 8080 端口,映射到容器里的 8080 端口。
这个要根据你的实际情况来写
到这里,镜像和容器都准备好了,那是不是就可以直接运行了呢?哈哈,还差最后一个小问题。我们在 Windows 上运行客户端和服务端时,它们本质上是在同一台电脑上,通过localhost:8080就可以找到对方;但是现在把它们放进 Docker 之后,客户端和服务端变成了两个独立的容器,它们需要先处在同一个 Docker 网络里,客户端才能找到服务端。所以接下来我们要做的事情就是:创建一个 Docker 网络,把客户端和服务端放进去,让它们能够互相通信。听起来是不是很麻烦但实际上就一个命令
docker network create chat-room-net然后把服务端容器加入这个网络
docker network connect chat-room-net chat-room-server因为客户端是每加入一个都需要运行一个容器的所以直接启动客户端容器时指定这个网络:
docker run --rm -it \ --network chat-room-net \ -e SERVER_ADDR=chat-room-server:8080 \ chat-room-client这样一顿操作之后你的代码就可以在任意电脑上的虚拟机里成功运行了,不过你是不是觉得非常麻烦,有什么方法可以直接一键启动吗,有的,兄弟有的。他就是Compose。不过这个就是纯文件内容了,下期再讲吧,希望对你有帮助