O ambiente mac empacota o projeto go em uma imagem docker e a envia para o armazém de imagens do Alibaba Cloud

prefácio

Recentemente, o projeto precisa ser implantado por meio do k8s, então preciso empacotar meu projeto go back-end em uma imagem docker e executá-lo em um ambiente especificado, então registro a primeira vez que empacotei um projeto go em uma imagem docker em um mac

1. Goland cria um novo Dockerfile

Crie um novo Dockerfile no projeto
insira a descrição da imagem aqui

Dois, conteúdo do arquivo Dockerfile

Crie um novo arquivo Dockerfile com o seguinte conteúdo (este é o mais importante)

#源镜像
FROM golang:1.19-alpine3.16 as builder
#作者
MAINTAINER ic_xcc

RUN set -ex \
    && sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \
    && apk --update add tzdata \
    && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && apk --no-cache add ca-certificates

WORKDIR /build
# 创建了一个app-runner的用户, -D表示无密码
#RUN adduser -u 10001 -D app-runner
# 安装依赖包
ENV GOPROXY https://goproxy.cn
COPY go.mod .
COPY go.sum .
RUN go mod download
# 把当前目录的文件拷过去,编译代码
COPY . .
RUN CGO_ENABLED=0 GOARCH=amd64 GOOS=linux go build -a  -ldflags '-w -s' -o blockchain-middleware .

# 暴露服务端口
EXPOSE 8088
FROM alpine:3.16 AS final
# 把构建结果、配置文件(有的话)和用户的相关文件拷过去
WORKDIR /app
COPY --from=builder /build/blockchain-middleware /app
COPY --from=builder /build/conf /app/conf
COPY --from=builder /build/config.toml /app
# 下载时区包
COPY --from=builder /usr/share/zoneinfo /usr/share/zoneinfo
# 设置当前时区
COPY --from=builder /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# https ssl证书
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/

# 使用app-runner启动
#USER app-runner
ENTRYPOINT ["/app/blockchain-middleware"]

Há anotações no texto e a imagem espelhada é eficaz para testes pessoais

3. Inicie o docker e prepare-se para compilar a imagem

Como sou um computador mac, instalei o ambiente docker no computador antes e agora preciso abrir e executar meu docker
insira a descrição da imagem aqui

Problema no meio do caminho - quando o mac faz login no warehouse, ele exibe um erro http: o servidor deu uma resposta HTTP ao cliente HTTPS

Como o projeto exige que todos os armazéns-espelho sejam carregados no mesmo endereço dependente, e esse endereço é diferente da Internet, que é apenas um endereço IP que pode ser vinculado à rede do escritório, esse erro é solicitado (isso ocorre porque nosso cliente docker usa https, a biblioteca privada Harbor que construímos usa http, então haverá um relatório de erro, resultando na incapacidade de acesso), neste momento, precisamos modificar a configuração do docker no mac.

solução

Como há um docker operado graficamente no mac, insira Preferences -> Docker Engine na interface e preencha a seguinte declaração, que é o endereço da biblioteca particular do docker que usamos

"insecure-registries":["仓库ip:port"]

Conforme mostrado na figura:
insira a descrição da imagem aqui
Após a conclusão da configuração, clique no canto inferior direito para aplicar e reiniciar.
Podemos usar o comando docker system info para verificar se as informações de configuração insecure-registries contêm as informações que acabamos de configurar.
insira a descrição da imagem aqui
Agora podemos nos conectar à biblioteca docker remota normalmente.

Quarto, construa uma imagem docker

Visualize o Dockerfile que escrevemos na linha de comando do mac
insira a descrição da imagem aqui
para criar a imagem do programa do projeto

  • -f: Especifica qual arquivo compilar
  • -t: Especifique o armazém espelhado, etiqueta, etc. após a compilação
  • [Há um ponto no final, uma coisa para prestar atenção] O último . indica que o Dockerfile está no diretório atual
docker build -f Dockerfile -t blockchain-middleware-docker-10:v1.3 .

O exemplo de demonstração após a execução é o seguinte.
insira a descrição da imagem aqui
Depois que a construção for bem-sucedida, a seguinte tela aparecerá.
insira a descrição da imagem aqui
Veja a imagem construída

docker images


O repositório de imagens e a versão especificada para compilação, ID da imagem, hora de criação, tamanho e outras informações aparecerão.

  • REPOSITÓRIO nome do armazém espelhado
  • TAG A tag da imagem
  • ID DA IMAGEM ID da imagem
  • CREATED tempo de criação do espelho
  • TAMANHO tamanho da imagem
    insira a descrição da imagem aqui

Interlúdio no meio do problema - gere uma imagem virtual do docker

Você pode ver que depois de visualizar a imagem, existem várias imagens com nomes e etiquetas de armazéns, comumente conhecidas como: imagem pendente

solução

Causa: Existem alguns erros de gravação ao compilar o arquivo de imagem, portanto, essas imagens pendentes podem ser excluídas

docker rmi $(docker images | grep "none" | awk '{print $3}')

insira a descrição da imagem aqui
ou use o docker image prune
insira a descrição da imagem aqui

5. Execute a imagem para gerar o contêiner

Execute a imagem usando o comando docker run

  • O parâmetro -d define o modo de operação do contêiner para execução em segundo plano.

  • O parâmetro -p 8088:80 mapeia a porta de rede usada dentro do container para o host, onde 8088 é a porta do host e 80 é a porta usada dentro do container.

# 运行镜像生成容器
docker run -d -p 8088:8088 -it --privileged=true blockchain-***:v1.3
# 查看所有容器
docker ps -a

Após a execução, ao visualizar o comando do container, você pode ver que o status do STATUS do container está ativo Modo de inicialização
Descrição das
opções Opções:

  • -é criado interativo: -i é criado interativo, -t é terminal
  • -a # Lista os contêineres atualmente em execução + os contêineres executados historicamente
  • -n=?# Mostrar contêineres criados recentemente
  • -q # exibe apenas o número do contêiner
  • –privileged=true Abrir privilégios de root
    insira a descrição da imagem aqui

6. Entre, saia e pare o contêiner

Depois de executar a imagem para gerar o container, você pode entrar no container para ver quais arquivos estão dentro

# 容器进入(docker exec -it 容器id /bin/bash)-更改后的命令如下,原因见下详解
docker exec -it 54b0f2789ec5 /bin/sh 
# 容器退出
exit

Depois de sair do contêiner, pare a execução do contêiner

docker stop 容器id

insira a descrição da imagem aqui

Pequeno problema no meio - erro ao entrar no container: OCI runtime ​exec failed: exec failed: container_linux.go:349: start container process causou "ex

docker exec -it container id /bin/bash Desejo entrar no warehouse para verificar a configuração e encontrei o seguinte erro: OCI runtime exec falhou: exec falhou: container_linux.go:349: iniciar o processo do contêiner causou “exec: “/ bin/bash”: stat /bin/bash: nenhum arquivo ou diretório”: desconhecido
insira a descrição da imagem aqui

Solução

使用 docker exec -it 容器 id /bin/sh 或者
docker exec -it 容器 id sh

Altere para docker exec -it cf34762e01c0 /bin/sh para entrar com sucesso no container
insira a descrição da imagem aqui
. Após executar o container, você pode tentar ver se sua imagem está disponível através de algumas chamadas de interface simples. Conforme mostrado abaixo, a imagem pode ser usada normalmente.

Depois de concluir as etapas acima, significa que você empacotou uma imagem executável localmente

7. Operações push e pull entre o espelho local e o armazém de espelhos Alibaba Cloud

1. Faça login no Alibaba Cloud Mirror Warehouse

Pré-requisito: Por padrão, você criou o armazém espelho correspondente no Alibaba Cloud (se você não pode criar seu próprio armazém espelho Alibaba Cloud, consulte a postagem do blog [Alibaba Cloud-Container] Docker Image Management Quick Start )
Vou use o armazém de espelhos Alibaba Cloud como exemplo, é claro A empresa usa nosso próprio armazém de espelhos, portanto, da mesma forma, de acordo com suas próprias necessidades, você pode fazer login no armazém de espelhos correspondente (essa operação de login só precisa ser executada uma vez no mesmo ambiente, e suas informações de login serão registradas no arquivo de configuração do ambiente relevante Sim, por exemplo, depois que meu computador se conectou ao meu armazém de espelho Alibaba Cloud uma vez, pulls ou pushs subsequentes podem ser operados sem fazer login novamente)

# docker login --username=你的阿里云账号 阿里云镜像仓库
docker login --username=****ic registry.cn-hangzhou.aliyuncs.com

Instruções: Substitua o nome de usuário no comando a seguir pelo nome completo da sua conta do Alibaba Cloud e digite a senha do armazém de espelhamento remoto após pressionar Enter. A senha é a senha definida ao abrir o serviço na etapa 6
insira a descrição da imagem aqui

2. Marque o espelho local e coloque-o no armazém remoto

docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/你阿里云自定义的命名空间/你阿里云自定义的镜像仓库名字:[镜像版本号]
例如:docker tag demo:v1 registry.cn-hangzhou.aliyuncs.com/space_test/demo:v1

insira a descrição da imagem aqui

3. Envie a imagem local para o warehouse remoto

docker push registry.cn-hangzhou.aliyuncs.com/你阿里云自定义的命名空间/你阿里云自定义的镜像仓库名字:[镜像版本号]
例如:docker push registry.cn-hangzhou.aliyuncs.com/space_test/demo:v1

insira a descrição da imagem aqui

4. Puxe a imagem remota da versão especificada

Se você deseja obter a versão especificada do espelho remoto para o local, use o seguinte comando e, em seguida, o princípio de operação é o mesmo acima

docker pull registry.cn-hangzhou.aliyuncs.com/你阿里云自定义的命名空间/你阿里云自定义的镜像仓库名字:[镜像版本号]
例如:docker pull registry.cn-hangzhou.aliyuncs.com/space_test/demo:v1

5. Alguns comandos básicos do docker

Além dos comandos comumente usados ​​acima, existem alguns comandos docker que podem ser usados.
As imagens relacionadas são as seguintes:

# 更改仓库名称或重命名镜像,例如:将名称更改test为 my_docker/test
docker image tag test:latest my_docker/test:latest
或
docker image tag fb583c3ac45d  my_docker/test:latest

tenho a resposta

REPOSITORY          TAG                 IMAGE ID            CREATED          VIRTUAL SIZE
test              latest              fb583c3ac45d        35 minutes ago      968.5 MB
my_docker/test    latest  			  fb583c3ac45d 		  28 minutes ago 	  968.5 MB

tag é apenas um alias legível para o nome completo da imagem (fb583c3ac45d…). Portanto, eles podem ser associados à mesma imagem, se desejado. Se você não gosta do nome antigo, pode removê-lo após renomear

# 删除旧命令镜像,记得得到重新命名后的镜像
docker rmi test

Os contêineres estão relacionados da seguinte forma:

# 启动容器
docker start cotianername/containerid
# 停止容器
docker stop cotianername/containerid
# 删除容器
docker rm cotianername/containerid
# 进入容器
docker exec -it containername/containerid /bin/bash
# 退出容器
exit

Referência de dados

O que é a imagem fictícia do docker?
Como excluir nenhuma imagem
Como criar Golang Dockerfiles Golang
Dockerfile melhor prática
Golang projeto geral Dockerfile Gravar
implantação do Docker Programa GoLang, tutorial de nível babá
Comandos básicos do Docker, download de imagem excluir, exibição de contêiner, abrir, fechar, matar Inativo
contêiner de imagem do docker iniciar, parar, excluir contêiner
Como criar uma imagem mínima do docker para projetos go, reduzir totalmente 99%
Construir uma imagem básica contendo jdk e nginx, implantar projetos de front-end e back-end
no docker warehouse no Mac prompt do sistema http: servidor deu resposta HTTP para solução alternativa para cliente HTTPS

Acho que você gosta

Origin blog.csdn.net/ic_xcc/article/details/129954857
Recomendado
Clasificación