É um repositório público e privado, mantido pelo próprio Docker. Onde podemos disponibilizar e compartilhar nossas imagens de container, simples assim.
Obs.: pode ser acessado via url (
hub.docker.com).
Aproveita e já crie uma conta lá no DockerHub, agora mesmo, utilizaremos ela em breve.
Por enquanto, vamos começar a brincar com um cara que é muito interessante que se chama DockerFile. DockerFile nada mais é que um arquivo com instruções para criar um container. Vamos partir pra prática, para facilitar o entendimento.
# mkdir /dockerfile ; cd /dockerfile ; vim Dockerfile
FROM ubuntu
MAINTAINER Bruno Bueno brunobueno87@gmail.com
RUN apt-get update && apt-get install apache2 -y && apt-get clean
EXPOSE 80
Salve o arquivo e vamos fazer o "build" desse dockerfile:
# docker build -t pri_image:1.0
Logo após, vai printar no seu terminal algo parecido com:
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM ubuntu
---> bd3d4369aebc
Step 2 : MAINTAINER Bruno Bueno brunobueno87@gmail.com
---> Using cache
---> 8cb2766acf6d
Step 3 : RUN apt-get update && apt-get install apache2 -y && apt-get clean
---> Running in 0b0fe15e4ffa
Get:1 http://archive.ubuntu.com/ubuntu xenial InRelease [247 kB]
Get:2 http://archive.ubuntu.com/ubuntu xenial-updates InRelease [95.7 kB]
Get:3 http://archive.ubuntu.com/ubuntu xenial-security InRelease [94.5 kB]
Get:4 http://archive.ubuntu.com/ubuntu xenial/main Sources [1103 kB]
Get:5 http://archive.ubuntu.com/ubuntu xenial/restricted Sources [5179 B]
Get:6 http://archive.ubuntu.com/ubuntu xenial/universe Sources [9802 kB]
.....
....
debconf: falling back to frontend: Readline
Processing triggers for libc-bin (2.23-0ubuntu3) ...
Processing triggers for systemd (229-4ubuntu7) ...
Processing triggers for sgml-base (1.26+nmu4ubuntu1) ...
---> 622b14ceadf0
Removing intermediate container 0b0fe15e4ffa
Step 4 : EXPOSE 80
---> Running in dfa594b2d07a
---> 0ebd0112da72
Removing intermediate container dfa594b2d07a
Successfully built 0ebd0112da72
Ao final do build desse dockerfile básico que fizemos, vamos verificar se a nova imagem baseada nesse dockerfile existe:
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
pri_image 1.0 0ebd0112da72 11 seconds ago 265.1 MB
ubuntu latest bd3d4369aebc 2 days ago 126.6 MB
apache_lab 1.0 b994948dbab5 2 days ago 193.9 MB
debian latest 1b01529cc499 4 weeks ago 125.1 MB
graylog2/allinone latest 37344ed703dc 5 months ago 870.3 MB
Como mostra a primeira linha, estamos vendo que a imagem foi criada. Vamos iniciar o container para verificar se está tudo de acordo, conforme solicitamos via dockerfile:
# docker run -ti pri_image:1.0 .
# /etc/init.d/apache2 start
* Starting Apache httpd web server apache2
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.3. Set the 'ServerName' directive globally to suppress this message
Certo, saia do container sem matar ele e rode o
docker ps:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e19650383ab2 pri_image:1.0 "/bin/bash" 24 seconds ago Up 21 seconds 80/tcp elated_bell
7155da1ddf08 apache_lab:1.0 "/bin/bash" 2 days ago Up About an hour 0.0.0.0:8081->80/tcp thirsty_noether
Blz, isso mostra que nosso primeiro dockerfile está funcionando plenamente, bem básico. Mas para fins didáticos, já dá para iniciar e entender o que é um dockerfile.
Vamos detalhar nosso primeiro dockerfile:
- FROM ubuntu → Imagem que utilizaremos na criação do container;
- MAINTAINER Bruno Bueno brunobueno87@gmail.com → Responsavel pelo DockerFile;
- RUN apt-get update && apt-get install apache2 -y && apt-get clean → Comando que eu quero que rode já na criação do container;
- EXPOSE 80 → Em qual porta o container vai estar excutando.
Logo em seguida, nós "buildamos" esse dockerfile. Vamos entender o comando;
# docker build -t pri_image:1. .0
- docker build → "Buildar" arquivos dockerfile
- -t → Tagear a imagem especificando o nome pri_image: e depois a versão dessa imagem 1.0
- . → Esse ponto especifica o diretório corrente, o local onde estamos que contém o dockerfile. Não é necessário especificar o arquivo, apenas o diretório onde o arquivo se encontra.
Tudo certo até aqui? Espero que sim.
DockerFile é uma maneira bem simples de subir imagens personalizadas já na sua criação, sem contar que como é apenas um arquivo de texto, você pode enviar para o seu time via email sem dificuldade, de forma que todos vão saber exatamente o que esta rolando nesse container.
No caso de ter algum paranoico que desconfia de tudo e fica com o pé atrás para baixar aquela imagem que você disponibilizou no seu dockerhub, ou caso você é o paranoico em questão, priorize imagens em que o mantenedor disponibiliza o dockerfile, e assim você vai saber todo o processo utilizado para a criação de determinada imagem. Seguindo o jogo, vamos voltar ao dockerhub.
Agora, imagine o que você queira disponibilizar essa imagem que você está trabalhando, que já está editada tudo certinho, tudo configurado e gostaria de ter acesso a essa imagem de qualquer lugar, para isso utilizaremos o dockerhub.
Espero que você já tenha criado a sua conta conforme solicitado anteriormente, pois será necessário para seguir em frente. Agora, no seu terminal do dockerhost, rode o comando
docker login:
# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username (sognux):
Password:
Login Succeeded
Obviamente, efetue login e senha conforme a conta criado no dockerhub.
Eu sei que parece muito simples e a resposta é... simples mesmo. Simplicidade é uma coisa muito comum no docker. Acredite se apareceu Login Succeeded, você já está logado na sua conta criada no dockerhub.
Uma observação importante: para subir uma imagem para o DockerHub, é necessário especificar no nome da imagem o seu nome de login no DockerHub. Por exemplo, se o seu nome de login no DockerHub é "sognux" e a sua imagem tem o nome "pri_image:1.0", para subir sua imagem para o dockerhub o nome da sua imagem deve ser:
sognux/pri_image:1.0
Ou seja, seguindo nosso exemplo, para subir a imagem
pri_image:1.0, devemos renomear a imagem de forma que ela atenda à especificação. Para isso, execute o comando;
# docker tag "image-id" sognux/pri_image:1.0
Rode um
docker images e veja como que a nova imagem ficou disponível;
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
pri_image 1.0 0ebd0112da72 2 hours ago 265.1 MB
sognux/pri_image 1.0 0ebd0112da72 2 hours ago 265.1 MB
ubuntu latest bd3d4369aebc 2 days ago 126.6 MB
Agora, já logado no dockerhub, vamos fazer o push da nossa imagem (subir para o dockerhub):
# docker push sognux/pri_image:1.0
The push refers to a repository [docker.io/sognux/pri_image]
48d07708d98c: Pushed
0cad5e07ba33: Mounted from library/ubuntu
48373480614b: Mounted from library/ubuntu
055757a19384: Mounted from library/ubuntu
c6f2b330b60c: Mounted from library/ubuntu
c8a75145fcc4: Mounted from library/ubuntu
1.0: digest: sha256:ee3708ab7fae120b6a0f9f9f5bf38f1e18e34ee24d86bdecb193514a58c40f65 size: 1569
Para verificar se a imagem foi "upada" e realmente consta no DockerHub sem acessar o browser:
# docker search sognux
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
sognux/pri_image 0
sognux/debian 0
Obs.: Caso queira, logue na sua conta do dockerhub e veja a imagem lá disponível.
Para remover uma imagem que subimos para o dockerhub;
# docker rmi -f sognux/pri_image:1.0
Rode o
docker images e veja que a imagem não consta mais no nosso dockerhost. Para baixar a imagem novamente, rode o comando a seguir:
# docker pull sognux/pri_image:1.0
1.0: Pulling from sognux/pri_image
Digest: sha256:ee3708ab7fae120b6a0f9f9f5bf38f1e18e34ee24d86bdecb193514a58c40f65
Status: Downloaded newer image for sognux/pri_image:1.0
Conclusão
Por enquanto, é isso.
A dica é: treine bem esses comandos somando com os comandos da primeira parte e, principalmente, subir lab em VM, para que você consiga se familiarizar, é importante refazer o mesmo cenário em container.
É de extrema importância para começar a migrar para containers.
No próximo artigo, vou abordar mais alguns comandos úteis de administração, envolvendo a parte de rede do Docker, gerenciamento de volumes que é bem interessante, e a parte de limitação de hardware.
Sendo assim, enquanto a próxima parte não sai, pratique bastante.
Até a parte 3 .... =]