Docker入门与进阶(一)
在日常写代码时,假设使用golang写了一个web服务,我们可能会用到golang环境,数据库mysql,中间件redis和kafka等,当你换了个电脑或者需要在服务器上部署web服务,需要将所有环境重新配置一遍,经历过的人都懂,这是多么繁琐且耗时的事,这时docker就出现了,刚好解决这个问题。
本系列只记录本人使用docker过程学习到的内容,可能有些欠缺,其余内容请自行查阅。
docker安装
自行安装,本文演示为Linux环境
docker使用
docker是一种容器技术,启动的每个docker容器之间互不影响,容器本质还是实体机的进程,且方便移植,所以方便在不同的主机上配置环境。
docker里有这样几个主要概念:镜像image,容器container,docker-hub,dockerfile文件。镜像image类比面向对象中的对象;容器container类比面向对象中的实例;一般来说,docker根据一个镜像构建一个容器;而镜像文件可以根据dockerfile构建或docker-hub获取。
dockerfile是一个文件,支持自定义;docker可以根据dockerfile文件构建镜像,之后可以选择将镜像上传到docker-hub或者继续构建容器container。其中,docker-hub是一个官方开源的镜像库,里面存储大量的基础镜像,可以从中拉取常用的基础镜像,比如mysql,redis等。 下面简单演示使用Dockerfile构建(Linux环境):
- 目录:
go-web:
|-main.go
|-Dockerfile
|-go.mod
- main.go:其中fmt.Println("hello world")的作用是打印hello world
package main
import "fmt"
func main() {
fmt.Println("hello world")
}
- Dockerfile:
# from字段用于指定基础镜像,此处基础镜像为golang:1.21.1-alpine
FROM golang:1.21.1-alpine
# env用于设置环境变量
ENV GO111MODULE=on \
CGO_ENABLED=0 \
GOOS=linux \
GOARCH=amd64 \
GOPROXY="https://goproxy.cn,direct"
# workdir用于设置工作目录
WORKDIR /go-web
# copy用于将主机目录下的文件复制到镜像中
COPY . /go-web/
# run用于执行命令,此处两条命令为编译golang代码和生成可执行文件main
RUN go mod tidy
RUN go build -o main .
# cmd用于设置容器启动时执行的命令
CMD ["./main"]
# run字段是在镜像构建过程执行命令,cmd命令是在容器启动时执行命令,注意区分
# 如果是web服务,对外暴露接口,需要使用expose字段
- go.mod:
module go-web
go 1.21.1
上述Dockerfile文件的字段介绍已写在注释。
接下来利用docker构建镜像:
# 利用Dockerfile文件构建镜像,使用build命令,-t是指定镜像tag或名字
docker build -t main .
# 根据镜像运行容器的命令,--name是指定容器名字,后面的main指的是根据main镜像构建,若是web服务,可添加-p字段,例如:
# docker run -p 80:80 --name main main
# 其中80:80是将容器的80端口映射到主机的80端口
docker run --name main main
Linux环境演示:
注意:要在go-web文件夹下开终端,Dockerfile文件一般放在根目录下。
[root@instance-IAAU0QOb go-web]# docker build -t main .
[+] Building 1.6s (10/10) FINISHED docker:default
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 808B 0.0s
=> [internal] load metadata for docker.io/library/golang:1.21.0-alpine 1.6s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [1/5] FROM docker.io/library/golang:1.21.0-alpine@sha256:445f34008a77b0b98bf1821bf7ef5e37bb63cc42d22ee7c21cc17041070d134f 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 83B 0.0s
=> CACHED [2/5] WORKDIR /go-web 0.0s
=> CACHED [3/5] COPY . /go-web/ 0.0s
=> CACHED [4/5] RUN go mod tidy 0.0s
=> CACHED [5/5] RUN go build -o main . 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:24265cb71750165d10aab23469ea610fa319def1f5d9e383b10116524766232c 0.0s
=> => naming to docker.io/library/main 0.0s
[root@instance-IAAU0QOb go-web]# docker run --name main main
hello world
[root@instance-IAAU0QOb go-web]#
docker常用命令
以上是docker的简单使用,下面介绍一些本人常用到的docker命令。
# 关于镜像
docker images # 查看该主机上存在的镜像文件
docker build -t 镜像名 . # 构建镜像
docker rmi 镜像名 # 删除镜像,镜像名或者镜像id都可
docker search 镜像名 # 从docker-hub中搜索镜像
docker pull 镜像名 # 从docker-hub中拉取镜像
# 关于容器
docker ps # 查看该主机上正在运行的容器
docker ps -a # 查看该主机上已有的容器
docker run --name 容器名 镜像名 # 运行容器(第一次根据镜像构建容器)
docker run -p 宿主端口:容器端口 --name 容器名 镜像名 # 带映射端口的运行容器
docker start 容器名 # 启动容器(启动已经docker run过的容器)
docker stop 容器名 # 停止正在运行的容器
docker rm 容器名 # 根据容器名或者容器id删除容器(只能删除已停止的容器)
docker exec -it 容器名 /bin/sh # 进入容器(进入容器进行操作,例如进入mysql容器进行建库建表等操作)
docker restart 容器名 # 重启容器
# 主机在使用docker过程中会产生很多缓存和垃圾等,以下是本人使用过的相关内容
# 以及一些其他命令
docker system info # 查看docker服务详细信息和当前资源使用情况
docker system df # 用于查看docker各种资源的磁盘空间和使用情况
docker logs 容器名 --tail 100 -f # #查看最后100行日志,并且一直输出最新的日志
docker builder prune # 一键清理 Build Cache 缓存命令
# Docker 18.09 引入了 BuildKit ,提升了构建过程的性能、安全、存储管理等能力。
# docker system df 命令,类似于 Linux上的 df 命令,用于查看 Docker 的磁盘使用情况
本人服务器下:
[root@instance-IAAU0QOb go-web]# docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 7 6 4.74GB 1.663GB (35%)
Containers 6 5 2.606MB 0B (0%)
Local Volumes 19 4 2.274GB 67.12MB (2%)
Build Cache 85 0 7.107GB 7.107GB
Images 所有镜像占用的空间,包括拉取下来的镜像,和本地构建的。
Containers 运行的容器占用的空间,表示每个容器的读写层的空间。
Local Volumes 容器挂载本地数据卷的空间。
Build Cache 镜像构建过程中产生的缓存空间(只有在使用 BuildKit 时才有,Docker 18.09 以后可用)。
最后的 RECLAIMABLE 这一列表示可回收的大小。
# 一键清理 Build Cache 缓存命令
docker builder prune
# 如果你希望保留最近一定时间的缓存,删除时长更久的缓存,可以通过添加 --filter 参数实现,例如保留最近10天的缓存示例命令如下:
docker builder prune --filter 'until=240h'
本人在使用docker过程中,突然发现磁盘容量飙升,查看解决办法时无意发现该命令,正常使用过程占据最大的也就是Build Cache缓存,若服务器磁盘空间略小,可将其清除。
另可参考的文章: