Docker学习记录——构建本地镜像,从Windows向Ubuntu推送
一、在Windows打包Linux版本的go程序
$env:GOOS=linux
$env:GOARCH=amd64
go build -o release/HTTPServices-linux
二、给镜像打标签,推送到远端Ubuntu电脑
本次测试使用的VM的Ubuntu虚拟机,ip172.27.141.98就是Ubuntu虚拟机的ip地址。
1.Dockerfile文件内容
在工程目录下创建Dockerfile文件,没有扩展名。
# 使用空镜像(没有任何文件系统) 推荐使用alpine:latest但是需要联网下载,这里使用空镜像
FROM scratch# 维护者信息(可选)
LABEL maintainer="your-email@example.com"# 将 Go 编译好的二进制文件复制进去
COPY /release/HTTPServices-linux /HTTPServices-linux# 赋予执行权限
#RUN chmod +x /HTTPServices-linux# 声明端口(如 8080)
EXPOSE 8080# 启动命令(必须使用绝对路径)
CMD ["/HTTPServices-linux"]
2.给镜像打标签(设置版本号)
docker tag http-services:v1 172.27.141.98:5000/http-services:v1 .
docker tag <源镜像名> <目标镜像名>
:v1相当于版本号,每次打标签都要更新,等同于更新程序的版本号。
3.推送到远端镜像
docker push 172.27.141.98:5000/http-services:v1
类似git的使用,push/pull操作。
docker push 172.27.141.98:5000/http-services:v1
The push refers to repository [172.27.141.98:5000/http-services]
Get "https://172.27.141.98:5000/v2/": http: server gave HTTP response to HTTPS client
如果看到如下返回结果,是因为docker默认不支持http,需要修改配置文件,添加白名单。
在daemon.json中添加
"insecure-registries": ["172.27.141.98:5000"]
4.Ubuntu虚拟机拉取操作
docker pull 172.27.141.98:5000/http-services:v1
docker pull 172.17.0.1:5000/http-services:v1
Error response from daemon: Get "https://172.17.0.1:5000/v2/": http: server gave HTTP response to HTTPS client
如果看到如下返回结果,是因为docker默认不支持http,需要修改配置文件,添加白名单。
5.运行镜像
docker run -d -p 8080:8080 --name http-svc 172.27.141.98:5000/http-services:v1
f841b8f3648f3912de9f54e25958e99136a6742193efc71fd6844d8c6d987e23
镜像成功运行后会返回镜像id,类型进程id。
docker run [选项] <镜像名>
-d=detached 模式 —— 让容器在后台运行
-p 8080:8080= 把 宿主机(你的机器)的 8080 端口,映射到 容器内部的 8080 端口
--name http-svc=给容器起一个名字(Name),默认情况下,Docker 会随机生成一个名字(如 f3a1b2c3d4e5),使用 --name 可以自定义名字,方便管理
172.27.141.98:5000/http-services:v1=私有镜像仓库地址/镜像名称
6.停止镜像,查看状态
docker stop http-svc
docker ps
三、遇到的问题
最主要遇到的问题还是docker hub不能访问,官方镜像不能下载,所以本次都是采用的不联网,使用本地镜像的方式,但是要注意docker必须是启动的,如Windows下的Docker Desktop必须是运行态的。
四、碎碎念,说下自己的理解
虽然使用docker运行的叫镜像,但是给我的感觉基本等同于git或svn的仓库。
我的理解是docker提供了一个仓库,在仓库中可以直接运行服务程序,并把这个仓库放到了部署服务器上。所以每次打包发版都可以执行类似git的操作,push后,在部署服务器上执行pull操作,以达到自动化部署和程序版本回退的效果。(我还是觉得自己写个bash或bat脚本也能做到这些功能……)