ilustrar
- Prefácio: Recentemente, fiz um projeto de treinamento SpringBoot com a estrada do Biz Station Code God. Encontrei muitas dificuldades e problemas na primeira operação, principalmente na parte de implantação, fiz muitos desvios. Aqui anoto minha própria implantação processo para todos. Para referência, você também pode enviar seus valiosos comentários.
- Link do vídeo de deus do código da estação de bipe: https://www.bilibili.com/video/BV1Gb4y1d7zb?p=36
- Meu site: www.zhangshidi.space (pode ser atualizado para outro conteúdo depois de um tempo~)
- Não é fácil de criar, espero que todos passem e dêem um joinha.
- Algumas instruções podem estar erradas, você pode fazer manualmente (por exemplo, no tutorial que li, mkdir é usado para criar arquivos como blog.conf, mas há um problema com o formato do arquivo, e sempre terá um sufixo como blog.conf.swp O que, então eu crio manualmente um novo arquivo no diretório de arquivos à esquerda e depois descobri que o novo arquivo pode ser criado com sucesso por toque; mkdir é melhor criar uma pasta)
Pré-conhecimento
- Os pontos de conhecimento a seguir esperam que você primeiro pesquise e leia, e tenha um entendimento geral.
- O que é Linux e algumas instruções básicas para dominar o Linux.
- O que é o docker, o princípio da implantação do docker
- o que é nginx
- O que nós vamos fazer
- Empacote o projeto front-end Vue para o servidor em nuvem
- Empacote o projeto de back-end springboot (página da web principal, doravante referida como aplicativo) (sistema de gerenciamento de back-end, doravante denominado admin) para o servidor em nuvem
- Use o docker para implantar mysql, redis, ngix, app, admin. Em seguida, use o docker-compose para executar um arranjo de serviço, para que os projetos sejam iniciados em sequência.
Diretório de arquivos
- Se você seguir completamente minhas ideias, poderá verificar meu diretório de arquivos para verificar se o arquivo não está correto.
1 Preparação do ambiente: compra do servidor (e nome de domínio)
- Ambiente básico (servidor em nuvem e nome de domínio) – faça isso com antecedência !
- Minha configuração de nuvem: servidor Alibaba Cloud 1 core 2 GiB + nome de domínio Tencent Cloud.
- O servidor em nuvem é equivalente ao nosso segundo computador, mas está na nuvem. Por causa do relacionamento dele na nuvem, podemos assediá-lo à vontade. Se houver um problema mais problemático, podemos reinstalar o sistema diretamente sem causar nenhum dano ao nosso próprio computador.
- Primeiro de tudo, precisamos de um servidor em nuvem, depois precisamos comprar um servidor em nuvem, se precisarmos de um nome de domínio, precisamos comprar um nome de domínio e concluir a ligação (resolução) entre o nome de domínio e o IP do servidor em nuvem Morada. Também é possível usar temporariamente um endereço IP sem um nome de domínio.
- Razões para fazer isso com antecedência: Como o nome de domínio precisa ser arquivado , diz-se que o tempo de arquivamento pode ser de até uma semana. Meu (nome de domínio comum comprado na Tencent Cloud - 10 anos 180) está bem, e o o arquivamento é concluído em um dia. O servidor em nuvem foi adquirido no evento Alibaba Cloud no Double Eleven em 2021 no ano passado. Quanto a qual é bom e qual é ruim, acho que deveria ser mais ou menos a mesma coisa, peguei os baratos e comprei.
- Após a compra do servidor, você precisa instalar o sistema linux no servidor, eu escolhi a versão centoS 7.8.
- Então, para o uso deste servidor em nuvem, podemos inserir instruções diretamente no servidor em nuvem | ou usar ferramentas de terceiros, como o Xshell. (eu uso xshell, que tem menos bugs e é mais fluente)
- Por favor, procure as etapas acima por si mesmo.
- Após concluir esses passos, uma coisa muito importante é abrir as portas . No caso do Alibaba Cloud, é na configuração das regras do grupo de segurança, como porta 8888, porta redis, porta do banco de dados, etc. não ser acessível.
2 Instalação do Docker
- No meu entendimento de docker, docker pode ser entendido como um container, que equivale a um sistema linux mais em miniatura, no qual podemos implantar vários ambientes e configurações.
- Para um conhecimento mais específico do docker, podemos consultar este artigo: https://blog.csdn.net/weixin_46628200/article/details/106668209
iniciar a instalação
- Primeiro, entre no nosso painel de gerenciamento do servidor em nuvem - conexão remota, você pode ver uma página tão vazia e, em seguida, inserimos vários comandos aqui. - Percebemos que existem dois símbolos no canto superior esquerdo, um é [Nova Janela de Comando]; o outro é [Visual View File], que é quase o mesmo que normalmente vemos os arquivos. Às vezes, você pode mover diretamente no arquivo se estiver com preguiça de usar o comando de cópia.
instalação do docker
- Digite a seguinte série de comandos passo a passo em sua janela de comando
# 1、yum 包更新到最新
yum update
# 2、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
yum install -y yum-utils device-mapper-persistent-data lvm2
# 3、 设置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 4、 安装docker,出现输入的界面都按 y
yum install -y docker-ce
# 5、 查看docker版本,验证是否验证成功
docker -v
#启动docker
/bin/systemctl start docker.service
Puxe a imagem do docker
- A imagem do docker pode ser entendida como uma imagem comum e a imagem do docker é usada para criar nosso contêiner do docker.
- Ainda digite o seguinte comando na janela de comando
docker pull nginx
docker pull redis:5.0.3
docker pull java:8
docker pull mysql:5.7
3 janela de encaixe configurar mysql
- Em seguida, vou me referir coletivamente aos servidores em nuvem como hosts.
Ideia: Construir um docker para configurar o MySQL; e organizar os arquivos de dados do MySQL no host, o que é um pouco mais problemático, mas a segurança é aprimorada
Antes de configurar o mysql, espero que você instale o MySQL em seu próprio host primeiro e siga o tutorial de instalação do mysql no nível de babá no linux .
A razão para isso é porque eu quero armazenar os dados mysql na máquina host, e apenas um ambiente mysql está configurado no docker. , todos os arquivos de dados desaparecerão. , muito inseguro.
- Crie um diretório MySQL no host (crie um comando de pasta mkdir, cd é um comando de diretório switch)
mkdir -p /mnt/docker/mysql
cd /mnt/docker/mysql
- Vá em frente e execute os seguintes comandos na janela de comando
- Que
run
tem a função de [criar e executar] o container mysql - -p é estabelecer o mapeamento entre a porta do host 3307 e a porta do contêiner 3306
- -v é para gerar um diretório de montagem. A montagem pode ser entendida como compartilhar/sincronizar um diretório de arquivo. O diretório antes dos dois pontos é o diretório do host e depois dos dois pontos é o diretório de dados do MySQL na janela de encaixe. Mesmo se a janela de encaixe for excluída , os dados ainda podem ser retidos no host. no diretório do host
- Vale ressaltar que existem três diretórios montados nas notas do Code God , a saber: arquivos de configuração, logs e arquivos de dados. Continuo recebendo erros no log na operação real, então apenas configuro apenas os arquivos de dados mais importantes
- O próximo passo é especificar a senha padrão do host MySQL. Se a senha padrão não for definida, um erro pode ser relatado.
- Que
docker run -id \
-p 3307:3306 \
--name=mysql \
-v /mnt/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
mysql:5.7
Em seguida, precisamos inserir o contêiner e abrir as permissões
docker ps
Verifique se o contêiner já está em execução- Você deve ver que o container mysql5.7 já está rodando
- no recipiente
docker exec -it mysql bash
- MYSQL no contêiner
mysql -uroot -p
- Digite a senha, como acima, eu configuro como root, basta digitar diretamente. (Em branco é exibido na interface, mas a senha já foi inserida, pressione Enter para confirmar.)
- As próximas etapas são semelhantes à etapa 10 de instalação do host mysql acima
show databases;
use mysql ;
show tables;
select user,host from user;
(Pode relatar um erro sql, basta adicionar o campo `` package)- Pode-se ver que o host correspondente ao usuário root não é %, temos que alterá-lo para % para abrir as permissões.
update user set host ='%'where user ='root';
update user set host ='%'where user ='root' and host='localhost';
- É melhor executar as duas sentenças. Na minha situação na época, havia dois usuários root. O resultado da execução foi que um root correspondente ao host estava vazio e o outro host estava %.
- (Você pode até abrir permissões avançadas
grant all privileges on *.* to root@'%' identified by 'root' with grant option;
) - Atualizar permissões
flush privileges;
exit
Saia do MySQL e, em seguida,exit
saia do contêiner do MySQL
Verifique se o contêiner do Docker do mysql está configurado com sucesso e visualize seu endereço IP do docker exposto
- Use isto
docker logs -f mysql
para ver se a configuração foi bem sucedida docker inspect mysql
→ Verifique o endereço IP 172.17.0.2 do container do docker mysql correspondente, lembre-se deste endereço, que é necessário para a aplicação de background de empacotamento abaixo.
Depois que o ambiente estiver correto, precisamos importar nosso arquivo de banco de dados blog.sql
- Como mencionado acima, implementamos o mapeamento entre o
/mnt/docker/mysql/data
diretório do host e o/var/lib/mysql
endereço do container docker, portanto, se importarmos o arquivo blog.sql para este diretório do host, o blog.sql também aparecerá no diretório correspondente do docker . Abaixo, as operações específicas são as seguintes:
cd /mnt/docker/mysql/data
rz
- Entre eles, cd significa mudar de diretório e rz significa fazer upload de arquivos. Neste ponto, podemos importar blog.sql para ele. Em seguida, verificamos se o arquivo aparece no contêiner docker
- no recipiente
docker exec -it mysql bash
- Mude para o diretório de montagem
cd /var/lib/mysql
- Olhando para todos os arquivos
ls
neste diretório, você pode, teoricamente, ver que blog.sql também está neste diretório. - Em seguida, execute o sql no docker.
mysql -uroot -p
, digite a senha para entrar no banco de dados no docker- criar banco de dados
create database blog;
- sair de volta para o recipiente
exit
- Importar arquivo para banco de dados
mysql -uroot -p blog < blog.sql;
- trocar banco de dados
use blog;
- execute sql e salve o banco de dados
source blog.sql;
- verificação de resultado
use blog;
show tables;
select * from ms_admin;
- Se conseguirmos encontrar o resultado (como mostrado na figura abaixo), significa que nossa implantação foi bem-sucedida.
- Na implantação real, passo a maior parte do tempo no banco de dados, como falha no link, acesso negado, falha na conexão jdbc etc., provavelmente devido às permissões do banco de dados. Verifique se as permissões de host correspondentes ao root são % destas.
- Há também um arquivo de configuração do banco de dados escrito nas notas do Code God, eu não escrevi aqui, apenas use a configuração padrão por enquanto.
4 docker configurar redis
- Isso é muito simples, um comando para fazer isso
docker run -id --name=redis -p 6379:6379 redis:5.0.3
- um exame
- docker ps Veja o container atualmente em execução, em teoria, agora você pode ver que tanto o mysql quanto o redis estão em execução.
- docker ps -a Ver todos os contêineres (incluindo não em execução)
- Precisamos verificar o endereço ip correspondente ao redis docker, que
docker inspect redis
será usado posteriormente ao empacotar o projeto.Aqui estou 172.17.0.3
5 Dockerfile cria imagem de back-end
- Podemos puxar diretamente os espelhos como MySQL e redis, mas os espelhos dos projetos de back-end precisam ser empacotados e construídos por nós mesmos.
- A explicação de Code God do Dockerfile é a seguinte
- Dockerfile é um arquivo de texto
- contém um comando
- Cada instrução constrói uma camada, baseada na imagem base, e finalmente constrói uma nova imagem
- Para desenvolvedores: pode fornecer um ambiente de desenvolvimento completamente consistente para a equipe de desenvolvimento
- Para testadores: você pode pegar diretamente a imagem criada durante o desenvolvimento ou
criar uma nova imagem através do arquivo Dockerfile para começar a trabalhar - Para o pessoal de operação e manutenção: a migração perfeita de aplicativos pode ser alcançada durante a implantação
Primeiro, precisamos configurar os parâmetros na ideia e no pacote
- Configurar parâmetros de conexão -
- Há também um parâmetro sobre a configuração entre domínios. Você também pode consultar o seguinte. Você precisa permitir que seu próprio domínio passe e, em seguida, a configuração entre domínios é alterada da escrita pelo professor para a segunda. O motivo é como mostrado na figura, por favor Atenção a todos! - Empacote e gere pacote jar
- Encontre o arquivo local, coloque-o em um bom lugar para encontrá-lo e prepare-se para importá-lo para nosso diretório mais tarde
Em seguida, precisamos importar o pacote jar no diretório /mnt/docker/app, construir o arquivo de configuração da imagem e executar a imagem.
- Crie um novo diretório primeiro
mkdir /mnt/docker/app
- Configurações que podem usar a função de upload
yum -y install lrzsz
- mudar para este diretório
cd /mnt/docker/app
- fazer upload de arquivos
rz
- Mude o nome
mv blog-api-1.0-SNAPSHOT.jar blog_api.jar
- Configure o arquivo de configuração para construir a imagem
- crie um novo arquivo
touch blog_dockerfile
- Modificar o conteúdo do arquivo
vim blog_dockerfile
- Cole o seguinte conteúdo nele (modifique você mesmo os parâmetros pessoais)
- crie um novo arquivo
FROM java:8
MAINTAINER zhangshidi <[email protected]>
ADD ./blog_api.jar /app.jar
CMD java -jar /app.jar --spring.profiles.active=prod
- executar imagem
docker build -f ./blog_dockerfile -t app .
- Verifique,
docker images
você deve ver que o docker do aplicativo já está em execução
6 Construir a imagem de front-end
Modifique a configuração de front-end, empacotar, carregar e ajustar os locais dos arquivos.
-
Vamos para a frente
- modificar ip
-
Construa o projeto, ele irá gerar automaticamente o projeto para dist, compactar manualmente o arquivo e enviar para nosso servidor em nuvem.
-
De volta à interface da janela de comando, devemos instalar a função unzip
#获取安装列表 yum安装列表中搜索zip/unzip是否存在
yum list | grep zip/unzip
#执行安装支持zip命令 根据提示输入y允许安装
yum install zip
#执行安装支持unzip命令 根据提示输入y允许安装
yum install unzip
- Crie a pasta correspondente
mkdir /mnt/zhang
mkdir /mnt/zhang/blog
- Mude para o diretório do blog
cd /mnt/zhang/blog
- uploadrz
, faça upload do nosso pacote compactado dist front-end - descomprimir
unzip dist.zip
- Em seguida, mova o local do arquivo, em /mnt/zhang/blog
ls
, deve ser os três arquivos a seguir: dist.zip, index.html, static, na verdade, os úteis devem ser index.html e static- Quanto a como mover, arrastei-o diretamente para o diretório de arquivos à esquerda. Você também pode encontrar o comando correspondente.
- Quanto a como mover, arrastei-o diretamente para o diretório de arquivos à esquerda. Você também pode encontrar o comando correspondente.
7 Orquestração de serviço do Docker-compose
- A orquestração de serviço usa principalmente o Docker Compose para iniciar o springboot e o nginx em lotes
- Springboot é nosso próprio projeto empacotado
- A função do nginx: ① Os arquivos estáticos (como HTML, imagens) no servidor são exibidos ao cliente através do protocolo HTTP. ②Servidor proxy reverso, onde o proxy nginx é o cliente de recursos front-end pode acessar diretamente um servidor de aplicativos do site por meio do protocolo HTTP, o administrador do site pode adicionar um Nginx no meio, o cliente solicita o Nginx, o Nginx solicita o servidor de aplicativos e, em seguida, o O resultado é devolvido ao cliente. Adicionar uma camada de proxy pode alcançar balanceamento de carga, hospedagem virtual e outros efeitos. ( ver detalhes )
Primeiro, instalamos o Docker Compose
# Compose目前已经完全支持Linux、Mac OS和Windows,在我们安装Compose之前,需要先安装Docker。下面我 们以编译好的二进制包方式安装在Linux系统中。
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# 设置文件可执行权限
chmod +x /usr/local/bin/docker-compose
# 查看版本信息
docker-compose -version
Crie o diretório correspondente e grave o arquivo de configuração docker-compose.yml
vim
significa modificar o arquivo
mkdir /mnt/docker/docker-compose
cd /mnt/docker/docker-compose
touch docker-compose.yml
vim docker-compose.yml
- Copie o seguinte conteúdo para docker-compose.yml. Depois de escrever, pressione Esc para sair do modo de edição e, em seguida, digite
:wq
, você pode salvar e sair~
version: '3'
services:
nginx:
image: nginx
container_name: nginx
ports:
- 80:80
- 443:443
links:
- app
depends_on:
- app
volumes:
- /mnt/docker/docker-compose/nginx/:/etc/nginx/
- /mnt/zhang/web:/zhang/web
- /mnt/zhang/blog:/zhang/blog
network_mode: "bridge"
app:
image: app
container_name: app
expose:
- "8888"
network_mode: "bridge"
- Este arquivo tem
depends_on
a função de organizar diretórios. Em relação a este diretório de montagem, preste atenção à sua própria ordem de diretórios. Ao seguir vários tutoriais, você deve distinguir a ordem dos diretórios deles da sua própria ordem de diretórios. A seguir está minha ordem de diretórios
Em seguida, precisamos configurar o diretório de arquivos nginx e os arquivos de configuração internos relacionados
- Primeiro, precisamos obter o
nginx.conf
arquivo
mkdir -p ./nginx
cd /mnt/docker/nginx
touch nginx.conf
vim nginx.conf
- Copie o seguinte conteúdo
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
- Crie uma nova pasta conf.d e, em seguida, crie um novo
blog.conf
arquivo
mkdir conf.d
cd conf.d
touch blog.conf
vim blog.conf
blog.conf
Modifique a configuração e coloque os seguintes arquivos em
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_comp_level 2;
gzip_vary off;
upstream appstream{
server app:8888;
}
server{
# 监听端口
listen 80;
# 主机名称/地址
server_name www.zhangshidi.space zhangshidi.space;
index index.html;
# 前端服务
location / {
root /zhang/blog/;
# 刷新页面后跳转到当前页面
try_files $uri $uri/ /index.html;
index index.html;
}
# 后端api
location /api {
proxy_pass http://appstream;
}
location ~* \.(jpg|jpeg|gif|png|swf|rar|zip|css|js|map|svg|woff|ttf|txt)$ {
root /zhang/blog/;
index index.html;
add_header Access-Control-Allow-Origin *;
}
}
- Há também uma configuração ssl/tsl na configuração do código god . Se você precisar, pode solicitar e configurar. Vou omitir aqui.
- Você pode ver que também existe um arquivo chamado
mime.types
- Essa coisa é um must-have no nginx. Eu baixei um nginx da Internet e peguei o
mime.types
arquivo erz
entrei nele. Você também pode criar um novo arquivo e copiar o código nele. O código é o seguinte.
types {
text/html html htm shtml;
text/css css;
text/xml xml;
image/gif gif;
image/jpeg jpeg jpg;
application/javascript js;
application/atom+xml atom;
application/rss+xml rss;
text/mathml mml;
text/plain txt;
text/vnd.sun.j2me.app-descriptor jad;
text/vnd.wap.wml wml;
text/x-component htc;
image/png png;
image/svg+xml svg svgz;
image/tiff tif tiff;
image/vnd.wap.wbmp wbmp;
image/webp webp;
image/x-icon ico;
image/x-jng jng;
image/x-ms-bmp bmp;
font/woff woff;
font/woff2 woff2;
application/java-archive jar war ear;
application/json json;
application/mac-binhex40 hqx;
application/msword doc;
application/pdf pdf;
application/postscript ps eps ai;
application/rtf rtf;
application/vnd.apple.mpegurl m3u8;
application/vnd.google-earth.kml+xml kml;
application/vnd.google-earth.kmz kmz;
application/vnd.ms-excel xls;
application/vnd.ms-fontobject eot;
application/vnd.ms-powerpoint ppt;
application/vnd.oasis.opendocument.graphics odg;
application/vnd.oasis.opendocument.presentation odp;
application/vnd.oasis.opendocument.spreadsheet ods;
application/vnd.oasis.opendocument.text odt;
application/vnd.openxmlformats-officedocument.presentationml.presentation
pptx;
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
xlsx;
application/vnd.openxmlformats-officedocument.wordprocessingml.document
docx;
application/vnd.wap.wmlc wmlc;
application/x-7z-compressed 7z;
application/x-cocoa cco;
application/x-java-archive-diff jardiff;
application/x-java-jnlp-file jnlp;
application/x-makeself run;
application/x-perl pl pm;
application/x-pilot prc pdb;
application/x-rar-compressed rar;
application/x-redhat-package-manager rpm;
application/x-sea sea;
application/x-shockwave-flash swf;
application/x-stuffit sit;
application/x-tcl tcl tk;
application/x-x509-ca-cert der pem crt;
application/x-xpinstall xpi;
application/xhtml+xml xhtml;
application/xspf+xml xspf;
application/zip zip;
application/octet-stream bin exe dll;
application/octet-stream deb;
application/octet-stream dmg;
application/octet-stream iso img;
application/octet-stream msi msp msm;
audio/midi mid midi kar;
audio/mpeg mp3;
audio/ogg ogg;
audio/x-m4a m4a;
audio/x-realaudio ra;
video/3gpp 3gpp 3gp;
video/mp2t ts;
video/mp4 mp4;
video/mpeg mpeg mpg;
video/quicktime mov;
video/webm webm;
video/x-flv flv;
video/x-m4v m4v;
video/x-mng mng;
video/x-ms-asf asx asf;
video/x-ms-wmv wmv;
video/x-msvideo avi;
}
- verificar, usar
ls
instrução
8 Faça o teste
-
Neste ponto, nossa implantação está basicamente concluída
-
Verifique também
docker ps
, 4 contêineres estão em execução -
Alterne para o diretório docker-compose e inicie o contêiner. Veja a seguir algumas instruções comuns para iniciar e interromper contêineres.
docker-compose up #直接启动
docker-compose up -d #代表后台启动
docker-compose down #停止并删除容器
docker-compose start #启动已有容器
docker-compose stop #停止运行的容器
- De um modo geral,
docker-compose up
começamos diretamente a ver se há algum problema com o site. Se houver algum problema, use os dois comandos a seguir para melhorá-lo.- Confira o log do ngix:
docker logs nginx
- Ver registros de back-end:
docker-compose logs
- Confira o log do ngix:
- Quando sentirmos que a implantação está completamente concluída, podemos iniciar o docker-compose up -d em segundo plano, para que o servidor possa ser desligado e executado.
- Por fim, gostaria de agradecer às duas ideias de artigos que mencionei. Ambos estão bem escritos, mas alguns detalhes são difíceis de implementar aqui. Também quero agradecer ao Sr. Code God por seus esforços. Você também pode consultar e compará-los, eu acredito que eles vão te ajudar.
- Há outra pergunta, você pode perguntar por que não há implantação de gerenciamento em segundo plano?
- Vamos dar uma olhada mais de perto no gerenciamento de segundo plano. Só pode ser dito que é um caso de Spring Security, e ele não desempenha o papel de gerenciamento de segundo plano... Embora seja implantado, não faz sentido.
Obrigado por sua visita. Se você acha que a escrita é boa, por favor, dê um like e um incentivo. Se você tiver alguma dúvida, por favor deixe uma mensagem. Bem-vindo para apontar o problema.
- Também defina uma bandeira para você, depois aprenda Spring Cloud, e depois vá conquistar o projeto do shopping com mais estrelas no github