Rodando o Docker com o Python, Django e Oracle

Imagem da baleia azul do Docker com várias base de dados Oracle em cima dela.

Criar um container Docker + Python e adicionar a ele o Oracle client pode ser um verdadeiro parto. Nesse artigo, veremos como Containizar uma aplicação Python + Django 2 que usa uma base de dados Oracle.

Resultado de imagem para docker oracle

IMPORTANTE: Nesse artigo assumo que você já tem uma aplicação em Django pronta e já rodando, todos os comandos e arquivos que se seguirão deverão estar dentro da mesma pasta de sua aplicação.

PASSO 1. No seu projeto Python + Django, crie um arquivo chamado Dockerfile (isso mesmo, sem extensão, sem nada). No arquivo, digite o seguinte:

Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
FROM python:3
ENV PYTHONHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
COPY . /code/
RUN pip install -r requirements.txt
ENV ORACLE_HOME=/usr/lib/oracle/12.1/client64
ENV PATH=$PATH:$ORACLE_HOME/bin
ENV LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib
ADD oracle-instantclient12.1-basic-12.1.0.2.0-1.x86_64.rpm /tmp/
ADD oracle-instantclient12.1-sqlplus-12.1.0.2.0-1.x86_64.rpm /tmp/
ADD oracle-instantclient12.1-devel-12.1.0.2.0-1.x86_64.rpm /tmp/
# Setup locale, Oracle instant client and Python
RUN apt-get update \
    && apt-get -y install alien libaio1 \
    && alien -i /tmp/oracle-instantclient12.1-basic-12.1.0.2.0-1.x86_64.rpm \
    && alien -i /tmp/oracle-instantclient12.1-sqlplus-12.1.0.2.0-1.x86_64.rpm \
    && alien -i /tmp/oracle-instantclient12.1-devel-12.1.0.2.0-1.x86_64.rpm \
    && ln -snf /usr/lib/oracle/12.1/client64 /opt/oracle \
    && mkdir -p /opt/oracle/network \
    && ln -snf /etc/oracle /opt/oracle/network/admin \
    && pip install cx_oracle \
    && apt-get clean && rm -rf /var/cache/apt//var/lib/apt/lists//tmp//var/tmp/*
ADD root /

Observação

O arquivo Dockerfile deve estar na mesma pasta do seu projeto Django.

Esse arquivo será o responsável por criar um container no Docker baseado na imagem oficial do Python (FROM python:3). Ele criará o ambiente e instalará as dependências do projeto (as dependências deverão estar num arquivo chamado requirements.txt).

PASSO 2 (SÓ SE VOCÊ AINDA NÃO TEM UM ARQUIVO requirements.txt). Crie um arquivo requirements.txt e coloque nele o seguinte:

requirements.txt
1
2
3
4
Django==2.0.5
djangorestframework==3.8.2
pytz==2018.4
cx-Oracle==6.1

PASSO 3. Após isso, crie um arquivo chamado docker-compose.yml. Esse arquivo será executado, por assim dizer, toda vez que um container for executado, criando assim nosso “ambiente virtual”. Coloque o seguinte nesse arquivo:

docker-compose.yml
1
2
3
4
5
6
7
8
9
10
version: '3'
services:
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"

Como você pode ver, esse é o arquivo responsável por executar um serviço chamado web (poderia ser qualquer outro nome). Esse serviço, ao ser executado, rodará o comando python manage.py runserver 0.0.0.0:8000, o qual será o responsável por podermos executar nossa aplicação na web.

PASSO 4. Baixe do site da oracle e mova os arquivos listados abaixo para a mesma pasta onde encontra-se os arquivos do projeto Django:

  • http://download.oracle.com/otn/linux/instantclient/121020/oracle-instantclient12.1-basic-12.1.0.2.0-1.x86_64.rpm
  • http://download.oracle.com/otn/linux/instantclient/121020/oracle-instantclient12.1-sqlplus-12.1.0.2.0-1.x86_64.rpm
  • http://download.oracle.com/otn/linux/instantclient/121020/oracle-instantclient12.1-devel-12.1.0.2.0-1.x86_64.rpm

VOCÊ PODE ENCONTRAR OS MESMOS ARQUIVOS EM MEU REPOSITÓRIO NO GITHUB: https://github.com/WilliamZimmermann/docker-oracleclient.git

Como você talvez já tenha percebido, esses arquivos são os arquivos rpm referenciados no Dockerfile, PASSO 1.

PASSO 5. Agora é necessário criar uma ligação entre o Oracle Instant Client instalado em sua máquina virtual Docker e a base de dados Oracle que será usada. Crie uma pasta no mesmo diretório do seu projeto Django chamada root/etc/oracle. Dentro dela, coloque os arquivos SQLNET.ora e tsnames.ora (são arquivos que mapeiam as conexões com as bases de dados da sua rede, por exemplo):

Você pode baixar um exemplo no meu diretório no GitHub: https://github.com/WilliamZimmermann/docker-oracleclient/tree/master/root/etc/oracle

Até aí, o diretório do seu projeto deverá parecer com o seguinte:

Esquema de pastas de um diretório Django com Docker e Oracle
Esquema de pastas de um diretório Django com Docker e Oracle

Hora de construir e rodar

PASSO 6. Com tudo salvo, faça o build do container/imagem:

Terminal
docker-compose build

PASSO 7. Depois de vários minutos (o processo de build pode demorar bastante, uma vez que ele baixa a imagem do SO e dependências), é hora de subirmos nossa imagem para que possamos usá-la. Digite o seguinte comando no terminal:

Terminal
docker-compose up -d

PASSO 8. Para ver os serviços rodando e ver em que endereço você pode acessar no navegador, digite:

Terminal
docker-compose ps

Uma lista de serviços como a abaixo será exibida:

Observe que, no meu caso, está rodando um serviço chamado rhconnect_web_1 que roda aquele comando do Django… python manage.py runserver… Bem, esse comando está ativo (State UP) e eu posso acessar minha aplicação através do endereço: 0.0.0.0:8000 (ou localhost:8000).

É isso aí, espero ter ajudado…. Essa é a primeira vez que eu crio um container, etc, no Docker. Sempre usei de outros mas nunca havia criado antes. Por isso, peço perdão se houver alguma nomenclatura errada. Se você tiver alguma sugestão ou correção sobre o que eu disse, por favor, fique a vontade para me auxiliar nos comentários, apreciaria muito.

 

Seus comentários são muito apreciados.

This site uses Akismet to reduce spam. Learn how your comment data is processed.