Personalizando imagens no Docker Hub
Neste artigo vou abordar como efetuar a criação de uma imagem personalizada no Docker. De forma bem resumida, o objetivo aqui é obtermos uma imagem existente, personaliza-la de acordo com a necessidade e depois envia-la para um repositório privado no Docker Hub.
Então vamos lá, o primeiro passo é usar uma máquina que esteja com o Docker instalado e operacional. Com isso, podemos iniciar a preparação do arquivo Dockerfile. O meu arquivo está bem simples, pois preciso apenas de uma imagem leve que contenha o Apache e por isso escolhi o Alpine Linux. Então a primeira linha está obtendo a imagem do Docker Hub e a segunda está copiando o conteúdo da pasta thumbs do meu servidor local para dentro do container.
FROM httpd:alpine3.19 COPY ./thumbs/ /usr/local/apache2/htdocs/
Agora basta executar o build com o nome da imagem que voce quer criar. É necessário executar este comando no mesmo diretório do Dockerfile que criamos anteriormente.
docker build -t ricardoconzatti/homer-web:1.0 .
Valide que a imagem foi criada e está sendo exibida corretamente, use o comando docker images. Além disso, é interessante criar um container com a nova imagem e garantir que tudo está de acordo.
docker run --name web -p 80:80 -d ricardoconzatti/homer-web:1.0
Se tudo estiver certo, então podemos enviar a nova imagem para o Docker Hub. Para isso, é necessário possuir um repositório lá, tanto faz se é privado ou público. E antes de usarmos o push, garanta que já fez login no Docker Hub utilizando o comando docker login.
docker push ricardoconzatti/homer-web:1.0
Se nenhum erro foi exibido, então a sua imagem personalizada foi enviada para o seu repositório no Docker Hub e já está disponivel para ser utilizada.
Pronto, agora toda vez que você quiser usar o container que você personalizou, basta chamar a imagem seguindo este padrão: usuário/repositório:versão. No meu caso, ficou assim docker pull ricardoconzatti/homer-web:1.0.
O artigo poderia terminar por aqui, mas já que estou brincando com isso, vou mostrar um outro exemplo de Dockerfile, um pouco mais complexo. Este utiliza uma imagem do Ubuntu e além do Apache, possui também o PHP e MySQL
FROM ubuntu:latest RUN apt-get update && \ DEBIAN_FRONTEND="noninteractive" apt-get install -y apache2 php mysql-server php-mysql && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* RUN rm /var/www/html/index.html COPY ./thumbs/ /var/www/html/ RUN service mysql start && mysql < /var/www/html/setup.sql RUN rm /var/www/html/setup.sql EXPOSE 80 CMD service mysql start && /usr/sbin/apache2ctl -D FOREGROUND
Lembrando que toda a configuração que a minha aplicação precisa para funcionar corretamente deve ser realizada no Dockerfile. Neste caso, tenho algumas configurações especificas no banco de dados. Criei um arquivo chamado setup.sql para realizar a criação do banco de dados, tabela e usuário.
CREATE DATABASE IF NOT EXISTS homer_db; USE homer_db; CREATE TABLE IF NOT EXISTS thumbs ( code INT AUTO_INCREMENT PRIMARY KEY, status VARCHAR(50), date TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE USER 'homer'@'localhost' IDENTIFIED BY 'homerJayS123'; GRANT ALL PRIVILEGES ON homer_db.thumbs TO 'homer'@'localhost'; FLUSH PRIVILEGES;
Agora basta executar o build, depois criar um container com a nova imagem para garantir que tudo está OK e por fim apenas enviar para o meu repositório no Docker Hub. Estou usando a tag 2.0 para diferenciar da anterior.
docker build -t ricardoconzatti/homer-web:2.0 . docker run --name web -p 80:80 -d ricardoconzatti/homer-web:2.0 docker push ricardoconzatti/homer-web:2.0
É isso aí, até a próxima!