PARTE 1 Docker - Containers em Linux [Artigo]
Uma coisa extremamente importante é como acessar o 
container.
Digo isso do ponto de vista da aplicação. Até o momento, instalamos o 
Docker aprendemos a subir container parar container,  entre outros comandos. Porém, um comando muito importante ficou pendente, como por exemplo, instalamos um Apache dentro de um container. Como acessar o Apache desse container?
Para isso utilizaremos um parâmetro muito útil no gerenciamento de containers, que é o parâmetro "-p" (publish). Esse parâmetro faz com que você consiga "bindar" a porta do seu DockerHost com a porta do seu container. Caso não tenha ficado muito claro, vamos à prática para facilitar o entendimento.
Primeiro, rode um container;
# docker run -ti debian
Após o comando, muito provavelmente você já vai estar dentro do container no seu terminal e vai ter algo parecido com:
root@30b05a28c14e:/#
Agora, dentro do container, instale o Apache;
root@30b05a28c14e:/#
 apt-get install apache2
Inicie o serviço;
root@30b05a28c14e:/#
 /etc/init.d/apache2 start
Até o momento, caso você tenha efetuado o teste de colocar o IP do container no navegador do seu DockerHost, você viu que de fato o Apache está funcionando no seu container. Porém, caso você tenha tentado acessar o Apache que está rodando no seu container através de outro host, muito provável que nem pingar no container você consiga.
Isso acontece, pois ainda não definimos em qual porta o container deve escutar. Rode o comando 
docker ps e veja o status da sua porta:
CONTAINER ID    IMAGE   COMMAND      CREATED            STATUS    PORTS        NAMES
30b05a28c14e    debian  "/bin/bash"  About an hour ago  Up        42 seconds   insane_chandrasekhar
Veja que não existe configuração alguma para as portas do container.
Porém, a forma (por enquanto) de acessar um container é através do IP do DockerHost, sendo assim, temos que fazer um redirecionamento de portas, de forma que se você acessar o IP do DockerHost em uma porta especifica, será redirecionado automaticamente ao container. Por sorte, como tudo no Docker, isso é feito de forma simples, não vamos precisar de várias regras de IPtables para isso; toda essa parte "burocrática", o Docker fica encarregado de fazer.
Antes disso, vamos salvar essa imagem de container, pois já instalamos o Apache nela e para facilitar o processo sem ter que subir outro container e ter que reinstalar o Apache, vamos salvar essa imagem para continuar de onde paramos.
Para isso, vamos utilizar o 
commit, que é um comando do Docker que serve para salvar uma imagem:
# docker commit -m "lab de container" 30b05a28c14e apache_lab:1.0
Após rodar esse comando, rode o comando:
# docker images
REPOSITORY         TAG      IMAGE ID       CREATED            SIZE
apache_lab         1.0      b994948dbab5   About an hour ago  193.9 MB
debian             latest   1b01529cc499   4 weeks ago        125.1 MB
graylog2/allinone  latest   37344ed703dc   5 months ago       870.3 MB
Veja que foi gerada uma imagem baseada no container que criamos com a imagem do Debian, porém, essa imagem já vem com o Apache instalado, pois já fizemos isso.
A pergunta é: qual a vantagem em fazer isso? A vantagem é que ao iniciar um outro container baseado nessa imagem "comitada", não vamos ter que reinstalar o Apache, o que torna o processo mais rápido,. Economizar tempo hoje em dia, a meu ver, é muito bom.
Agora, pense que você precisa sempre estar testando um cenário especifico, toda vez é a mesma coisa, com containers você pode continuar da onde parou, o que dependendo do cenário, o ganho de tempo é gigantesco. Vamos iniciar um container baseado nessa imagem que acabamos de efetuar um "commit":
# docker run -ti -p 8081:80 apache_lab:1.0
Obviamente, o serviço do apache desse container vai estar parado, então, inicie o serviço:
root@7155da1ddf08:/#
 /etc/init.d/apache2 start
Bom, agora saia do container sem matar ele e após, o seu terminal estar no DockerHost, rode o comando abaixo:
# docker ps
CONTAINER ID     IMAGE             COMMAND      CREATED      STATUS         PORTS                 NAMES
7155da1ddf08     apache_lab:1.0    "/bin/bash"  2 days ago   Up 5 minutes   0.0.0.0:8081->80/tcp  thirsty_noether
Agora, veja a diferença entre essa saída do 
docker ps baseado com a última vez que executamos o comando. Observe a coluna "PORTS". Agora sim, nosso container está acessível. Ele possui uma porta onde ele fica escutando o tempo todo.
Para validar o teste, jogue no seu navegador o 
ip-do-seu-DockerHost:8081 e veja que vai abrir a tela inicial do Apache. Para que possa ficar mais fácil de entender, detalhando o último comando que executamos para subir esse container:
-  doker run -ti → Inicia um container com um terminal interativo.
-  -p 8081:80 → -p "publisher" faz com que você consigar "bindar" a porta do seu DockerHost com a porta do Container, lembrando que a lógica é 8081: Porta do DockerHost, 80 porta do container. Como o exemplo anterior mostra, ao bater na porta do DockerHost na porta 8081 você será redirecionado para a porta 80 do container em questão.
-  apache_lab:1.0 → Nome da imagem que efetuamos um "commit".
Bom, agora com esse exemplo, não preciso ficar batendo muito nessa tecla, suba seus labs com os serviços, ou aplicação em container, e vá migrando seus labs aos poucos para o Docker. Conforme você vai utilizando, mais prática vai pegando e cada vez mais o seu dia-a-dia vai se tornando mais dinâmico no que se refere a labs e compartilhar cenário com outros colaboradores, enfim...
Uma dica que eu recomendo, é fazer o seu lab em VM? Ok, agora tente refazer ele em container.
Após finalizado, reinicie o procedimento do zero e veja na prática onde está a vantagem.
Sendo assim, podemos começar a brincar mais com o gerenciamento de imagens, no Docker. Para isso, devemos iniciar com uma pergunta...