docker: Error response from daemon: Conflict. The container name “/postgres” is already in use by container
Execute o comando para listar os containers
$ sudo docker container ls -a
Possível retorno (caso algum container tenha sido executado):
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d1eeef8cb196 postgres "docker-entrypoint.s…" 8 minutes ago Exited (1) 8 minutes ago strange_driscoll a15a476e5762 postgres:latest "docker-entrypoint.s…" 15 minutes ago Exited (1) 15 minutes ago upbeat_almeida 6e848c2aa472 postgres "docker-entrypoint.s…" 2 months ago Exited (0) 2 months ago postgres 6384a84eb8a0 postgres:14-alpine "docker-entrypoint.s…" 3 months ago Exited (0) 8 weeks ago my-postgres d4033c9b13ae mysql "docker-entrypoint.s…" 3 months ago Exited (0) 8 weeks ago mysql
O Docker é um aplicativo que simplifica o processo de gerenciamento de processos de aplicação em containers. Os containers deixam você executar suas aplicações em processos isolados de recurso. Eles são semelhantes a máquinas virtuais, mas os containers são mais portáveis, mais fáceis de usar e mais dependentes do sistema operacional do host.
Neste tutorial, você irá instalar e usar a Edição Community (CE) do Docker no Ubuntu 20.04. Você instalará o Docker propriamente dito, trabalhará com contêineres e imagens, e enviará uma imagem para um repositório do Docker.
Pré-requisitos
Para seguir este tutorial, você precisará do seguinte:
Uma conta no Docker Hub se você deseja criar suas próprias imagens e enviá-las para o Docker Hub, como mostrado nos passos 7 e 8.
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 tenhamos a versão mais recente, iremos instalar o Docker do repositório oficial do Docker. Para fazer isso, adicionaremos uma nova fonte de pacote, adicionaremos a chave GPG do Docker para garantir que os downloads sejam válidos, e então instalaremos o pacote.
Primeiro, atualize sua lista existente de pacotes:
sudo apt update
Copy
Em seguida, instale alguns pacotes pré-requisito que deixam o apt usar pacotes pelo HTTPS:
Instalando o Docker agora não dá apenas o serviço do Docker (daemon), mas também o utilitário de linha de comando docker, ou o cliente do Docker. Vamos explorar 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 no processo de instalação do Docker. Se você tentar executar o comando docker sem prefixar ele com o sudo ou sem estar no grupo docker, você terá um resultado como este:
Outputdocker: 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 você executar o comando docker, adicione seu nome de usuário no grupo docker:
sudo usermod -aG docker ${USER}
Copy
Para inscrever o novo membro ao grupo, saia do servidor e logue novamente, ou digite o seguinte:
su - ${USER}
Copy
Você será solicitado a digitar a senha do seu usuário para continuar.
Confirme que seu usuário agora está adicionado ao grupo docker digitando:
id -nG
Copy
Outputsammy sudo docker
Se você precisar adicionar um usuário ao grupo docker com o qual você não está logado, declare esse nome de usuário explicitamente usando:
sudo usermod -aG docker username
Copy
O resto deste artigo supõe que você esteja executando o comando docker como um usuário no grupo docker. Se você escolher não fazer isso, por favor preencha os comandos com sudo.
Vamos explorar o comando docker a seguir.
Passo 3 — Usando o Comando Docker
Usar o docker consiste em passar a ele uma cadeia de opções e comandos seguidos de argumentos. A sintaxe toma esta forma:
docker [option] [command] [arguments]
Copy
Para ver todos os subcomandos disponíveis, digite:
docker
Copy
No Docker 19, 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:
docker docker-subcommand --help
Copy
Para visualizar informações de sistema sobre o Docker, use:
docker info
Copy
Vamos explorar alguns desses comandos. Começaremos trabalhando com imagens.
Passo 4 — Trabalhando com Imagens do Docker
Os containers do Docker são construídos com imagens do Docker. Por padrão, o Docker puxa essas imagens do Docker Hub, um registro Docker gerido pelo Docker, a empresa por trás do projeto Docker. Qualquer um pode hospedar suas imagens do Docker no Docker Hub, então a maioria dos aplicativos e distribuições do Linux que você precisará terá imagens hospedadas lá.
Para verificar se você pode acessar e baixar imagens do Docker Hub, digite:
docker run hello-world
Copy
O resultado irá indicar que o Docker está funcionando corretamente:
OutputUnable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete
Digest: sha256:6a65f928fb91fcfbc963f7aa6d57c8eeb426ad9a20c7ee045538ef34847f44f1
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 ele baixou a imagem do Docker Hub, que é o repositório padrão. Uma vez baixada a imagem, o Docker criou um container da imagem e executou o aplicativo no container, mostrando a mensagem.
Você pode procurar imagens disponíveis no Docker Hub usando o comando docker com o subcomando search. Por exemplo, para procurar a imagem do Ubuntu, digite:
docker search ubuntu
Copy
O script irá vasculhar o Docker Hub e devolverá uma lista de todas as imagens cujo nome correspondam ao string de pesquisa. Neste caso, o resultado será similar a este:
OutputNAME DESCRIPTION STARS OFFICIAL AUTOMATED
ubuntu Ubuntu is a Debian-based Linux operating sys… 10908 [OK]
dorowu/ubuntu-desktop-lxde-vnc Docker image to provide HTML5 VNC interface … 428 [OK]
rastasheep/ubuntu-sshd Dockerized SSH service, built on top of offi… 244 [OK]
consol/ubuntu-xfce-vnc Ubuntu container with "headless" VNC session… 218 [OK]
ubuntu-upstart Upstart is an event-based replacement for th… 108 [OK]
ansible/ubuntu14.04-ansible Ubuntu 14.04 LTS with
...
Na coluna OFICIAL, o OK indica uma imagem construída e suportada pela empresa por trás do projeto. Uma vez que você tenha identificado a imagem que você gostaria de usar, você pode baixá-la para seu computador usando o subcomando pull.
Execute o comando a seguir para baixar a imagem oficial ubuntu no seu computador:
Após o download de uma imagem, você pode então executar um container usando a imagem baixada com o subcomando run. Como você viu com o exemplo hello-world, caso uma imagem não tenha sido baixada quando o docker for executado com o subcomando run, o cliente do Docker irá primeiro baixar a imagem e então executar um container usando ele.
Para ver as imagens que foram baixadas no seu computador, digite:
docker images
Copy
O resultado se parecerá com o seguinte:
OutputREPOSITORY 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 containers podem ser modificadas e usadas para gerar novas imagens, que podem então ser enviadas (pushed é o termo técnico) para o Docker Hub ou outros registros do Docker.
Vamos ver como executar containers mais detalhadamente.
Passo 5 — Executando um Container do Docker
O container hello-world que você executou no passo anterior é um exemplo de um container que executa e finaliza após emitir uma mensagem de teste. Os containers podem ser muito mais úteis do que isso, e eles podem ser interativos. Afinal, eles são semelhantes a máquinas virtuais, apenas mais fáceis de usar.
Como um exemplo, vamos executar um container usando a última imagem do Ubuntu. A combinação dos switches -i e -t dá a você um acesso de shell interativo no container:
docker run -it ubuntu
Copy
Seu prompt de comando deve mudar para refletir o fato de você agora estar trabalhando dentro do container e deve assumir esta forma:
Outputroot@d9b100f2f636:/#
Observe o id do container no prompt de comando. Neste exemplo, é d9b100f2f636. Você precisará do ID do container mais tarde para identificar o container quando você quiser removê-lo.
Agora você pode executar qualquer comando dentro do container. Por exemplo, vamos atualizar o banco de dados do pacote dentro do container. Você não precisa prefixar nenhum comando com sudo, porque você está operando dentro do container como o usuário root:
apt update
Copy
Então, instale qualquer aplicativo nele. Vamos instalar o Node.js:
apt install nodejs
Copy
Isso instala o Node.js no container do repositório oficial do Ubuntu. Quando a instalação terminar, verifique se o Node.js está instalado:
node -v
Copy
Você verá o número da versão exibido no seu terminal:
Outputv10.19.0
Qualquer alteração que você faça dentro do container apenas se aplica a esse container.
Para sair do container, digite exit no prompt.
Vamos ver como gerenciar os containers no nosso sistema a seguir.
Passo 6 — Gerenciando os Containers do Docker
Após usar o Docker por um tempo, você terá muitos containers ativos (executando) e inativos no seu computador. Para visualizar os ativos, use:
docker ps
Copy
Você verá um resultado similar ao seguinte:
OutputCONTAINER ID IMAGE COMMAND CREATED
Neste tutorial, você iniciou dois containers; um da imagem hello-world e outro da imagem ubuntu. Ambos os containers já não estão funcionando, mas eles ainda existem no seu sistema.
Para ver todos os containers — ativos e inativos, execute docker ps com o switch -a:
docker ps -a
Copy
Você verá um resultado similar a este:
1c08a7a0d0e4 ubuntu "/bin/bash" 2 minutes ago Exited (0) 8 seconds ago quizzical_mcnulty
a707221a5f6c hello-world "/hello" 6 minutes ago Exited (0) 6 minutes ago youthful_curie
Para ver o último container que você criou, passe o switch -l:
docker ps -l
Copy
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1c08a7a0d0e4 ubuntu "/bin/bash" 2 minutes ago Exited (0) 40 seconds ago quizzical_mcnulty
Copy
Para iniciar um container parado, use o docker start, seguido do ID do container ou nome do container. Vamos iniciar o contêiner baseado no Ubuntu com o ID do 1c08a7a0d0e4:
docker start 1c08a7a0d0e4
Copy
O container irá iniciar e você pode usar o docker ps para ver seu status:
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1c08a7a0d0e4 ubuntu "/bin/bash" 3 minutes ago Up 5 seconds quizzical_mcnulty
Para parar um container em execução, use o docker stop, seguido do ID ou nome do container. Desta vez, usaremos o nome que o Docker atribuiu ao contêiner, que é quizzical_mcnulty:
docker stop quizzical_mcnulty
Copy
Uma vez que você tenha decidido que você já não precisa mais de um container, remova ele com o comando docker rm, novamente usando o ID do container ou o nome. Use o comando docker ps -a para encontrar o ID ou nome do container associado à imagem hello-world e remova-o.
docker rm youthful_curie
Copy
Você pode iniciar um novo container e dar a ele um nome usando o switch --name. Você também pode usar o switch --rm para criar um container que remove a si mesmo quando ele é parado. Veja o comando docker run help para obter mais informações sobre essas e outras opções.
Os containers podem ser transformados em imagens que você pode usar para criar novos containers. Vamos ver como isso funciona.
Passo 7 —Enviando Alterações em um Container para uma Imagem do Docker
Quando você iniciar uma imagem do Docker, você pode criar, modificar e deletar arquivos assim como você pode com uma máquina virtual. As alterações que você faz apenas se aplicarão a esse container. Você pode iniciá-lo e pará-lo, mas uma vez que você 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 container como uma nova imagem do Docker.
Após instalar o Node.js dentro do container do Ubuntu, você agora tem um container executando uma imagem, mas o container é diferente da imagem que você usou para criá-lo. Mas você pode querer reutilizar este container Node.js como a base para novas imagens mais tarde.
Então, envie as alterações a uma nova instância de imagem do Docker usando o comando a seguir.
docker commit -m "What you did to the image" -a "Author Name" container_id repository/new_image_name
Copy
O switch -m é para a mensagem de envio que ajuda você e outros a saber quais as alterações que você fez, enquanto -a é usado para especificar o autor. O container_id é aquele que você anotou anteriormente no tutorial quando você iniciou a sessão interativa do Docker. A menos que você tenha criado repositórios adicionais no Docker Hub, repository é normalmente seu nome de usuário do Docker Hub.
Por exemplo, para o usuário sammy, com o ID do container d9b100f2f636, o comando seria:
docker commit -m "added Node.js" -a "sammy" d9b100f2f636 sammy/ubuntu-nodejs
Copy
Quando você envia uma imagem, a nova imagem é salva localmente no seu computador. Mais tarde neste tutorial, você aprenderá como empurrar uma imagem para um registro do Docker para que outros possam acessá-la.
Listando as imagens do Docker novamente irá mostrar a nova imagem, além da antiga da qual ela foi derivada:
docker images
Copy
Você verá um resultado como esse:
OutputREPOSITORY TAG IMAGE ID CREATED SIZE
sammy/ubuntu-nodejs latest 7c1f35226ca6 7 seconds ago 179MB
...
Neste exemplo, o 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 container usando o Ubuntu com o NodeJS pré-instalado, você pode apenas usar a nova imagem.
Você também pode construir Imagens de um Dockerfile, que permite a você automatizar a instalação de software em uma nova imagem. No entanto, isso está fora do âmbito deste tutorial.
Agora vamos compartilhar a nova imagem com outros para que eles possam criar containers a partir dela.
Passo 8 — Empurrando Imagens do Docker para um Repositório do Docker
O próximo passo lógico após criar uma nova imagem de uma imagem existente é compartilhá-la com alguns de seus amigos, todo o mundo no Docker Hub, ou outro registro do Docker que você tenha acesso. Para empurrar uma imagem para o Docker Hub ou qualquer outro registro do Docker, você deve ter uma conta lá.
Para empurrar sua imagem, primeiro logue no Docker Hub.
docker login -u docker-registry-username
Copy
Você será solicitado a autenticar-se usando sua senha do Docker Hub. Se você especificou a senha correta, a autenticação deve ser bem sucedida.
Nota: se seu nome de usuário de registro do Docker for diferente do nome de usuário local que você usou para criar a imagem, você terá que anexar sua imagem com seu nome de usuário de registro. Para o exemplo dado no último passo, você digitaria:
docker tag sammy/ubuntu-nodejs docker-registry-username/ubuntu-nodejs
Copy
Então você pode empurrar sua própria imagem usando:
Pode-se verificar os conteiners rodando, com o comando
$ sudo docker ps
Deverá aparecer
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1fffaaa4887c dpage/pgadmin4 "/entrypoint.sh" About a minute ago Up About a minute 443/tcp, 0.0.0.0:16543->80/tcp postgres_teste-pgadmin-compose_1
63e1934f7cdb postgres "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:15432->5432/tcp postgres_teste-postgres-compose_1
Agora, vamos acessar o PgAdmin
Abra um navegador e digite: http://localhost:16543
Forneça o usuário e senha informados no docker-compose
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7b1600afd168 sebp/elk “/usr/local/bin/star…” 15 minutes ago Up 14 minutes 0.0.0.0:5044->5044/tcp, 0.0.0.0:5601->5601/tcp, 0.0.0.0:9200->9200/tcp, 9300/tcp elk
Quando nós acabamos de subir o Docker Engine, nós utilizamos esse comando para verificarmos as informações do nosso Docker Host.
Docker version
docker version
Com o version nós conseguimos ver a versão do nosso Client, para esse artigo estou utilizando o Windows e o Server que para esse exemplo estamos utilizar o Linux. Quanto ao OS/Arch do server nós podemos trabalhar com Windows ou Linux, caso você esteja utilizando o Docker for Windows basta clicar em Swith to Windows Containers que ele irá realizar essa alteração.
Docker images
docker images
Nós utilizamos ele para listarmos as imagens que nós temos no nosso host, como eu acabei de instalar o Docker no meu Windows a lista está vazia como podemos ver na imagem a baixo:
Repository: repositório;
TAG: tag utilizada no repositório;
IMAGE ID: o id na nossa imagem;
Created: data de quando nós criamos a nossa imagem;
Size: tamanho da imagem;
Docker search
docker search (parametro)
Para que possamos procurar uma imagem, nós podemos utilizar o comando a baixo com o parâmetro nome Ex.: ubuntu, dotnetcore, node … etc, assim ele irá buscar as imagens que são compatíveis com o nosso server que para esse exemplo estamos utilizando o Linux.
Docker pull
docker pull (parametro)
Quando encontrarmos a imagem que precisamos para a nossa aplicação, nós precisamos baixar ela para o nosso host.
Docker run
docker pull (nome da imagem)
Para que nós possamos criar um contêiner, nós precisamos de uma imagem. Caso você não tenha essa imagem no seu host ainda ele irá até o repositório central e irá baixar ela para o seu host, em seguida ele irá criar o contêiner.
Docker ps
docker ps
Agora vamos verificar o status do nosso contêiner, execute o comando acima no seu terminal.
Docker status
docker stats (id ou apelido do container)
Para que possamos ter informações sobre um contêiner nos executamos o comando acima, ele nos retorna dados como:
CONTAINER — ID do Container;
CPU % — uso de CPU em porcentagem;
MEM USAGE / LIMIT — Memória usada/Limite que você pode ter setado;
MEM — uso de memória em porcentagem;
NET I/O — I/O de Internet;
BLOCK IO — Outros processos de I/O;
Docker inspect
docker inspect (id da imagem ou container)
Caso você precise de mais detalhes sobre a sua imagem ou o seu contêiner, podemos utilizar o comando inspect. Ele irá retornar um json com todas as informações relacionadas a nossa busca.
Docker rmi
docker rmi (nome da imagem)
Caso você tenha baixado uma imagem errada ou queira deletar alguma por um outro motivo, basta executar o comando a cima que ele deleta ela do seu host.
Docker rm e ps
Você pode excluir todos os containers criados
$ sudo docker rm ($ sudo docker ps -a)
Ou remover os criados e parados
$ sudo docker rm ($ sudo docker ps -a -q)
Docker exec
docker exec (id_container ou nome_container)
Com o exec nós podemos executar qualquer comando nos nossos contêineres sem precisarmos estar na console deles.
Vejamos a baixo alguns dos parâmetros que podemos utilizar com ele:
-i permite interagir com o container
-t associa o seu terminal ao terminal do container
-it é apenas uma forma reduzida de escrever -i -t
--name algum-nome permite atribuir um nome ao container em execução
-p 8080:80 mapeia a porta 80 do container para a porta 8080 do host
-d executa o container em background
-v /pasta/host:/pasta/container cria um volume ‘/pasta/container’ dentro do container com o conteúdo da pasta ‘/pasta/host’ do host
Docker attach
docker attach (id_container ou nome_container)
Vamos agora entrar dentro do nosso contêiner e verificar o nosso novo arquivo criado. Para isso execute o comando acima + o nome do ou id do seu contêiner, podemos observar que a execução dele irá nos dar acesso de root no nosso contêiner.
Docker start
docker start (id do container)
Quando nós saimos do nosso container com o comando exit, ele mata o nosso processo.
Para que possamos dar um dettach ou em outras palavras sair sem fecharmos ele, nós precisamos dos comandos: Ctrl+p + Ctrl+q. Para que possamos subir ele novamente vamos utilizar o comando start.
Agora execute o comando attach novamente para entrar no seu contêiner e depois os comandos : Ctrl+p + Ctrl+q, em seguida podemos verificar que o nosso contêiner ainda está em execução.
Docker stop
docker stop (id ou nome container)
Para que possamos parar um contêiner que esteja sendo executado, nós utilizamos o comando stop. Sua execução é bem simples, nós passamos o mesmos parâmetros que utilizamos no start.
Mapeamento de Portas
-p host:container
Para que possamos testar o mapeamento de portas iremos baixar a imagem do ngnix e passarmos para ele a porta 80. Para isso execute o comando a baixo no seu terminal:
docker run -it -p 8080:80 nginx
Ele irá baixar a imagem do nginx para o seu host e abrir ele na porta 8080 do seu host. Para testar assim que ele finalizar a execução do comando acima, abra no seu navegador o endereço: http://localhost:8080/, podemos ver o seu retorno na imagem a baixo.
Mas executando ele dessa forma nós ficamos com o nosso console travado.
Para que possamos ter um contêiner sendo executado em background, nós podemos utilizar eles em segundo plano. Para isso, só precisamos passar o comando -d. Caso ainda esteja o seu contêiner ainda esteja sendo executado, execute o comando control c para sair dele, em seguida execute o mesmo comando anterior só que agora com o parâmetro -d:
Com a aplicação importada em sua IDE de preferência, crie o arquivo Dockerfile (sem extensão) na raiz do projeto.
IMPORTANTE: O arquivo deve ser criado com a primeira letra maiúscula e o restante minúscula (Dockerfile). Se não for respeitado o nome, não funcionará.
Mostrará a imagem criada, conforme o arquivo de configuração (ex: java:8).
# docker build -t java:8 .
Identificará o REPOSITORY e TAG.
# docker run -it -p 8000:8080 java:8
Isso fará subir a imagem (java:8) sob a porta local 8000 e porta no container 8080. Perceba também que já subirá sua aplicação Spring Boot (java -jar /app.jar).
Agora, basta abrir um navegador na máquina e digitar:
http://localhost:8000
Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Wed Jan 17 22:28:41 UTC 2018
There was an unexpected error (type=Not Found, status=404).
No message available
Sob a URL http://localhost:8000/user/list
[]
Aparecerá 2 colchetes, informando que o banco de usuários está vazio.
Pronto! Sua aplicação agora, está rodando sob o container Docker.
# CTRL + p + q (sairá do container, mas continuará rodando)
# docker stats [[CONTAINER_ID]] (apresentará o consumo de CPU, Memória e IO)
CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
bbcf887896ac 0.09% 326.9MiB / 3.659GiB 8.72% 26.4kB / 4.44kB 90.2MB / 0B 34