ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

06|把你的Docker容器用起来

2021-12-26 23:31:14  阅读:198  来源: 互联网

标签:容器 06 Dockerfile docker 镜像 Docker 8000 hello


之前讲了很多原理性的东西,基本上已经把Docker的大概原理阐述了一遍,这次我们就通过运行一个实例,把Docker容器用起来。

我们先自己用Go语言写一个简单的web服务器程序hello.go,然后再用Docker把它跑起来,Go程序源码如下:

package main

import (
    "io"
    "net/http"
)

func hello(w http.ResponseWriter, r *http.Request) {
    io.WriteString(w, "Hello world!")
}

func main() {
    http.HandleFunc("/", hello)
    http.ListenAndServe(":8000", nil)
}

这个程序非常简单,就是启动一个简单的web服务器程序并监听8000端口,当使用浏览器访问IP:8000/这个地址的时候,程序会给浏览器返回Hello world!

想把上面的程序通过Docker的方式运行起来,就需要制作一个Docker镜像,而制作Docker镜像非常方便的方式就是使用Dockerfile,Dockerfile在这里应该做的事主要是两个:

  • 将上面的Go程序编译
  • 把编译好的Go程序封装在Docker镜像中

上面说到的两个步骤,是可以直接通过一个Dockerfile来实现的,也就是Dockerfile的多阶段构建功能(multi-stage), Dockerfile内容如下:

# 使用官方提供的 GO 镜像来编译我们的程序
FROM golang:1.17
 
# 将工作目录切换为 /compile
WORKDIR /compile
 
# 将 hello.go 程序复制到镜像中的/compile目录下
COPY hello.go /compile
 
# 编译生成 hello 可执行程序
RUN GOOS=linux go build hello.go

# 使用alpine作为基础镜像
FROM alpine:3.15.0

# 将工作目录切换为 /app
WORKDIR /app

# alpine 执行 Go 程序需要先安装一下依赖
RUN mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2

# 从第一阶段复制 hello 可执行程序到当前目录
COPY --from=0 /compile/hello ./

# 允许外界访问容器的 8000 端口,不写也会默认暴露端口,写上相当于起一个注释的作用
EXPOSE 8000
 
# 启动 hello 可执行程序
CMD ["./hello"]

在本机工作目录中,执行Dockerfile构建以生成新的镜像:

$ ls
Dockerfile hello.go

$ docker build -t hello .

-t 是给镜像起一个可读的名字,注意最后还有一个 . 代表Dockerfile所在的目录。

docker build正确执行成功后,就可以看到新的镜像已经生了:

$ docker images
REPOSITORY          TAG       IMAGE ID       CREATED          SIZE
hello               latest    56173fb23f12   15 minutes ago   11.7MB

下面使用docker run命令将此镜像运行起来:

$ docker run -d -p 8000:8000 56173fb23f12

我们的Go程序监听的是容器的8000端口,这里使用-p指定把容器的8000端口映射到宿主机的8000端口,这样就可以直接使用我本机的浏览器进行访问了。

使用浏览器进行访问:

这样我们的镜像就已经测试完成了,通常我们制作的镜像希望分享给其它人使用,一般公司内部会使用Harbor搭建镜像仓库供内部人员使用,这里我们可以把镜像传到DockerHub公共镜像仓库上去,这样我们的镜像可以被互联网上所有人看到并下载使用,如果没有DockerHub帐号,则先要去官网创建帐号和自己的仓库:DockerHub

使用docker login命令登录到DockerHub上:

$ docker login
输入用户名和密码

Login Succeeded

我的Docker仓库的名字是hackercracker/test,要根据这个仓库名称给本地的镜像改个名字:

$ docker tag hello hackercracker/test:v1

把镜像推到DockerHub上:

$ docker push hackercracker/test:v1

The push refers to repository [docker.io/hackercracker/test]
24ba23593bae: Pushed
639949c6c224: Pushed
c282b654e2d7: Pushed
8d3ac3489996: Mounted from library/alpine
v1: digest: sha256:0d45ef82dd579e51fe81b30f7e43071a745a485fcef51867e018970ec205a73d size: 1153

至此,镜像就成功推到DockerHub上了。

标签:容器,06,Dockerfile,docker,镜像,Docker,8000,hello
来源: https://blog.csdn.net/weixin_39660205/article/details/122163044

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有