Séria Aplicações CodeIgniter no Docker

Docker e CodeIgniter: conectando a aplicação ao banco de dados

Chegamos ao segundo tutorial da série sobre Docker e CodeIgniter e caso não tenha visto o primeiro, veja-o, pois ele é importante para que possa executar com sucesso esse segundo tutorial.

Docker e CodeIgniter: como iniciar uma aplicação

A grande maioria das aplicações web utilizam banco de dados, e conectar uma aplicação rodando em um container Docker com um banco de dados, que também roda em um container Docker, não é um trabalho complicado.

A seguir você aprenderá a fazer essa conexão.

Criando o container

No Git do Universidade CodeIgniter já tem um repositório que irá armazenar todos os arquivos da série, separados por diretórios. Faça o download ou clone o repositório e então acesse o diretório tutorial-2, que é onde está localizado o arquivo do Docker Compose que será utilizado nesse tutorial.

O clone do repositório pode ser feito utilizando o comando a seguir:

git clone https://github.com/universidadecodeigniter/serie-docker-codeigniter.git

Feito o download ou clone do repositório, você terá um diretório com um arquivo docker-compose.yml. Acesse esse diretório pelo terminal para poder executar o comando do Docker Compose responsável por executar todo o processo de download da imagem e criação do container.

docker-compose up -d

Até aqui não foi feito nada de diferente daquilo que foi apresentado no tutorial anterior. Porém, o arquivo docker-compose.yml é diferente, pois agora ele cria um segundo container que será o responsável pelo MySQL, e também há um novo diretório, que é o data, onde ficarão armazenadas as informações do banco de dados.

Veja a seguir como fica o arquivo docker-compose.yml utilizado nesse tutorial.

Ele segue uma estrutura muito similar ao do utilizado no tutorial anterior, mas agora contando com a criação do container para o banco de dados, que se inicia a partir da linha 15.

Na linha 10 foi adicionado o link para o container database, para que seja criada uma comunicação entre os containers, permitindo assim que seja feita a conexão da aplicação do container php com o banco de dados do container database.

O arquivo .env também sofreu algumas alterações, conforme pode ser visto a seguir:

APP_NAME=serie-docker-codeigniter-2
MYSQL_PORT=3306
HTTP_PORT=8080
HTTPS_PORT=443
MYSQL_ROOT_PASSWORD=secret
MYSQL_DATABASE=homestead
MYSQL_USER=homestead
MYSQL_PASSWORD=secret

Instalando o CodeIgniter no container

Com o container rodando, agora é hora de instalar o CodeIgniter nele, e para isso será utilizado o Composer.

Você pode fazer a instalação através da sua máquina, como já está acostumado a fazer, ou então pode utilizar um container para executar o processo de instalação e depois encerrar este container.

Antes de instalar o CodeIgniter, remova os arquivos que estão no diretório src, pois a instalação só será executada caso o diretório esteja vazio, e então execute o comando a seguir para instalar o CodeIgniter usando um container de apoio.

docker run -it --rm \
           -v $(pwd)/src:/var/www/src \
           -w /var/www/src \
           jlamim/php7-nginx \
           composer create-project bcit-ci/codeigniter .

Concluída a instalação, reinicie o Docker Compose através do comando a seguir para garantir que o compartilhamento dos arquivos seja feito corretamente.

docker-compose restart

Conectando com o banco de dados

Agora que o CodeIgniter está instalando e funcionando através de um container, você vai conectar com o banco de dados que está rodando em um outro container.

O processo de conexão não difere em nada do que você já está acostumado a fazer em instalações tradicionais de aplicações com CodeIgniter.

Abra o arquivo /src/application/config/database.php e define as configurações de conexão conforme foram definidas no arquivo .env. O único e importante detalhe que deve ser observado é em relação ao host do MySQL.

O Docker cria uma rede própria quando você linka vários containers, então o host do MySQL será o nome do container que foi criado, ou seja,  serie-docker-codeigniter-2-database.

$db['default'] = array(
'dsn' => '',
'hostname' => 'serie-docker-codeigniter-2-database',
'username' => 'homestead',
'password' => 'secret',
'database' => 'homestead',
'dbdriver' => 'mysqli',
'dbprefix' => '',
'pconnect' => FALSE,
'db_debug' => (ENVIRONMENT !== 'production'),
'cache_on' => FALSE,
'cachedir' => '',
'char_set' => 'utf8',
'dbcollat' => 'utf8_general_ci',
'swap_pre' => '',
'e ncrypt' => FALSE,
'compress' => FALSE,
'stricton' => FALSE,
'failover' => array(),
'save_queries' => TRUE
);

Para completar a configuração, abra o arquivo src/application/config/autoload.php e adicione o carregamento automático da biblioteca de banco de dados.

Feito isso, acesse a aplicação através do browser e veja se ela irá carregar da mesma forma como carregou antes de ser feita a conexão com o banco de dados.

Caso você queira utilizar algum SGBD, como por exemplo o Sequel Pro ou ou MySQL Workbench para se conectar e manipular o banco de dados, você deve utilizar as mesmas configurações de usuário, senha e nome do banco de dados que utilizou no arquivo .env. Já o nome do host será diferente, pois como o acesso acontecerá de fora da rede particular do Docker, você deverá utilizar o IP do seu localhost, que geralmente é 127.0.0.1 e informar a porta que foi determinada no arquivo .env.

Você também pode utilizar as variáveis de ambiente definidas no arquivo .env para determinar as configurações de conexão no arquivo /src/application/config/database.php. Clique aqui e veja o tutorial que ensina a utilizar variáveis de ambiente no CodeIgniter.

Conclusão

Agora que você já sabe como instalar uma aplicação CodeIgniter em um container Docker e conectar essa aplicação a um banco de dados que está em outro container, o que acha de fazer alguns testes com suas aplicações e ver como a combinação Docker + CodeIgniter pode melhorar sua produtividade?

Bons estudos!