Docker 入门
1 docker 是什么,解决什么问题?
- docker 将要程序和环境一起打包成一个镜像,可保证环境一致性。
- docker 容器启动速度非常快,快速部署和扩容。
- 每个镜像有独立的版本,可以用于快速回滚。
还有依赖管理、资源隔离、可移植性等特点。
2 镜像
2.1 基础镜像是什么?
docker 是由多层(layers)组成的,每一层代表镜像的一次变化,这些层叠加在一起,形成一个完整的文件系统。基础镜像是构建容器镜像的起点。可以在其上安装和配置应用及依赖项,就是叠加层。
基础镜像有:
alpine (https://hub.docker.com/_/alpine)
busybox(https://hub.docker.com/_/busybox)
2.2 Dockerfile
有了基础镜像还不够,还需要安装必要的依赖。我们公司选择的基础镜像是 alpine (https://hub.docker.com/_/alpine)镜像,并在此基础上增加了依赖项,作为我们自己的基础镜像
,便于使用。下面是公司基础镜像的 Dockerfile,这个Dockerfile 声明了基础镜像(FROM),以及安装的依赖项(RUN)。
FROM --platform=linux/amd64 alpine:3.18.5
RUN echo "https://mirrors.aliyun.com/alpine/v3.18/main/" > /etc/apk/repositories
RUN echo "https://mirrors.aliyun.com/alpine/v3.18/community/" >> /etc/apk/repositories
RUN apk update
RUN apk --no-cache add ca-certificates
RUN apk --no-cache add tzdata && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
echo "Asia/Shanghai" > /etc/timezone
这里的镜像有优化空间,比如:将RUN合并成一条,可以减少层。
2.3 构建镜像
有了 Dockerfile,我们就可以使用 docker build
命令构建镜像,下面案例构建了公司的基础镜像。
docker build ./ -f Dockerfile -t test-registry.cn-shanghai.cr.aliyuncs.com/public-test/alpine:3.18
2.4 容器镜像仓库
容器镜像仓库(Docker Registry)是一个用于存储和分发容器镜像的系统,和代码仓库类似。企业内一般私有化部署,或者使用云服务。比如公司有生产和测试两个registry:
- 生产:registry.cn-beijing.cr.aliyuncs.com
- 测试:test-registry.cn-shanghai.cr.aliyuncs.com
我们本地可以使用 push 和 pull 来进行镜像推送和拉取。生产环境一般通过流水线进行推送,在 K8S可以通过配置拉取镜像部署,本质上也是通过 push 和 pull 实现。
docker push test-registry.cn-shanghai.cr.aliyuncs.com/public-test/alpine:3.18docker pull test-registry.cn-shanghai.cr.aliyuncs.com/public-test/alpine:3.18
容器的名称包含4段: {registry主机名}/{namespace}/{name}:{tag}私有化部署通常需要鉴权,可以针对 namespace 粒度的权限分配,使用前需要进行 docker login 登录。
docker login --username=brian@xxxx registry.cn-beijing.cr.aliyuncs.com
2.5 项目镜像
对于 docker 来说没有项目镜像的说法,我们 Go 项目的镜像是将 go build 之后的二进制文件拷贝到基础镜像中。并且可以添加运行必要的文件。 docker build 时默认会以 Dockerfile 所在目录作为构建上下文,可以使用 ADD
COPY
等命令将该目录的文件拷贝到 docker 中,示例如下:
FROM test-registry.cn-shanghai.cr.aliyuncs.com/public-test/alpine:3.18
ADD bin/server /server
ADD assets /assets/
ENTRYPOINT [ "/server" ]
3 容器(Container)
使用 docker pull 把镜像拉取下来,再使用 docker run 把镜像“解压缩”获得独立的环境和应用程序,并运行起来。这样一个独立的环境和应用程序就是容器。我们可以在一个操作系统上启动多个容器,且这些容器都是互相独立、互相隔离的。
docker pull test-registry.cn-shanghai.cr.aliyuncs.com/public-test/alpine:3.18docker run test-registry.cn-shanghai.cr.aliyuncs.com/public-test/alpine:3.18 sleep 10