【Docker 01】搭建本地仓库及构建镜像

278 阅读3分钟

本文主要有如下内容:

  • 构建本地仓库
  • 以Java代码为例生成image
  • 推送image到本地镜像

构建本地仓库

在本机上构建本地仓库只要执行一条命令即可 docker pull registryregistry默认会把镜像存储在/var/lib/registry目录下。 把此目录和宿主机目录/opt/docker/registry-hub/images-data (自定义的)挂载在一起。通过如下命令启动容器:

docker run -d -p 15000:5000 --name local-registry -v /opt/docker/registry-hub/images-data:/var/lib/registry registry

此时通过http://localhost:15000/v2/_catalog访问可看到一个空数组,这是因为本地仓库里面没有任何镜像。

springboot项目生成image

新建一个springboot项目,启动类代码如下:

@SpringBootApplication
public class Application {
​
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
​
    @RestController
    class ImagesController {
​
        @GetMapping("/images")
        public String images() {
            return "hello docker image!";
        }
​
    }
}

接着编写Dockerfile文件 和pom.xml同一目录。

# 第一阶段 使用 Maven 进行构建的阶段
FROM maven:3.8.4-openjdk-11 AS build
# 设置工作目录
WORKDIR /app
# 将 pom.xml 和源代码复制到工作目录
COPY pom.xml .
COPY src ./src
# 使用 Maven 打包应用程序 这里会生成target目录
RUN mvn clean package -DskipTests
​
# 第二阶段构建构建最终image
FROM openjdk:11-jre-slim
# 设置容器内的工作工作目录
WORKDIR /app
# 复制第一阶段打包后的 jar 文件到工作目录 这里build和第一阶段build是同一个
COPY --from=build /app/target/spring-image-1.0-SNAPSHOT.jar app.jar
# 暴露应用程序运行的端口
EXPOSE 8080
# 设置容器启动时运行的命令
CMD ["java", "-jar", "app.jar"]

在此目录打开终端执行构建命令docker build -t spring-boot-image .spring-boot-image为镜像名称。.代表Dockerfile文件的目录以及上下文、这里就是指的当前目录。

  • 如果要指定运行平台、可以指在配置文件中配置FROM --platform=linux/amd64 ubuntu:20.04
  • 也可以通过docker buildx指定。docker buildx build --platform linux/amd64,linux/arm64 -t myimage:latest .

此时可以通过docker run命令运行此镜像、如果正常运行、则证明已经成功、如果运行失败可以查看相关报错信息。如:

  • ERROR [stage-1 3/3] COPY --from=build /app/target/spring-image-1.0.0.jar app.jar: 在构建image时jar名称写错。
  • no main manifest attribute :镜像构建成功、启动时没有找到主类、这是因为打包时错误、需要修改pom.xml中打包方式。

如果项目正常启动、并能正常访问到/images路由、则可进行下一步。

推送image到本地仓库

在上述的步骤没有任何问题的情况下只需要使用如下两个命令:

  • docker tag:取别名、指定仓库
  • docker push:推送

使用docker tag命令打标签docker tag spring-boot-image localhost:15000/myimage:v1.0localhost:15000代表本地的注册表地址。

使用如下命令docker push localhost:15000/myimage:v1.0 推送到本地仓库。

此时通过http://localhost:15000/v2/_catalog就可以看到已经推送到镜像了。