segunda-feira, 23 de novembro de 2015

Docker na prática - Mysql

Não vou perder tempo explicando o que é o docker ou pra que server o docker vamos para parte prática.

Docker - https://www.docker.com/

Instalação no Linux: http://docs.docker.com/linux/step_one/

Depois do docker instalado vamos a um exemplo prático.

Resolvi substituir alguns serviços da minha minha máquina e usar o docker e o primeiro serviço foi o MySql:

Instalando a imagem do MySql:

sudo docker pull mysql     - baixa o docker (imagem) com mysql


O parâmetro  "pull" irá baixar a imagem "mysql" dos repositório do docker, https://hub.docker.com/_/mysql/

sudo docker images       - Listas as imagens baixadas/criadas na máquina

O resultado fica assim:

ubuntu@ubuntu:~$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
mysql                     latest              c29b1276a98a        12 days ago         359.8 MB
ubuntu@ubuntu:~$




Agora vamos cria o container para usar o mysql, em resumo o container nada mais é do que uma instancia real da imagem, o container usa a imagem instalada e aplica as configurações para que o serviço ou servidor funcione. Podemos ter vários container de uma unica imagem e cada container tem sua funcionalidade.

Como exemplo irei criar 2 servidores mysql, serão 2 container:

1 - Servidor mysql com ip próprio:

sudo docker run --name mymysql -e MYSQL_ROOT_PASSWORD=root1 -d mysql


Parâmetros:

run       - executa a imagem criando um container
--name  - da uma nome para o container
mymysql - nome do container fica a critério da pessoal
-e          - setando variaveis de ambiente no exemplo acima estamos setando a variavel MYSQL_ROOT_PASSWORD
 -d         - deixa o container rodando em background
 mysql   - neste exemplo é nome da imagem no repositório que baixar anteriormente

Para ver se o container esta rodando:

sudo docker ps  


O resultado fica assim:

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
aed91beee6fe        mysql               "/entrypoint.sh mysql"   3 days ago          Up 5 seconds        3306/tcp                 mymysql




Agora temos um servidor de MySql rodando no docker vamos pegar o ip para podemos usar na nossa aplicação:

sudo docker inspect aed91beee6fe


Parâmetros:

inspect            -  returna informações do container e da imagem
aed91beee6fe - Id do container, cada container tem um id próprio

ubuntu@ubuntu-Aspire-E1-571:~$ sudo docker inspect aed
[
{
    "Id": "aed91beee6fe517d6358a39a0ba0b02c2daec2a4f2c393405ccba451b446130b",
    "Created": "2015-11-20T02:26:58.154562367Z",
    "Path": "/entrypoint.sh",
    "Args": [
        "mysqld"
    ],
    "State": {
        "Status": "running",
        "Running": true,
        "Paused": false,
        "Restarting": false,
        "OOMKilled": false,
        "Dead": false,
        "Pid": 13163,
        "ExitCode": 0,
        "Error": "",
        "StartedAt": "2015-11-23T13:07:50.033191231Z",
        "FinishedAt": "2015-11-20T16:28:28.493679426Z"
    },
   

 ...........,
    "Mounts": [
        {
            "Name": "4dcf2234e155ef26d1f22e0279634b7594b6cfa18af4b04f7c6afe3f699e131a",
            "Source": "/var/lib/docker/volumes/4dcf2234e155ef26d1f22e0279634b7594b6cfa18af4b04f7c6afe3f699e131a/_data",
            "Destination": "/var/lib/mysql",
            "Driver": "local",
            "Mode": "",
            "RW": true
        }
    ],
    "Config": {
        "Hostname": "aed91beee6fe",
        "Domainname": "",
        "User": "",
        "AttachStdin": false,
        "AttachStdout": false,
        "AttachStderr": false,
        "ExposedPorts": {
            "3306/tcp": {}
        },
        "Tty": false,
        "OpenStdin": false,
        "StdinOnce": false,
        "Env": [
            "MYSQL_ROOT_PASSWORD=root6Beer",
            "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
            "MYSQL_MAJOR=5.7",
            "MYSQL_VERSION=5.7.9-1debian8"
        ],
        "Cmd": [
            "mysqld"
        ],
        "Image": "mysql",
        "Volumes": {
            "/var/lib/mysql": {}
        },
        "WorkingDir": "",
        "Entrypoint": [
            "/entrypoint.sh"
        ],
        "OnBuild": null,
        "Labels": {},
        "StopSignal": "SIGTERM"
    },
    "NetworkSettings": {
        "Bridge": "",
        "SandboxID": "5e68cbcf0e18acad52ca101565fcc9df5b137a89ca018ac351cf9a14975d9344",
        "HairpinMode": false,
        "LinkLocalIPv6Address": "",
        "LinkLocalIPv6PrefixLen": 0,
        "Ports": {
            "3306/tcp": null
        },
        "SandboxKey": "/var/run/docker/netns/5e68cbcf0e18",
        "SecondaryIPAddresses": null,
        "SecondaryIPv6Addresses": null,
        "EndpointID": "71d73085e4009639f332caf43689e3ba6b3331c8148a1105922b4d797adb0eff",
        "Gateway": "172.17.0.1",
        "GlobalIPv6Address": "",
        "GlobalIPv6PrefixLen": 0,
        "IPAddress": "172.17.0.3",
        "IPPrefixLen": 16,
        "IPv6Gateway": "",
        "MacAddress": "02:42:ac:11:00:03",
        "Networks": {
            "bridge": {
                "EndpointID": "71d73085e4009639f332caf43689e3ba6b3331c8148a1105922b4d797adb0eff",
                "Gateway": "172.17.0.1",
                "IPAddress": "172.17.0.3",
                "IPPrefixLen": 16,
                "IPv6Gateway": "",
                "GlobalIPv6Address": "",
                "GlobalIPv6PrefixLen": 0,
                "MacAddress": "02:42:ac:11:00:03"
            }
        }
    }
}
]
ubuntu@ubuntu:~$



Ficando assim os dados para conexão com o banco e pode ser usando em qualquer aplicação:

hostname: 172.17.0.3  Port: 3306 User: root  Password: root1


Agora vamos a outro exemplo, no exemplo acima criei uma servidor com um ip próprio, mas existe uma opção para usarmos como se fosse localhost vamos ao exemplo:

sudo docker run -p 3306:3306 --name mymysql2 -e MYSQL_ROOT_PASSWORD=root1 -d mysql

Como podemos ver o que difere é o parâmetro 3306:3306 aqui estamos expondo a porta 3306 do container que será acessada também pela porta 3306 do localhost.

Ficando assim para conexão com o banco:

hostname: localhost  Port: 3306 User: root  Password: root1


E temos dois servidores de banco rodando na nossa maquina, um em cada container criado:

 ubuntu@ubuntu:~$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
52d08d09e575        mysql               "/entrypoint.sh mysql"   3 days ago          Up 21 hours         0.0.0.0:3306->3306/tcp   mymysql2
aed91beee6fe        mysql               "/entrypoint.sh mysql"   3 days ago          Up 46 minutes       3306/tcp                 mymysql
ubuntu@ubuntu:~$