Como Instalar e Usar o Docker no Ubuntu 22.04

Introdução

O Docker é um aplicativo que simplifica o processo de gerenciamento de processos de aplicativos em containers. Os containers permitem que você execute seus aplicativos em processos isolados de recursos. Eles são semelhantes a máquinas virtuais, mas os containers são mais portáteis, consomem menos recursos e dependem mais do sistema operacional hospedeiro.

Para uma introdução detalhada aos diferentes componentes de um container Docker, confira O Ecossistema do Docker: Uma Introdução aos Componentes Comuns.

Neste tutorial, você instalará e usará a Docker Community Edition (CE) no Ubuntu 22.04. Você instalará o Docker em si, trabalhará com containers e imagens e enviará uma imagem para um Repositório Docker.

Simplifique a implantação de aplicativos com a Plataforma de Aplicativos DigitalOcean. Implante diretamente do GitHub em minutos.

Pré-requisitos

Para seguir este tutorial, você precisará dos seguintes:

Passo 1 — Instalando o Docker

O pacote de instalação do Docker disponível no repositório oficial do Ubuntu pode não ser a versão mais recente. Para garantir que obtenhamos a versão mais recente, vamos instalar o Docker a partir do repositório oficial do Docker. Para fazer isso, adicionaremos uma nova fonte de pacotes, adicionaremos a chave GPG do Docker para garantir que os downloads sejam válidos e, em seguida, instalaremos o pacote.

Primeiro, atualize sua lista existente de pacotes:

  1. sudo apt update

Em seguida, instale alguns pacotes pré-requisitos que permitem que o apt use pacotes via HTTPS:

  1. sudo apt install apt-transport-https ca-certificates curl software-properties-common

Em seguida, adicione a chave GPG para o repositório oficial do Docker ao seu sistema:

  1. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

Adicione o repositório do Docker às fontes do APT:

  1. echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Atualize sua lista existente de pacotes novamente para que a adição seja reconhecida:

  1. sudo apt update

Certifique-se de que está prestes a instalar a partir do repositório do Docker em vez do repositório padrão do Ubuntu:

  1. apt-cache policy docker-ce

Você verá uma saída como esta, embora o número da versão para o Docker possa ser diferente:

Output of apt-cache policy docker-ce
docker-ce:
  Installed: (none)
  Candidate: 5:20.10.14~3-0~ubuntu-jammy
  Version table:
     5:20.10.14~3-0~ubuntu-jammy 500
        500 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
     5:20.10.13~3-0~ubuntu-jammy 500
        500 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages

Observe que o docker-ce não está instalado, mas o candidato para instalação é do repositório Docker para o Ubuntu 22.04 (jammy).

Por fim, instale o Docker:

  1. sudo apt install docker-ce

O Docker deve estar agora instalado, o daemon iniciado e o processo habilitado para iniciar na inicialização. Verifique se ele está em execução:

  1. sudo systemctl status docker

A saída deve ser semelhante à seguinte, mostrando que o serviço está ativo e em execução:

Output
● docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2022-04-01 21:30:25 UTC; 22s ago TriggeredBy: ● docker.socket Docs: https://docs.docker.com Main PID: 7854 (dockerd) Tasks: 7 Memory: 38.3M CPU: 340ms CGroup: /system.slice/docker.service └─7854 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

A instalação do Docker agora oferece não apenas o serviço Docker (daemon), mas também o utilitário de linha de comando docker, ou o cliente Docker. Exploraremos como usar o comando docker mais tarde neste tutorial.

Passo 2 — Executando o Comando Docker Sem Sudo (Opcional)

Por padrão, o comando docker só pode ser executado pelo usuário root ou por um usuário no grupo docker, que é criado automaticamente durante o processo de instalação do Docker. Se você tentar executar o comando docker sem prefixá-lo com sudo ou sem estar no grupo docker, você obterá uma saída como esta:

Output
docker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?. See 'docker run --help'.

Se você quiser evitar digitar sudo sempre que executar o comando docker, adicione seu nome de usuário ao grupo docker:

  1. sudo usermod -aG docker ${USER}

Para aplicar a nova adesão ao grupo, saia do servidor e entre novamente, ou digite o seguinte:

  1. su - ${USER}

Você será solicitado a inserir a senha do seu usuário para continuar.

Confirme que o seu usuário foi adicionado ao grupo docker digitando:

  1. groups
Output
sammy sudo docker

Se precisar adicionar um usuário ao grupo docker que você não está logado, declare explicitamente esse nome de usuário usando:

  1. sudo usermod -aG docker username

O restante deste artigo presume que você está executando o comando docker como um usuário no grupo docker. Se optar por não fazer isso, por favor, adicione sudo antes dos comandos.

Vamos explorar o comando docker a seguir.

Passo 3 — Usando o Comando Docker

Usar o docker consiste em passar uma cadeia de opções e comandos seguidos de argumentos. A sintaxe é a seguinte:

  1. docker [option] [command] [arguments]

Para visualizar todos os subcomandos disponíveis, digite:

  1. docker

A partir da versão do Docker 20.10.14, a lista completa de subcomandos disponíveis inclui:

Output
attach Attach local standard input, output, and error streams to a running container build Build an image from a Dockerfile commit Create a new image from a container's changes cp Copy files/folders between a container and the local filesystem create Create a new container diff Inspect changes to files or directories on a container's filesystem events Get real time events from the server exec Run a command in a running container export Export a container's filesystem as a tar archive history Show the history of an image images List images import Import the contents from a tarball to create a filesystem image info Display system-wide information inspect Return low-level information on Docker objects kill Kill one or more running containers load Load an image from a tar archive or STDIN login Log in to a Docker registry logout Log out from a Docker registry logs Fetch the logs of a container pause Pause all processes within one or more containers port List port mappings or a specific mapping for the container ps List containers pull Pull an image or a repository from a registry push Push an image or a repository to a registry rename Rename a container restart Restart one or more containers rm Remove one or more containers rmi Remove one or more images run Run a command in a new container save Save one or more images to a tar archive (streamed to STDOUT by default) search Search the Docker Hub for images start Start one or more stopped containers stats Display a live stream of container(s) resource usage statistics stop Stop one or more running containers tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE top Display the running processes of a container unpause Unpause all processes within one or more containers update Update configuration of one or more containers version Show the Docker version information wait Block until one or more containers stop, then print their exit codes

Para visualizar as opções disponíveis para um comando específico, digite:

  1. docker docker-subcommand --help

Para visualizar informações do sistema sobre o Docker, use:

  1. docker info

Vamos explorar alguns desses comandos. Vamos começar trabalhando com imagens.

Passo 4 — Trabalhando com Imagens Docker

Os contêineres Docker são construídos a partir de imagens Docker. Por padrão, o Docker baixa essas imagens do Docker Hub, um registro Docker gerenciado pelo Docker, a empresa por trás do projeto Docker. Qualquer pessoa pode hospedar suas imagens Docker no Docker Hub, então a maioria das aplicações e distribuições Linux de que você precisará terá imagens hospedadas lá.

Para verificar se você pode acessar e baixar imagens do Docker Hub, digite:

  1. docker run hello-world

A saída indicará que o Docker está funcionando corretamente:

Output
Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 2db29710123e: Pull complete Digest: sha256:bfea6278a0a267fad2634554f4f0c6f31981eea41c553fdf5a83e95a41d40c38 Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. ...

O Docker inicialmente não conseguiu encontrar a imagem hello-world localmente, então baixou a imagem do Docker Hub, que é o repositório padrão. Uma vez baixada a imagem, o Docker criou um contêiner a partir da imagem e o aplicativo dentro do contêiner foi executado, exibindo a mensagem.

Você pode pesquisar por imagens disponíveis no Docker Hub usando o comando docker com o subcomando search. Por exemplo, para pesquisar a imagem do Ubuntu, digite:

  1. docker search ubuntu

O script rastreará o Docker Hub e retornará uma listagem de todas as imagens cujo nome corresponde à cadeia de pesquisa. Neste caso, a saída será semelhante a esta:

Output
NAME DESCRIPTION STARS OFFICIAL AUTOMATED ubuntu Ubuntu is a Debian-based Linux operating sys… 14048 [OK] websphere-liberty WebSphere Liberty multi-architecture images … 283 [OK] ubuntu-upstart DEPRECATED, as is Upstart (find other proces… 112 [OK] neurodebian NeuroDebian provides neuroscience research s… 88 [OK] open-liberty Open Liberty multi-architecture images based… 51 [OK] ...

Na coluna OFICIAL, OK indica uma imagem construída e suportada pela empresa por trás do projeto. Depois de identificar a imagem que você deseja usar, pode baixá-la para o seu computador usando o subcomando pull.

Execute o seguinte comando para baixar a imagem oficial do ubuntu para o seu computador:

  1. docker pull ubuntu

Você verá a seguinte saída:

Output
Using default tag: latest latest: Pulling from library/ubuntu e0b25ef51634: Pull complete Digest: sha256:9101220a875cee98b016668342c489ff0674f247f6ca20dfc91b91c0f28581ae Status: Downloaded newer image for ubuntu:latest docker.io/library/ubuntu:latest

Depois que uma imagem for baixada, você pode então executar um contêiner usando a imagem baixada com o subcomando run. Como você viu no exemplo do hello-world, se uma imagem não foi baixada quando o docker é executado com o subcomando run, o cliente Docker primeiro baixará a imagem e depois executará um contêiner usando-a.

Para ver as imagens que foram baixadas para o seu computador, digite:

  1. docker images

A saída será semelhante à seguinte:

Output
REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu latest 1d622ef86b13 3 weeks ago 73.9MB hello-world latest bf756fb1ae65 4 months ago 13.3kB

Como você verá mais tarde neste tutorial, imagens que você usa para executar contêineres podem ser modificadas e usadas para gerar novas imagens, que então podem ser enviadas (pushed é o termo técnico) para o Docker Hub ou outros registros do Docker.

Vamos ver como executar contêineres com mais detalhes.

Passo 5 — Executando um Contêiner Docker

O recipiente hello-world que você executou na etapa anterior é um exemplo de um recipiente que é executado e sai após emitir uma mensagem de teste. Os recipientes podem ser muito mais úteis do que isso e podem ser interativos. Afinal, eles são semelhantes a máquinas virtuais, apenas mais econômicos em recursos.

Como exemplo, vamos executar um recipiente usando a imagem mais recente do Ubuntu. A combinação das opções -i e -t oferece acesso interativo ao shell dentro do recipiente:

  1. docker run -it ubuntu

Seu prompt de comando deve mudar para refletir o fato de que você está agora trabalhando dentro do recipiente e deve ter esta forma:

Output
root@d9b100f2f636:/#

Observe o ID do recipiente no prompt de comando. Neste exemplo, é d9b100f2f636. Você vai precisar desse ID do recipiente depois para identificar o recipiente quando quiser removê-lo.

Agora você pode executar qualquer comando dentro do recipiente. Por exemplo, vamos atualizar o banco de dados de pacotes dentro do recipiente. Você não precisa prefixar nenhum comando com sudo, porque está operando dentro do recipiente como o usuário root:

  1. apt update

Depois, instale qualquer aplicativo nele. Vamos instalar o Node.js:

  1. apt install nodejs

Isso instala o Node.js no recipiente a partir do repositório oficial do Ubuntu. Quando a instalação terminar, verifique se o Node.js está instalado:

  1. node -v

Você verá o número da versão exibido no seu terminal:

Output
v12.22.9

Quaisquer alterações que você fizer dentro do recipiente se aplicam apenas a esse recipiente.

Para sair do recipiente, digite exit no prompt.

Vamos ver como gerenciar os recipientes em nosso sistema em seguida.

Passo 6 — Gerenciando Containers Docker

Depois de usar o Docker por um tempo, você terá muitos containers ativos (em execução) e inativos em seu computador. Para visualizar os ativos, use:

  1. docker ps

Você verá uma saída semelhante à seguinte:

Output
CONTAINER ID IMAGE COMMAND CREATED

Neste tutorial, você iniciou dois containers; um a partir da imagem hello-world e outro a partir da imagem ubuntu. Ambos os containers não estão mais em execução, mas ainda existem em seu sistema.

Para visualizar todos os containers — ativos e inativos, execute docker ps com o interruptor -a:

  1. docker ps -a

Você verá uma saída semelhante a esta:

Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1c08a7a0d0e4 ubuntu "bash" About a minute ago Exited (0) 7 seconds ago dazzling_taussig 587000e49d53 hello-world "/hello" 5 minutes ago Exited (0) 5 minutes ago adoring_kowalevski

Para visualizar o último container que você criou, passe o interruptor -l:

  1. docker ps -l
Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1c08a7a0d0e4 ubuntu "bash" 3 minutes ago Exited (0) 2 minutes ago dazzling_taussig

Para iniciar um container parado, use docker start, seguido pelo ID do container ou pelo nome do container. Vamos iniciar o container baseado no Ubuntu com o ID 1c08a7a0d0e4:

  1. docker start 1c08a7a0d0e4

O container será iniciado, e você pode usar docker ps para ver seu status:

Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1c08a7a0d0e4 ubuntu "bash" 6 minutes ago Up 8 seconds dazzling_taussig

Para parar um container em execução, use docker stop, seguido pelo ID do container ou pelo nome. Desta vez, usaremos o nome que o Docker atribuiu ao container, que é dazzling_taussig:

  1. docker stop dazzling_taussig

Depois de decidir que não precisa mais de um contêiner, remova-o com o comando docker rm, novamente usando o ID do contêiner ou o nome. Use o comando docker ps -a para encontrar o ID do contêiner ou nome para o contêiner associado à imagem hello-world e remova-o.

  1. docker rm adoring_kowalevski

Você pode iniciar um novo contêiner e dar-lhe um nome usando o parâmetro --name. Você também pode usar o parâmetro --rm para criar um contêiner que se remove automaticamente quando é parado. Consulte o comando docker run help para obter mais informações sobre essas opções e outras.

Os contêineres podem ser convertidos em imagens que você pode usar para criar novos contêineres. Vamos ver como isso funciona.

Passo 7 — Registrando Alterações em um Contêiner para uma Imagem Docker

Ao iniciar uma imagem Docker, você pode criar, modificar e excluir arquivos da mesma forma que faria com uma máquina virtual. As alterações que você fizer serão aplicadas apenas a esse contêiner. Você pode iniciar e pará-lo, mas uma vez que o destruir com o comando docker rm, as alterações serão perdidas para sempre.

Esta seção mostra como salvar o estado de um contêiner como uma nova imagem Docker.

Depois de instalar o Node.js dentro do contêiner Ubuntu, você agora tem um contêiner em execução a partir de uma imagem, mas o contêiner é diferente da imagem que você usou para criá-lo. Mas talvez você queira reutilizar este contêiner Node.js como base para novas imagens mais tarde.

Então, confirme as alterações para uma nova instância de imagem Docker usando o seguinte comando.

  1. docker commit -m "What you did to the image" -a "Author Name" container_id repository/new_image_name

O interruptor -m é para a mensagem de confirmação que ajuda você e outros a saberem quais alterações você fez, enquanto -a é usado para especificar o autor. O container_id é aquele que você anotou anteriormente no tutorial quando iniciou a sessão interativa do Docker. A menos que você tenha criado repositórios adicionais no Docker Hub, o repositório geralmente é o nome de usuário do Docker Hub.

Por exemplo, para o usuário sammy, com o ID do contêiner d9b100f2f636, o comando seria:

  1. docker commit -m "added Node.js" -a "sammy" d9b100f2f636 sammy/ubuntu-nodejs

Ao confirmar uma imagem, a nova imagem é salva localmente em seu computador. Mais tarde neste tutorial, você aprenderá como enviar uma imagem para um registro do Docker, como o Docker Hub, para que outros possam acessá-la.

Listar as imagens do Docker novamente mostrará a nova imagem, bem como a antiga da qual ela foi derivada:

  1. docker images

Você verá uma saída como esta:

Output
REPOSITORY TAG IMAGE ID CREATED SIZE sammy/ubuntu-nodejs latest 7c1f35226ca6 7 seconds ago 179MB ...

Neste exemplo, ubuntu-nodejs é a nova imagem, que foi derivada da imagem ubuntu existente do Docker Hub. A diferença de tamanho reflete as alterações que foram feitas. E neste exemplo, a mudança foi que o NodeJS foi instalado. Então, da próxima vez que você precisar executar um contêiner usando o Ubuntu com o NodeJS pré-instalado, você pode simplesmente usar a nova imagem.

Você também pode construir imagens a partir de um Dockerfile, o que permite automatizar a instalação de software em uma nova imagem. No entanto, isso está fora do escopo deste tutorial.

Agora vamos compartilhar a nova imagem com outros para que eles possam criar containers a partir dela.

Passo 8 — Enviando Imagens Docker para um Repositório Docker

O próximo passo lógico após criar uma nova imagem a partir de uma imagem existente é compartilhá-la com alguns de seus amigos, o mundo inteiro no Docker Hub, ou outro registro Docker ao qual você tenha acesso. Para enviar uma imagem para o Docker Hub ou qualquer outro registro Docker, você deve ter uma conta lá.

Para enviar sua imagem, primeiro faça login no Docker Hub.

  1. docker login -u docker-registry-username

Você será solicitado a autenticar usando sua senha do Docker Hub. Se você especificou a senha correta, a autenticação deverá ter êxito.

Observação: Se o nome de usuário do seu registro Docker for diferente do nome de usuário local que você usou para criar a imagem, você terá que marcar sua imagem com o nome de usuário do seu registro. Para o exemplo dado no último passo, você digitaria:

  1. docker tag sammy/ubuntu-nodejs docker-registry-username/ubuntu-nodejs

Então você pode enviar sua própria imagem usando:

  1. docker push docker-registry-username/docker-image-name

Para enviar a imagem ubuntu-nodejs para o repositório sammy, o comando seria:

  1. docker push sammy/ubuntu-nodejs

O processo pode levar algum tempo para ser concluído, pois ele faz upload das imagens, mas quando concluído, a saída será parecida com esta:

Output
The push refers to a repository [docker.io/sammy/ubuntu-nodejs] e3fbbfb44187: Pushed 5f70bf18a086: Pushed a3b5c80a4eba: Pushed 7f18b442972b: Pushed 3ce512daaf78: Pushed 7aae4540b42d: Pushed ...

Após enviar uma imagem para um registro, ela deve ser listada no painel da sua conta, como mostrado na imagem abaixo.

Se uma tentativa de envio resultar em um erro desse tipo, é provável que você não tenha feito login:

Output
The push refers to a repository [docker.io/sammy/ubuntu-nodejs] e3fbbfb44187: Preparing 5f70bf18a086: Preparing a3b5c80a4eba: Preparing 7f18b442972b: Preparing 3ce512daaf78: Preparing 7aae4540b42d: Waiting unauthorized: authentication required

Faça login com docker login e repita a tentativa de envio. Em seguida, verifique se ela existe na página do repositório Docker Hub.

Agora você pode usar docker pull sammy/ubuntu-nodejs para puxar a imagem para uma nova máquina e usá-la para executar um novo contêiner.

Conclusão

Neste tutorial, você instalou o Docker, trabalhou com imagens e contêineres e enviou uma imagem modificada para o Docker Hub. Agora que você conhece o básico, explore os outros tutoriais Docker na Comunidade DigitalOcean.

Source:
https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-22-04