Docker好久没玩了,一方面,这个是属于运维的范畴。另一方面精力真有限。今天老婆上班去了,小孩放假不用去鸡娃,给自己一点时间研究一下Golang如何在Docker下运行
正好Windows11 预览版已发布,我就采用在Wsl里运行Ubuntu,再在Ubuntu里运行Docker。
Wsl和Ubuntu如何安装就跳过了,不再描述。wsl要为wsl2版本 : wsl -l -v
提示:Ubuntu里的源一定要换成国内的。 关闭Ubuntu防火墙:sudo ufw disable
一、Docker的安装 sudo sh get-docker.sh $ sudo service docker start
二、Golang的环境安装 比如地址为:/maque/golang 新建目录:
mkdir /maque/golang
切换到地址
cd /maque/golang
下载golang :
wget https://studygolang.com/dl/golang/go1.16.5.linux-amd64.tar.gz
如何地址被 墙了,则先下载之后,用xftp上传 (这里也涉及到ssh的一大堆问题) 解压:
tar -zxvf go1.16.5.linux-amd64.tar.gz
把golang加入到 配置文件 vi /etc/profile
// 在最后一行添加
export GOROOT=/maque/golang/go
export PATH=$PATH:$GOROOT/bin
// wq保存退出后source一下
source /etc/profile
测试 看go环境是否正常
go version
go version go1.16.5 linux/amd64
把golang的代理切换成七牛或阿里
$ go env -w GO111MODULE=on
$ go env -w GOPROXY=https://goproxy.cn
三、Hello 代码编写 我这里编写一个最简单的http hello world程序 新建一个目录 ,并切换
mkdir /maque/hello
用vi 新建一个go文件 vi hello.go
package main
import (
"fmt"
"net/http"
)
func main(){
fmt.Println("hello")
http.HandleFunc("/",func(w http.ResponseWriter,r *http.Request) {
fmt.Fprintln(w,"Hello world",r.URL.Path)
})
http.ListenAndServe(":8081",nil)
}
进行编译 go build hello.go ,在这里可以直接运行
./hello
如果正常的情况可以在windows浏览器里输入 http://localhost:8081 可以看到 内容 了
按ctrl +c 退出hello 程序
四、Dockerfile的编写 我们开始编写 dockerfile的镜像。由于原生的golang镜像太大了,有500多M,我这里采用 alpine 作为运行的镜像源 alpine只有5.3M 这样打包出来的hello 程序也只有 17 M
FROM alpine
RUN mkdir /hello
RUN mkdir /lib64
RUN ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2
COPY ./hello /hello
COPY ./build.sh /hello
WORKDIR /hello
RUN chmod +x hello
EXPOSE 8081
CMD ["sh","/hello/build.sh"]
RUN mkdir /lib64 RUN ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2 这两行主要为了解决 alpine的代码没有相依赖包的情况 创建 程序自动运行的脚本 build.sh
#!/usr/bin/env bash
cd /hello && ./hello
五、编写镜像,并运行容器 这个时间就可以开始创建镜像了
docker build -t hello:1.1 .
最后面有一个点不要少
运行 docker images 看镜像有了没有
再创建一个容器
docker run -d -it -p 8081:8081 hello:1.1
正常情况下就可以运行了 windows浏览器打开 http://localhost:8081/ 就可以看到内容
一些其它的docker命令 查看所有容器:docker ps -a 启动容器:docker start 容器ID 停止容器:docker stop 容器ID 删除容器:docker rm 容器ID
查看所有镜像:docker images 删除镜像:docker image rm 镜像名