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
- 1. Goland cria um novo Dockerfile
- Dois, conteúdo do arquivo Dockerfile
- 3. Inicie o docker e prepare-se para compilar a imagem
- Quarto, construa uma imagem docker
- 5. Execute a imagem para gerar o contêiner
- 6. Entre, saia e pare o contêiner
- 7. Operações push e pull entre o espelho local e o armazém de espelhos Alibaba Cloud
- Referência de dados
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
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
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:
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.
Agora podemos nos conectar à biblioteca docker remota normalmente.
Quarto, construa uma imagem docker
Visualize o Dockerfile que escrevemos na linha de comando do mac
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.
Depois que a construção for bem-sucedida, a seguinte tela aparecerá.
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
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}')
ou use o docker image prune
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
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
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
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
. 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
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
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
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