Lavavel 9 – docker

Dockerfile

FROM php:8-fpm

# Copy composer.lock and composer.json
# COPY composer.lock composer.json /var/www/

# Set working directory
WORKDIR /var/www

    ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/

RUN chmod +x /usr/local/bin/install-php-extensions && sync && \
    install-php-extensions mbstring zip exif pcntl gd


RUN install-php-extensions pdo pdo_pgsql

#previous code
# Install dependencies
RUN apt-get update && apt-get install -y \
    build-essential \
    libpng-dev \
    libjpeg62-turbo-dev \
    libfreetype6-dev \
    locales \
    zip \
    jpegoptim optipng pngquant gifsicle \
    vim \
    unzip \
    git \
    curl


# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*

# Install extensions
#RUN docker-php-ext-install
#RUN docker-php-ext-configure gd --with-gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ --with-png-dir=/usr/include/

# Install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# Add user for laravel application
RUN groupadd -g 1000 www
RUN useradd -u 1000 -ms /bin/bash -g www www

#RUN php artisan key:generate

# Copy existing application directory contents
COPY . /var/www

# Copy existing application directory permissions
COPY --chown=www:www . /var/www

# Change current user to www
USER www

# Expose port 9000 and start php-fpm server
EXPOSE 9000
CMD ["php-fpm"]

docker-compose.yml

version: '3'
services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    image: digitalocean.com/php
    container_name: app
    tty: true
    environment:
      SERVICE_NAME: app
      SERVICE_TAGS: dev
    working_dir: /var/www
    volumes:
      - './laravel-app:/var/www'
      - './php/local.ini:/usr/local/etc/php/conf.d/local.ini'
    networks:
      - app-network
  webserver:
    image: 'nginx:alpine'
    container_name: webserver
    tty: true
    ports:
      - '80:80'
      - '443:443'
    volumes:
      - './laravel-app:/var/www'
      - './nginx/conf.d/:/etc/nginx/conf.d/'
    networks:
      - app-network
  db:
    image: 'postgres:latest'
    container_name: db
    ports:
      - '5432:5432'
    tty: true
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: 123456
    volumes:
      - './sql:/sql'
      - 'postgres-data:/var/lib/postgresql/data'
    networks:
      - app-network
  pgadmin4:
    image: fenglc/pgadmin4
    ports:
      - '5050:5050'
    networks:
      - app-network
volumes:
  postgres-data:
    driver: local
networks:
  app-network:
    driver: bridge

Pgadmin4 – error al crear scripts

Error mostrado

Link a la solución

https://superuser.com/questions/1520739/pgadmin-v4-on-windows-10-can-not-create-select-update-scripts-for-table-erro

Aplicar en Linux Manjaro

vim /usr/lib/pgadmin4/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py

En la linea 1310 sustituir attname por name

Reiniciar el pgadmin4

Aplicar en docker

Sustituir en la VM de pgadmin el archivo __init__.py con uno que previamente ha sido modificado

pgadmin4:
      image: dpage/pgadmin4
      ports:
          - "81:80"
      networks:
          - overlay
      environment:
            PGADMIN_DEFAULT_EMAIL: fminio@imbabura.gob.ec
            PGADMIN_DEFAULT_PASSWORD: 123456
      volumes:
            - ./pgadmin4/__init__.py:/pgadmin4/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py

Docker – publicar .war en tomcat

Dockerfile

FROM tomcat:latest
COPY tomcat-users.xml /usr/local/tomcat/conf/
COPY context.xml /usr/local/tomcat/webapps/manager/META-INF/
COPY playground2.war /usr/local/tomcat/webapps/
COPY travelocity.com.war /usr/local/tomcat/webapps/

tomcat-users.xml

<?xml version='1.0' encoding='utf-8'?>
<tomcat-users >
  <role rolename="tomcat"/>
  <role rolename="role1"/>
  <role rolename="manager"/>
  <role rolename="manager-script"/>
  <role rolename="manager-gui"/>
  <role rolename="admin-gui"/>
  <user username="admin" password="tomcat" roles="tomcat,role1,manager-gui,manager-script,admin-gui,manager"/>
</tomcat-users>

context.xml

<?xml version="1.0" encoding="UTF-8"?>
<Context antiResourceLocking="false" privileged="true" >
  <!--
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
  -->
</Context>

Ejecutar

docker build -t travelocity .

docker run -it --rm -p 8080:8080 travelocity

 

Docker – apache php7 y postgresql

Mediante dos contenedores levantar un servidor apache configurado con Php7 y un contenedor para postgresql con persistencia mediante un volumen de datos:

Preparar la imagen con apache y php7

Estructura del directorio

Crear el archivo Dockerfile

FROM webdevops/php-apache:alpine
RUN apk update && apk add build-base

RUN apk add php7-pdo_pgsql

A partir de una imagen de  «webdevops/php-apache:alpine», procedemos  a actualizar los paquetes (2) y añadir compatibilidad con php7 (3)

Crear la imagen

docker build -t apache7php .

Crear docker-compose.yml

version: '3'
services:
  db:
      image: postgres:latest
      ports:
          - "5432:5432"
      networks:
          - overlay
      environment:
          POSTGRES_USER: postgres
          POSTGRES_PASSWORD: 123456
      volumes:
          - ./sql:/sql
          - postgres-data:/var/lib/postgresql/data

  web:
      image: apache7php:latest
      ports:
          - "80:80"
      volumes:
          - ../intranet:/app
          - ./php/02_pdo_pgsql.ini:/etc/php7/conf.d/02_pdo_pgsql.ini
          - ./http/vhost.conf:/opt/docker/etc/httpd/vhost.conf
      links:
        - db
      networks:
          - overlay

volumes:
  postgres-data:

networks:
  overlay:

(1) versión de composer

(2) Area de servicios

(3) Etiqueta para contenedor de bdd

(4) Imagen de referencia

(5) puertos

(7) Es necesario establecer una red (característica de la versión 3)

(8) Variable de ambiente

(12) Volumenes que comparte

(13) Carpeta «sql» para compartir respaldos de las bdd

(14) volumen para persistencia de las bdd

(16) Etiqueta para contenedor de servidor web

(17) Referencia a imagen recién creada

(18) Puertos

(20) Volumenes

(21) Carpeta que sera publicada en el sevidor

(22) Archivo de configuración que habilita pdo_pgsql

(23) Archivo de configuración para servidores virtuales

(24) Referencia a contenedor de bdd

(26) Referencia a red

(29) Area de volumenes

(30) Volumen para persistencia de bases de datos

(32) Area para redes

Archivos de configuración

02_pdo_pgsql.ini

extension=pdo_pgsql.so

vhost.conf

#######################################
# Vhost
#######################################

<VirtualHost *:80>
  ServerName docker.vm
  ServerAlias *.vm
  DocumentRoot "/app/public"

  UseCanonicalName Off

  <IfVersion < 2.4>
    Include /opt/docker/etc/httpd/vhost.common.d/*.conf
  </IfVersion>
  <IfVersion >= 2.4>
    IncludeOptional /opt/docker/etc/httpd/vhost.common.d/*.conf
  </IfVersion>

</VirtualHost>

<VirtualHost *:443>
  ServerName docker.vm
  ServerAlias *.vm
  DocumentRoot "/app"

  UseCanonicalName Off

  <IfVersion < 2.4>
    Include /opt/docker/etc/httpd/vhost.common.d/*.conf
  </IfVersion>
  <IfVersion >= 2.4>
    IncludeOptional /opt/docker/etc/httpd/vhost.common.d/*.conf
  </IfVersion>

  Include /opt/docker/etc/httpd/vhost.ssl.conf
</VirtualHost>

 Ejecutar

$ docker-compose up

docker volumes

Los Volúmenes (volumes ) son utilizados con la finalidad de lograr persistencia de los datos utilizados por los contenedores y que no se eliminen junto con el contenedor.

Comandos útiles

Comando Descripción
$ docker volume create my-vol  Crea un volumen de nombre my-vol
$ docker volume ls Lista lo volumenes
$ docker volume inspect my-vol Información detallada del volumen
$ docker rm contenedor Eliminar el contenedor, previo a eliminar el volumen
$ docker volume rm my-vol Eliminar un volumen

 

 

Fuentes

https://docs.docker.com/engine/admin/volumes/volumes/#start-a-container-with-a-volume

https://www.josedomingo.org/pledin/2016/05/gestion-del-almacenamiento-en-docker/

docker alfresco

https://github.com/gui81/docker-alfresco

Descargar imagen de alfresco

docker pull gui81/alfresco:latest

Ejecutar

docker run --name='alfresco' -it --rm -p 8000:8000 gui81/alfresco

 

Docker – compose

Docker compose es una herramienta de administración  para por ejemplo aplicaciones compuestas por varios contenedores relacionados entre si, mediante un archivo descriptor de contenedores.

Estructura de la aplicación

Descriptor de contenedores: docker-compose.yml

 

nginx:
        image: nginx
        ports:
                - "80:80"
        volumes:
                - ./public:/usr/share/nginx/html

                - ./nginx/default:/etc/nginx/sites-available/default
                - ./nginx/default:/etc/nginx/sites-enable/default

                - ./logs/nginx-error.log:/var/log/nginx/error.log
                - ./logs/nginx-access.log:/var/log/nginx/access.log

 

Image: Determina la imagen que utilizara el contenedor

volumes: como cargar los directorios/archivos en el contenedor

Archivos log

Archivos vacios, donde se almacenaran los log al ejecutarse el contenedor

default

Configuración básica de nginx

server {
	listen	80;
	
	root /usr/share/nginx/html
	index index.html;
}

 

index.html

Archivo que se cargara como parte del directorio «public»

<html>
	<body>
		<h3> Hola docker </h3>
	</body>
</html>

Ejecutar la aplicación

docker-compose up

para terminar utilizamos Ctr+c

Imagenes en ejecución

docker-compose ps

Ejecutar sh en el contenedor

docker-compose exec nginx sh

Docker – introducción

Instalar

sudo pacman -S docker

Unirse al grupo de docker

sudo usermod -a -G docker fernando

newgrp docker   # refrescar grupo sin reiniciar

 Comando Descripción
docker search nginx Buscar contenedor
docker pull nginx Descargar imagen
 docker images Listar imagenes
docker ps Lista contenedores
docker star id/nombre Arrancar contenedor
docker stop id/nombre Parar contenedor
docker rmi nombreImagen Borrar imagen
docker rm (docker ps  -aq) Eliminar contenedores
docker rm nombreContenedor Borrar contenedor
docker save -o nginx.tar nginx:latest Exportar una imagen
docker load < nginx.tar Cargar imagen desde archivo

Crear una imagen a partir de Dockerfile

Crear los archivos

Dockerfile

FROM nginx
COPY index.html /usr/share/nginx/html

index.html

<html>
<body>
<h3> Hola docker </h3>
</body>
</html>

Ejecutar

docker build -t nginx .

docker run -p 9000:80 nginx

Acceder a

$docker exec -i -t fbb525c0326b /bin/bash

http://localhost:9000