Category Archives: Docker

Docker no Ubuntu

Introdução

O objetivo desse post é aprender a utilização do Docker no Ubuntu.

Instalação

Verificar versão do Kernel

Esse comando serve para validar a versão do Kernel. Esta versão deverá ser superior a 3.8.

# uname -r

Instalando o Docker

# curl -sSL https://get.docker.com | sh

Subindo o Docker

# /etc/init.d/docker start

Verificando se o Docker está no ar

# docker ps

Ou

# ps -ef | grep docker

Rodando uma imagem

Verificando as imagens

# docker images

Rodando e instalando o Ubuntu

Rodando o comando abaixo, na primeira vez, será baixado o Ubuntu, na versão informada.

# docker run -i -t ubuntu:17.10 /bin/bash

Ao final do processo, o Container será iniciado, sendo possível verificar que mudou o prompt do console.

Exemplo: root@6d9436afdb02:/#

Matando o Container

# CTRL + d

ATENÇÃO: Esse comando fará com que o Container encerre. Não será mais possível executá-lo. Quaiques modificações e/ou instalações serão PERDIDAS!

Sair do Container sem encerrar.

root@6d9436afdb02:/# CTRL + p + q (control + p + q)

# docker ps (verifique que o processo continua rodando)

Voltando para o Container

# docker ps

# docker attach [[CONTAINER_ID]]

Exemplo:

root@CCE:/home/fernando# docker attach 6d9436afdb02
root@6d9436afdb02:/#

Instalando ferramentas / aplicativos

NGinx

  • Crie o Container – # docker run -i -t -p 8080:80 ubuntu:17.10 /bin/bash
    • Redirecionando a porta 8080 fora do Container, na porta 80 (dentro do Container)
  • Instale o NGinx – # apt-get install nginx
    • Caso falhe – # apt-get update
  • /etc/init.d/nginx start
  • Abra um navegador e digite: http://localhost:8080

Verificando instalações efetuadas no Container

Fora do Container, digite

# docker diff [[CONTAINER_ID]]

Salvando o Container modificado

Podemos gerar uma imagem, fazendo o commit.

# docker commit [[CONTAINER_ID]] [[NOME_DA_IMAGEM:[[VERSAO]]

Exemplo:

# docker commit bae5725fbdc2 nginx-ubuntu:1.0

# docker images

Subindo novo Container com base na imagem

# docker run -i -t -p 6660:80 nginx-ubuntu:1.0 /bin/bash

Agora, temos 2 containers respondendo na porta 8080 e 6660.

Parando um Container fora dele

# docker stop [[CONTAINER_ID]]

Rodando comandos fora do container

Preparação

# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE
badtux/nginx-ubuntu 1.0 004a02a614ec 22 hours ago 192MB
ubuntu 17.10 26d147d2310f 25 hours ago 96.6MB

# docker run -ti -p 8080:80 badtux/nginx-ubuntu:1.0 /bin/bash

# /etc/init.d/nginx start

# CTRL + p + q

# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c0907ccd5120 badtux/nginx-ubuntu:1.0 “/bin/bash” 49 seconds ago Up 46 seconds 0.0.0.0:8080->80/tcp friendly_heisenb

# docker exec c0907ccd5120 ps -ef

UID PID PPID C STIME TTY TIME CMD
root 1 0 0 22:13 ? 00:00:00 /bin/bash
root 31 1 0 22:13 ? 00:00:00 nginx: master process /usr/sbin/nginx
www-data 32 31 0 22:13 ? 00:00:00 nginx: worker process
www-data 33 31 0 22:13 ? 00:00:00 nginx: worker process
www-data 34 31 0 22:13 ? 00:00:00 nginx: worker process
www-data 35 31 0 22:13 ? 00:00:00 nginx: worker process
root 38 0 0 22:14 ? 00:00:00 ps -ef

# docker exec c0907ccd5120 /etc/init.d/nginx stop

Verificando as informações do Container

# docker inspect c0907ccd5120

Mostra uma série de informações como o IP do Container, Porta do Container, quando foi criado, etc.

#docker stats

Mostra um resumo do Container em relação a consumo de CPU, Memória e Rede.

# docker stop c0907ccd5120

# docker ps

# docker start c0907ccd5120

# docker rm c0907ccd5120 (ATENÇÃO: remove o Container e não será possível utilizá-lo mais)

Removendo a Imagem

# docker images

# docker rmi [[IMAGE_ID]]

# docker rmi -f [[IMAGE_ID]]

Comunicação entre containers

# docker run -it –name web02 –link friendly_heisenb:web01 badtux/nginx-ubuntu:1.0

# ping web01

Criando Dockerfile

Aguarde!

Docker, confd e DynamoDB

Dockerfile

FROM nginx:latest
MAINTAINER Genki Sugawara <sgwr_dts@yahoo.co.jp>

ENV DUMB_INIT_VERSION 1.1.3
ENV CONFD_VERSION 0.11.0

RUN apt-get update
RUN apt-get install -y –force-yes curl

RUN curl -sOL https://github.com/Yelp/dumb-init/releases/download/v${DUMB_INIT_VERSION}/dumb-init_${DUMB_INIT_VERSION}_amd64.deb
RUN dpkg -i dumb-init_*.deb
RUN rm dumb-init_*.deb

RUN curl -sOL https://github.com/kelseyhightower/confd/releases/download/v${CONFD_VERSION}/confd-${CONFD_VERSION}-linux-amd64
RUN chmod +x confd-*
RUN mv confd-* /bin/confd
RUN mkdir -p /etc/confd/{conf.d,templates}
ADD nginx_default.conf.toml /etc/confd/conf.d/
ADD nginx_default.conf.tmpl /etc/confd/templates/

ADD init.sh /
RUN chmod +x /init.sh

ENV CONFD_ARGS -backend dynamodb -table confd

ENV AWS_REGION ap-northeast-1
ENV AWS_DEFAULT_REGION ap-northeast-1
ENV AWS_ACCESS_KEY_ID …
ENV AWS_SECRET_ACCESS_KEY …

CMD /init.sh

init.sh

#!/usr/bin/dumb-init /bin/sh
confd $CONFD_ARGS &
nginx -g ‘daemon off;’

nginx_default.conf.toml

[template]
src = “nginx_default.conf.tmpl”
dest = “/etc/nginx/conf.d/default.conf”
keys = [
“/nginx/statuscode”
]
check_cmd = “service nginx configtest”
reload_cmd = “service nginx reload”

nginx_default.conf.tmpl

server {
listen       80 default_server;
server_name  _;

location / {
return {{getv “/nginx/statuscode”}};
}
}

DynamoDB

aws dynamodb create-table \
–table-name confd \
–attribute-definitions AttributeName=key,AttributeType=S \
–key-schema AttributeName=key,KeyType=HASH \
–provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1

$ ddbcli
ap-northeast-1> show create table confd;
CREATE TABLE `confd` (
`key` STRING HASH
) read=1 write=1

ap-northeast-1> select all * from confd;
[
{“key”:”/nginx/statuscode”,”value”:”404″}
]
// 1 row in set (0.05 sec)

$ docker build -t awesome-confd .

$ docker run –rm -p 10080:80 –name awesome-confd -it awesome-confd
2016-08-28T08:34:26Z 1f4823caba59 confd[8]: INFO Backend set to dynamodb
2016-08-28T08:34:26Z 1f4823caba59 confd[8]: INFO Starting confd
2016-08-28T08:34:26Z 1f4823caba59 confd[8]: INFO Backend nodes set to
2016-08-28T08:34:26Z 1f4823caba59 confd[8]: INFO DynamoDB table set to confd
2016-08-28T08:34:26Z 1f4823caba59 confd[8]: INFO /etc/nginx/conf.d/default.conf has md5sum 4dce452bf8dbb01f278ec0ea9ba6cf40 should be 1e1181119f8355e81d3b0a7de2859d5a
2016-08-28T08:34:26Z 1f4823caba59 confd[8]: INFO Target config /etc/nginx/conf.d/default.conf out of sync
2016-08-28T08:34:26Z 1f4823caba59 confd[8]: INFO Target config /etc/nginx/conf.d/default.conf has been updated

$ curl localhost:10080
<html>
<head><title>404 Not Found</title></head>
<body bgcolor=”white”>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.11.3</center>
</body>
</html>

#!/usr/bin/dumb-init /bin/sh
confd $CONFD_ARGS
nginx -g ‘daemon off;’

ap-northeast-1> update confd set value = ‘401’ where key = ‘/nginx/statuscode’;
// 1 row changed (0.08 sec)

$ docker exec -it awesome-confd confd -backend dynamodb -table confd -onetime
2016-08-28T08:40:44Z 4b3509b1fd93 confd[49]: INFO Backend set to dynamodb
2016-08-28T08:40:44Z 4b3509b1fd93 confd[49]: INFO Starting confd
2016-08-28T08:40:44Z 4b3509b1fd93 confd[49]: INFO Backend nodes set to
2016-08-28T08:40:44Z 4b3509b1fd93 confd[49]: INFO DynamoDB table set to confd
2016-08-28T08:40:44Z 4b3509b1fd93 confd[49]: INFO /etc/nginx/conf.d/default.conf has md5sum 1e1181119f8355e81d3b0a7de2859d5a should be 306f95f0ae59a29344ed21eb0c7886c9
2016-08-28T08:40:44Z 4b3509b1fd93 confd[49]: INFO Target config /etc/nginx/conf.d/default.conf out of sync
2016-08-28T08:40:44Z 4b3509b1fd93 confd[49]: INFO Target config /etc/nginx/conf.d/default.conf has been updated

$ curl localhost:10080
<html>
<head><title>401 Authorization Required</title></head>
<body bgcolor=”white”>
<center><h1>401 Authorization Required</h1></center>
<hr><center>nginx/1.11.3</center>
</body>
</html>