Docker入门与进阶(一)

1,139 阅读6分钟

Docker入门与进阶(一)

   在日常写代码时,假设使用golang写了一个web服务,我们可能会用到golang环境,数据库mysql,中间件redis和kafka等,当你换了个电脑或者需要在服务器上部署web服务,需要将所有环境重新配置一遍,经历过的人都懂,这是多么繁琐且耗时的事,这时docker就出现了,刚好解决这个问题。

   本系列只记录本人使用docker过程学习到的内容,可能有些欠缺,其余内容请自行查阅。

docker安装

自行安装,本文演示为Linux环境

docker使用

   docker是一种容器技术,启动的每个docker容器之间互不影响,容器本质还是实体机的进程,且方便移植,所以方便在不同的主机上配置环境。

   docker里有这样几个主要概念:镜像image容器containerdocker-hubdockerfile文件。镜像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缓存,若服务器磁盘空间略小,可将其清除。

另可参考的文章:

Docker常用命令

关于docker安装mysql一系列

关于docker安装redis一系列

关于docker安装kafka一系列

查看容器的内网ip