Como executar o Nginx em um contêiner Docker no Ubuntu 22.04
Introdução
Nginx é um servidor web de código aberto usado para servir sites estáticos ou dinâmicos, proxy reverso, balanceamento de carga e outros recursos de servidor HTTP e proxy. Ele foi desenvolvido para lidar com grandes quantidades de conexões simultâneas e é um servidor da Web popular usado para hospedar alguns dos maiores e mais tráfegos sites da Internet.
contêineres, ambientes de espaço de usuário isolados que são executados no nível do sistema operacional e compartilham recursos do sistema, como o kernel e o sistema de arquivos.
Ao conteinerizar o Nginx, é possível reduzir a sobrecarga de administração do sistema. Por exemplo, você não precisará gerenciar o Nginx por meio de um gerenciador de pacotes ou compilá-lo a partir do código-fonte. O contêiner do Docker permite substituir todo o contêiner quando uma nova versão do Nginx é lançada. Dessa forma, você só precisa manter o arquivo de configuração do Nginx e seu conteúdo.
Neste tutorial, você aprenderá como servir uma pequena página da Web configurando o Nginx com um contêiner do Docker.
Pré-requisitos
Para seguir este tutorial, você precisará do seguinte:
- Um servidor Ubuntu 22.04 configurado seguindo o guia de configuração inicial do servidor Ubuntu 22.04, incluindo um usuário sudo não root e um firewall.
- Docker instalado em seu servidor. Conclua as Etapas 1 e 2 do nosso tutorial Como instalar e usar o Docker no Ubuntu 22.04.
Com o Docker instalado em seu servidor, você pode prosseguir com a primeira etapa.
Etapa 1 — Baixando o Nginx do Docker Hub
O Docker mantém um site chamado Dockerhub, um repositório público de arquivos Docker que inclui imagens oficiais e enviadas por usuários. As Imagens oficiais do Docker podem ser usadas para desenvolver rapidamente um aplicativo, evitando que você tenha que criar sua própria imagem. Essas imagens são mantidas pela comunidade Docker e geralmente são projetadas para os casos de uso mais comuns.
Você pode baixar o Nginx a partir de uma imagem pré-criada do Docker, com uma configuração Nginx padrão, executando o seguinte comando:
- docker pull nginx
Isso baixa todos os componentes necessários para o contêiner. O Docker os armazenará em cache, portanto, quando você executar o contêiner, não precisará baixar a imagem do contêiner todas as vezes.
Agora que você instalou o Nginx, pode configurar o contêiner para que seja acessível publicamente como um servidor web. Para iniciar seu contêiner Nginx Docker, execute este comando:
- docker run --name docker-nginx -p 80:80 nginx
Aqui está um rápido resumo do que está acontecendo com este comando:
run
é o comando para criar um novo container- O sinalizador
--name
é como você especifica o nome do contêiner. Se deixado em branco, um nome gerado como nostalgic_hopper será atribuído. -p
especifica a porta que você está expondo no formato-p local-machine-port:internal-container-port
. Nesse caso, você está mapeando a porta:80
no contêiner para a porta:80
no servidor.nginx
é o nome da imagem no Docker Hub.
Em um navegador da Web, insira o endereço IP do seu servidor para revelar a página de destino padrão do Nginx:
Observe também que em seu terminal, um log do Nginx está sendo atualizado quando você faz solicitações ao seu servidor. Isso ocorre porque você está executando seu contêiner de forma interativa.
Em seu terminal, digite CTRL+C
para interromper a execução do contêiner.
Como você desligou o contêiner, não pode mais visualizar a página inicial. Você pode verificar o status do contêiner com este comando:
- docker ps -a
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
05012ab02ca1 nginx "nginx -g 'daemon off" 57 seconds ago Exited (0) 47 seconds ago docker-nginx
A saída revela que o contêiner do Docker foi encerrado.
Remova o contêiner docker-nginx
existente com este comando:
- docker rm docker-nginx
Na próxima etapa, você desanexará o contêiner para permitir que ele seja executado de forma independente.
Etapa 2 — Executando no modo independente
Crie um novo contêiner Nginx desanexado com este comando:
- docker run --name docker-nginx -p 80:80 -d nginx
Ao anexar o sinalizador -d
, você está executando este contêiner em segundo plano.
A saída é o ID do contêiner:
Outputb91f3ce26553f3ffc8115d2a8a3ad2706142e73d56dc279095f673580986257
Ao executar o comando docker ps
, você encontrará algumas novas informações sobre seu contêiner:
- docker ps
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b91f3ce26553 nginx "/docker-entrypoint.…" 56 seconds ago Up 54 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp docker-nginx
Em vez de Exited (0) X minutes ago
, agora você tem Up About a minute
na coluna STATUS
. Observe também que o mapeamento de porta também faz parte da saída.
Digite o endereço IP do seu servidor em um navegador para acessar a página inicial Nginx padrão novamente. Desta vez, ele está sendo executado em segundo plano porque você especificou o sinalizador -d
, que informa ao Docker para executar este contêiner no modo desanexado.
Agora você tem uma instância em execução do Nginx em um contêiner desanexado. Atualmente, o contêiner não tem acesso a nenhum dos arquivos do seu site.
Pare o contêiner executando o seguinte comando:
- docker stop docker-nginx
Agora que o contêiner está parado, você pode removê-lo executando o seguinte comando:
- docker rm docker-nginx
Agora que você entende como executar o Nginx independentemente do seu contêiner, na próxima etapa, você criará e configurará o Nginx para criar uma página de destino.
Etapa 3 — Construindo uma página da Web para servir no Nginx
Nesta etapa, você criará uma página personalizada para o seu site. Essa configuração permite que você tenha conteúdo de site persistente hospedado fora do contêiner.
Crie um novo diretório para o conteúdo do seu site dentro do diretório inicial:
- mkdir -p ~/docker-nginx/html
Navegue até ele executando este comando:
- cd ~/docker-nginx/html
Crie um arquivo HTML para servir em seu servidor. O exemplo a seguir usa nano
, mas você pode usar seu editor de texto preferido:
- nano index.html
Insira o seguinte conteúdo HTML:
<html>
<head>
<title>Docker nginx Tutorial</title>
</head>
<body>
<div class="container">
<h1>Hello DigitalOcean</h1>
<p>This Nginx page is brought to you by Docker and DigitalOcean</p>
</div>
</body>
</html>
Se estiver usando o editor de texto nano
, saia e salve este arquivo pressionando CTRL+X
, Y
e ENTER
.
Agora você tem uma página de índice que substitui a página inicial padrão do Nginx.
Etapa 4 — Vinculando o contêiner ao sistema de arquivos local
Nesta etapa, você vinculará o Nginx ao seu contêiner para que seja acessível publicamente pela porta:80
e conecte-o ao conteúdo do seu site no servidor.
O Docker permite vincular diretórios do sistema de arquivos local da sua máquina virtual ao seu contêiner. Como você deseja exibir a nova página da Web, precisará fornecer ao contêiner os arquivos a serem renderizados.
Você pode copiar os arquivos para o contêiner como parte de um Dockerfile ou copiá-los para o contêiner após o fato, mas ambos os métodos deixam seu site em um estado estático dentro do contêiner. Ao usar o recurso de volumes de dados do Docker, você pode criar um link simbólico entre o sistema de arquivos do seu servidor e o sistema de arquivos do contêiner. Isso permite que você edite seus arquivos de página da Web existentes e adicione novos ao diretório. Com um link simbólico, seu container terá acesso a esses arquivos. Se você quiser ler mais sobre Docker e volumes, confira a documentação de volumes de dados.
O contêiner Nginx é configurado por padrão para procurar uma página de índice em /usr/share/nginx/html
. Em seu novo contêiner do Docker, você precisará conceder acesso a seus arquivos nesse local.
Para fazer isso, use o sinalizador -v
para mapear a pasta ~/docker-nginx/html
do seu servidor para um caminho relativo no contêiner/usr/ share/nginx/html
com este comando:
- docker run --name docker-nginx -p 80:80 -d -v ~/docker-nginx/html:/usr/share/nginx/html nginx
Aqui está uma breve explicação do comando:
- O sinalizador
-v
especifica que você está vinculando um volume.- À esquerda de
:
está o local do seu diretório em seu servidor,~/docker-nginx/html
. - À direita de
:
está o local que você está vinculando simbolicamente ao seu contêiner/usr/share/nginx/html
.
Depois de executar esse comando, insira o endereço IP do seu servidor no navegador para visualizar sua nova página de destino:
Se você está satisfeito com as configurações padrão do Nginx, não há mais nada para configurar.
Você pode fazer upload de mais conteúdo para o diretório ~/docker-nginx/html/
e ele será adicionado ao seu site ativo.
Por exemplo, se você modificar seu arquivo HTML e atualizar seu navegador, ele será atualizado de acordo. Você também pode criar um site inteiro a partir de arquivos HTML dessa maneira. Por exemplo, se você adicionou uma página about.html
, você pode acessá-la em http://your_server_ip/about.html
sem precisar interagir com o recipiente.
Etapa 5 — Usando seu próprio arquivo de configuração Nginx (opcional)
Se você deseja ter mais controle sobre como o Nginx funciona, pode usar um arquivo de configuração Nginx personalizado com o contêiner do Docker.
Primeiro, verifique se você está de volta ao diretório do projeto de nível superior:
- cd ~/docker-nginx
Copie o diretório de configuração do Nginx para a pasta do projeto usando o comando Docker copy:
- docker cp docker-nginx:/etc/nginx/conf.d/default.conf default.conf
Como você usará um arquivo .conf
personalizado para Nginx, será necessário reconstruir o contêiner.
Primeiro pare o contêiner:
- docker stop docker-nginx
Em seguida, remova-o:
- docker rm docker-nginx
Agora você pode editar o arquivo de configuração padrão do Nginx localmente para atender a um novo diretório ou usar um proxy_pass
para encaminhar o tráfego para outro aplicativo ou contêiner, como faria com uma instalação regular do Nginx. Você pode ler sobre o arquivo de configuração do Nginx em nosso guia de arquivo de configuração do Nginx.
Depois de salvar seu arquivo de configuração, é hora de criar o contêiner Nginx. Adicione um sinalizador -v
com os caminhos apropriados para fornecer a um novo contêiner Nginx os links apropriados para executar a partir de seu próprio arquivo de configuração. Por exemplo:
- docker run --name docker-nginx -p 80:80 -v ~/docker-nginx/html:/usr/share/nginx/html -v ~/docker-nginx/default.conf:/etc/nginx/conf.d/default.conf -d nginx
Este comando vincula as páginas do site personalizado ao contêiner.
Observe que você precisará reiniciar o contêiner usando o comando docker restart
ao fazer alterações em seu arquivo de configuração após iniciar o contêiner. Isso ocorre porque o Nginx não recarrega a quente se seu arquivo de configuração for alterado:
- docker restart docker-nginx
Isso reiniciará seu contêiner e suas alterações devem ser refletidas nas páginas associadas.
Conclusão
Agora você tem um contêiner Nginx em execução servindo uma página da Web personalizada e aprendeu como configurar o Nginx de dentro do seu contêiner.
Se quiser saber mais sobre como os contêineres funcionam, você pode revisar nosso tutorial Introdução aos contêineres.
Além disso, se você estiver interessado em aprender como compartilhar dados entre dois Docker Containers, confira nosso tutorial Como compartilhar dados entre Docker Containers.