Docker

De Estudos-RagazziD
Ir para: navegação, pesquisa

Docker é um sistema muito legal que roda linux em containers (controlados pelo kernel), basicamente uma vm que só realiza uma única task, se você precisa de mais tarefas você gera um novo container e por ai vai.

Basicamente você escolhe uma imagem e passa instruções de como subir essa imagem.

Instalação

Ubuntu

sudo apt-get -y install apt-transport-https  ca-certificates curl
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu
 $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install docker-ce -y
#optional
sudo usermod -a -G docker $USER

execução

Vai para algum diretório e cria um arquivo chamado Dockerfile (é importante ser assim)

ai você escreve

FROM php:7.1.2-cli
RUN apt-get update -qq && apt-get install -y build-essential
RUN mkdir /www && echo '<?php phpinfo()\
\
?>\
' > /www/index.php
WORKDIR /www
EXPOSE 8080
CMD php -S 0.0.0.0:8080

e roda

docker build -t nome .
docker run -d -p 8080:8080 nome

Explicação

FROM

FROM deve ser praticamente a primeira coisa a se escrever, este determina qual imagem vai ser usada. É possível reutilizar quantas imagens se queira, uma "FROM" da outra.

Formas de usar:

FROM <nomeimagem>
FROM <nomeimagem>:<tag>
FROM <image>@<digest>

RUN

RUN pode aparecer de duas formas, mas basicamente ele executa um comando shell, por padrão:

/bin/sh -c

Para rodar comandos basta digitar

RUN echo "esse é meu primeiro código"

ou

RUN ["echo", "esse é meu primeiro código"]

ou

RUN /bin/bash -c 'source $HOME/.bashrc; \
echo $HOME'

Você pode ter quantos RUN você quiser dentro do seu docker file

CMD

De maneira análoga ao RUN, pode-se executar o CMD de diversas maneiras: Para rodar comandos basta digitar

CMD echo "esse é meu primeiro código"

ou

CMD ["echo", "esse é meu primeiro código"]

ou

CMD /bin/bash -c 'source $HOME/.bashrc; \
echo $HOME'

No entanto só se pode ter uma entrada válida de CMD, se diversas existirem apenas a última sera executada.

Note que o CMD será o comando que o seu container irá gerar ao terminar todas as funções, ou seja, esse deve ser o comando que irá subir sua single thread application.

EXPOSE

Informa ao container que ouça em uma determina rede/porta a nível de execução, isto por sí só não garante que o será acessível fora da rede docker, apenas garante que a porta do container seja exposta. Para habilitar o acesso remoto é necessário digitar a flag -p em linha de comando.

EXPOSE <port> [<port>...]

Linha de comando:

docker run -p localPort:conatinerPort imageName

ADD / COPY

Fazem a mesma coisa, porém COPY é preferida por ser mais transparente que o ADD.

ADD é mais usada quando se quer fazer descompressão do arquivo ao invés de simplesmente copiar/mover

Exemplos:

COPY requirements.txt /tmp/
RUN pip install --requirement /tmp/requirements.txt
COPY . /tmp/
ADD http://example.com/big.tar.xz /usr/src/things/
RUN tar -xJf /usr/src/things/big.tar.xz -C /usr/src/things
RUN make -C /usr/src/things all

Se não quiser a possiblidade de auto extrair o arquivo, sempre use COPY

WORKDIR

Diretório onde será executado o trabalho, basicamente o CD que o docker irá dar antes do CMD rodar.

LABEL

Label adiciona uma metadata a imagem, basicamente é um chave-valor (k->v), podendo ser escrito de diversas meniras

LABEL "com.example.vendor"="ACME Incorporated"
LABEL com.example.label-with-value="foo"
LABEL version="1.0"
LABEL description="This text illustrates \
that label-values can span multiple lines."

Uma imagem pode ter várias "LABEL", para verificar os LABELS é necessário usar o commando docker inspect

"Labels": {
    "com.example.vendor": "ACME Incorporated"
    "com.example.label-with-value": "foo",
    "version": "1.0",
    "description": "This text illustrates that label-values can span multiple lines.",
    "multi.label1": "value1",
    "multi.label2": "value2",
    "other": "value3"
},

VOLUME

Passa instruções para expor qualquer tipo de área de armazenamento (banco de dados, arquivos, pastas) criadas pelo container.

FROM ubuntu
RUN mkdir /myvol
RUN echo "hello world" > /myvol/greeting
VOLUME /myvol

Quando deleta-se o container o volume ainda será mantido

Mapeamento Local

Durante a inicialização do container é possível fazer um mapeamento para uma pasta local do servidor ao container:

docker run -v /local/path:/container/path imageName

STOPSIGNAL

ONBUILD

ENV

Adiciona entradas a variáveis de ambiente, normalmente usa-se env para passar informações a imagem, como senha, nome de usuário, banco de dados, etc:

ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && …
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH

HEALTHCHECK

SHELL

Shell usado para mudar o shell do CMD / RUN, você pode definir um shell e depois usar o RUN ou CMD porém o shell anterior sempre será sobrescrito pelo atual

FROM microsoft/nanoserver
SHELL ["powershell","-command"]
RUN New-Item -ItemType Directory C:\Example
ADD Execute-MyCmdlet.ps1 c:\example\
RUN c:\example\Execute-MyCmdlet -sample 'hello world'

DockerCompose