Diferencia entre revisiones de «Usuario:ManuelRomero/Docker»

De WikiEducator
Saltar a: navegación, buscar
(Página creada con «{{Usuario:ManuelRomero/ProgramacionWeb/Docker/nav}} {{Usuario:ManuelRomero/Docker/nav}} {{MRM_Objetivos|Title=Objetivos de este tema| ;Qué es docker *Entender de forma in...»)
 
(7. Conclusión)
 
(14 revisiones intermedias por el mismo usuario no mostrado)
Línea 1: Línea 1:
{{Usuario:ManuelRomero/ProgramacionWeb/Docker/nav}}
+
{{TOC}}
 
{{Usuario:ManuelRomero/Docker/nav}}
 
{{Usuario:ManuelRomero/Docker/nav}}
 +
https://dev.to/code42cate/5-awesome-docker-tools-to-make-your-life-easier-22kl?context=digest
  
 
{{MRM_Objetivos|Title=Objetivos de este tema|
 
{{MRM_Objetivos|Title=Objetivos de este tema|
Línea 15: Línea 16:
 
;Hacer una app usando docker como servidor web
 
;Hacer una app usando docker como servidor web
 
*Crear una app para multidiomas usando gettext
 
*Crear una app para multidiomas usando gettext
*Hacer dockerizado, es decir, el servidor web en un docker
+
*Desplcear una aplicación dockerizada en un hosting
 +
{{Nota| TO-DO (uso de gitaction ????)  }}
 
}}
 
}}
 
{{MRM_Web|Title = Referencias|
 
{{MRM_Web|Title = Referencias|
https://josejuansanchez.org/curso-docker/
+
*https://josedom24.github.io/curso_docker_2022/
 
+
*https://iesgn.github.io/curso_docker_2021/
 +
*https://github.com/josedom24/curso_docker_2022
 +
*https://github.com/josedom24/curso_docker_ies
 +
*https://github.com/juanda99/curso-docker-2021/blob/main/index.md
 
}}
 
}}
 +
### Pendiente de revisar:
 +
== Cifrar Contraseñas en Laravel con Docker ==
 +
 +
En este tutorial aprenderás cómo gestionar contraseñas cifradas en un proyecto Laravel utilizando Docker y MySQL. A continuación, se presentan tres opciones que puedes implementar según tus necesidades y restricciones.
 +
 +
=== Opción 1: Usar Docker Secrets (Recomendado) ===
 +
Docker Secrets es una forma segura de gestionar contraseñas y datos sensibles en un entorno de Docker.
 +
 +
==== 1. Crear un secreto de Docker ====
 +
En tu máquina, crea un archivo que contenga las contraseñas en texto plano:
 +
 +
<source lang=bash>
 +
echo "manuel" > db_password
 +
echo "root12345" > db_root_password
 +
</source>
 +
 +
==== 2. Agregar los secretos al servicio ====
 +
Actualiza tu archivo `docker-compose.yml` para incluir los secretos:
 +
 +
<source lang=bash>
 +
services:
 +
  mysql:
 +
    image: mysql
 +
    volumes:
 +
      - ./mysql:/var/lib/mysql
 +
    environment:
 +
      - MYSQL_DATABASE=${DB_DATABASE}
 +
      - MYSQL_USER=${DB_USER}
 +
      - MYSQL_PASSWORD_FILE=/run/secrets/db_password
 +
      - MYSQL_ROOT_PASSWORD_FILE=/run/secrets/db_root_password
 +
    secrets:
 +
      - db_password
 +
      - db_root_password
 +
 +
  phpmyadmin:
 +
    image: phpmyadmin
 +
    ports:
 +
      - 8101:${DB_PORT_PHPMYADMIN}
 +
    environment:
 +
      - PMA_HOST=mysql
 +
      - PMA_ARBITRARY=1
 +
 +
secrets:
 +
  db_password:
 +
    file: ./db_password
 +
  db_root_password:
 +
    file: ./db_root_password
 +
</source>
 +
 +
==== 3. Actualizar `.env` ====
 +
No necesitas cambiar las contraseñas en `.env`, ya que ahora Docker utilizará los secretos.
 +
 +
=== Opción 2: Cifrar las contraseñas en el archivo `.env` ===
 +
Si no puedes usar Docker Secrets, puedes cifrar las contraseñas en `.env` y descifrarlas dentro del contenedor.
 +
 +
==== 1. Cifrar las contraseñas ====
 +
Usa una herramienta como `openssl` para cifrar las contraseñas:
 +
 +
<source lang=bash>
 +
echo -n "manuel" | openssl enc -aes-256-cbc -a -salt -pass pass:clave
 +
# Salida: U2FsdGVkX1/...
 +
</source>
 +
 +
Guarda las contraseñas cifradas en el archivo `.env`:
 +
 +
<source lang=bash>
 +
DB_PASSWORD=U2FsdGVkX1/...
 +
DB_PASSWORD_ROOT=U2FsdGVkX1/...
 +
</source>
 +
 +
==== 2. Descifrar dentro del contenedor ====
 +
Modifica el `entrypoint` o el `Dockerfile` de tu servicio MySQL para descifrar las contraseñas antes de pasarlas al entorno.
 +
 +
Ejemplo en un `Dockerfile`:
 +
 +
<source lang=bash>
 +
RUN apt-get update && apt-get install -y openssl
 +
ENTRYPOINT export MYSQL_PASSWORD=$(echo $DB_PASSWORD | openssl enc -aes-256-cbc -d -a -pass pass:clave) && \
 +
          export MYSQL_ROOT_PASSWORD=$(echo $DB_PASSWORD_ROOT | openssl enc -aes-256-cbc -d -a -pass pass:clave) && \
 +
          docker-entrypoint.sh
 +
</source>
 +
 +
=== Opción 3: Usar una herramienta de gestión de secretos ===
 +
Integrar una herramienta externa como **Vault by HashiCorp** o **AWS Secrets Manager** para manejar las contraseñas y pasarlas al contenedor como variables de entorno.
 +
 +
=== Consideraciones importantes ===
 +
1. '''Seguridad de las claves''': Si cifras las contraseñas, asegúrate de proteger la clave de cifrado (no guardarla en el repositorio).
 +
2. '''Docker Secrets es la mejor opción''': Si puedes usar Docker Secrets, lo ideal es no manejar contraseñas en los archivos `.env`.
 +
3. '''Pruebas''': Asegúrate de probar la configuración y verificar que las contraseñas se están aplicando correctamente.
 +
 +
 +
== Diferencias entre usar localhost y 127.0.0.1 en MySQL ==
 +
Cuando configuramos aplicaciones para conectarse a una base de datos MySQL, como Laravel, es importante entender cómo funcionan `localhost` y `127.0.0.1`, ya que su comportamiento es distinto y puede causar problemas inesperados.
 +
 +
=== 1. ¿Qué significa usar localhost? ===
 +
- Cuando se usa `DB_HOST=localhost`, MySQL intenta conectarse utilizando un **socket Unix** en lugar de TCP/IP.
 +
- Un socket Unix es un archivo especial que permite la comunicación entre procesos en la misma máquina sin usar la red. Este archivo generalmente se encuentra en `/var/run/mysqld/mysqld.sock`.
 +
 +
=== 2. ¿Qué significa usar 127.0.0.1? ===
 +
- Cuando se usa `DB_HOST=127.0.0.1`, MySQL utiliza **TCP/IP** para establecer la conexión.
 +
- Incluso si la base de datos está en la misma máquina, se comunica a través de la red (bucle local).
 +
 +
=== 3. Diferencias clave ===
 +
| **Aspecto**              | **localhost**                  | **127.0.0.1**              |
 +
|---------------------------|----------------------------------|----------------------------|
 +
| **Método de conexión**    | Socket Unix                    | TCP/IP                    |
 +
| **Velocidad**            | Más rápida (local)              | Ligeramente más lenta      |
 +
| **Compatibilidad en Docker** | Puede fallar si no se comparte el socket | Funciona sin problemas      |
 +
| **Uso en Laravel**        | Requiere configurar `DB_SOCKET` | Sólo necesita IP y puerto  |
 +
 +
=== 4. Problemas comunes ===
 +
- **Error con localhost**: Si MySQL no tiene configurado el socket correctamente o el cliente no puede acceder a él, las conexiones fallarán.
 +
- **Error con 127.0.0.1**: Si MySQL está configurado para no escuchar en TCP/IP, las conexiones fallarán.
 +
 +
=== 5. Opciones para solucionar problemas ===
 +
 +
==== Opción 1: Usar 127.0.0.1 ====
 +
La forma más sencilla de evitar problemas es configurar Laravel para que use `127.0.0.1` y se conecte a través de TCP/IP. Esto es especialmente útil si la base de datos está en un contenedor Docker.
 +
 +
**Configuración en `.env`**:
 +
<source lang=dotenv>
 +
DB_CONNECTION=mysql
 +
DB_HOST=127.0.0.1
 +
DB_PORT=3306
 +
DB_DATABASE=instituto
 +
DB_USERNAME=manuel
 +
DB_PASSWORD=manuel
 +
</source>
 +
 +
Esta configuración asegura que Laravel se comunique con MySQL mediante TCP/IP.
 +
 +
==== Opción 2: Compartir el socket Unix ====
 +
Si deseas usar `localhost`, puedes compartir el socket Unix entre Docker y tu sistema host. Esto permite que Laravel acceda directamente al archivo del socket.
 +
 +
**Paso 1: Compartir el socket en `docker-compose.yml`**:
 +
<source lang=yaml>
 +
services:
 +
  mysql:
 +
    image: mysql
 +
    volumes:
 +
      - /var/run/mysqld:/var/run/mysqld # Compartir el socket
 +
      - ./mysql:/var/lib/mysql
 +
    environment:
 +
      - MYSQL_DATABASE=instituto
 +
      - MYSQL_USER=manuel
 +
      - MYSQL_PASSWORD=manuel
 +
      - MYSQL_ROOT_PASSWORD=root12345
 +
</source>
 +
 +
**Paso 2: Configurar Laravel para usar el socket**:
 +
En el archivo `.env` de Laravel, define el socket:
 +
<source lang=dotenv>
 +
DB_CONNECTION=mysql
 +
DB_HOST=localhost
 +
DB_PORT=
 +
DB_DATABASE=instituto
 +
DB_USERNAME=manuel
 +
DB_PASSWORD=manuel
 +
DB_SOCKET=/var/run/mysqld/mysqld.sock
 +
</source>
 +
 +
Esto instruye a Laravel para usar el socket compartido en lugar de TCP/IP.
 +
 +
=== 6. ¿Cuál elegir? ===
 +
- **Usar 127.0.0.1**:
 +
  - Es más sencillo y funciona en la mayoría de los casos.
 +
  - Ideal para configuraciones con Docker o en redes locales.
 +
 +
- **Compartir el socket**:
 +
  - Ofrece mejor rendimiento al eliminar la sobrecarga de TCP/IP.
 +
  - Útil si tienes control completo del entorno y quieres usar `localhost`.
 +
 +
=== 7. Conclusión ===
 +
Ambas opciones son válidas dependiendo de tu contexto. Si estás usando Docker, `127.0.0.1` es más confiable. Si prefieres usar `localhost`, asegúrate de configurar correctamente el socket y compartirlo entre el contenedor y tu máquina local.
 +
 +
¿Tienes dudas? ¡Explora estas configuraciones y elige la que mejor se adapte a tu entorno!
 +
 +
===ENV vs ARG===
 +
*Qué bien explicado :)
 +
https://www.docker.com/blog/docker-best-practices-using-arg-and-env-in-your-dockerfiles/

Última revisión de 06:54 24 ene 2025


https://dev.to/code42cate/5-awesome-docker-tools-to-make-your-life-easier-22kl?context=digest


Icon objectives.jpg
Objetivos de este tema
Qué es docker
  • Entender de forma intuitiva qué es docker desde el punto de vista del programador
  • Entender qué es un contenedor
  • Ver las diferencias entre un contenedor y una máquina virtual
Instalar
  • Instalar docker
  • Crerar contenedores a partir de imágenes
  • Instalar servicios en los contenedores
  • Crear una imagen a partir de un contenedor
  • Copiar un contenedor en un fichero tar para desplegarlo a otra máquina
Hacer una app usando docker como servidor web
  • Crear una app para multidiomas usando gettext
  • Desplcear una aplicación dockerizada en un hosting

(Comment.gif: TO-DO (uso de gitaction ????) )






      1. Pendiente de revisar:

Cifrar Contraseñas en Laravel con Docker

En este tutorial aprenderás cómo gestionar contraseñas cifradas en un proyecto Laravel utilizando Docker y MySQL. A continuación, se presentan tres opciones que puedes implementar según tus necesidades y restricciones.

Opción 1: Usar Docker Secrets (Recomendado)

Docker Secrets es una forma segura de gestionar contraseñas y datos sensibles en un entorno de Docker.

1. Crear un secreto de Docker

En tu máquina, crea un archivo que contenga las contraseñas en texto plano:

echo "manuel" > db_password
echo "root12345" > db_root_password

2. Agregar los secretos al servicio

Actualiza tu archivo `docker-compose.yml` para incluir los secretos:

services:
  mysql:
    image: mysql
    volumes:
      - ./mysql:/var/lib/mysql
    environment:
      - MYSQL_DATABASE=${DB_DATABASE}
      - MYSQL_USER=${DB_USER}
      - MYSQL_PASSWORD_FILE=/run/secrets/db_password
      - MYSQL_ROOT_PASSWORD_FILE=/run/secrets/db_root_password
    secrets:
      - db_password
      - db_root_password
 
  phpmyadmin:
    image: phpmyadmin
    ports:
      - 8101:${DB_PORT_PHPMYADMIN}
    environment:
      - PMA_HOST=mysql
      - PMA_ARBITRARY=1
 
secrets:
  db_password:
    file: ./db_password
  db_root_password:
    file: ./db_root_password

3. Actualizar `.env`

No necesitas cambiar las contraseñas en `.env`, ya que ahora Docker utilizará los secretos.

Opción 2: Cifrar las contraseñas en el archivo `.env`

Si no puedes usar Docker Secrets, puedes cifrar las contraseñas en `.env` y descifrarlas dentro del contenedor.

1. Cifrar las contraseñas

Usa una herramienta como `openssl` para cifrar las contraseñas:

echo -n "manuel" | openssl enc -aes-256-cbc -a -salt -pass pass:clave
# Salida: U2FsdGVkX1/...

Guarda las contraseñas cifradas en el archivo `.env`:

DB_PASSWORD=U2FsdGVkX1/...
DB_PASSWORD_ROOT=U2FsdGVkX1/...

2. Descifrar dentro del contenedor

Modifica el `entrypoint` o el `Dockerfile` de tu servicio MySQL para descifrar las contraseñas antes de pasarlas al entorno.

Ejemplo en un `Dockerfile`:

RUN apt-get update && apt-get install -y openssl
ENTRYPOINT export MYSQL_PASSWORD=$(echo $DB_PASSWORD | openssl enc -aes-256-cbc -d -a -pass pass:clave) && \
           export MYSQL_ROOT_PASSWORD=$(echo $DB_PASSWORD_ROOT | openssl enc -aes-256-cbc -d -a -pass pass:clave) && \
           docker-entrypoint.sh

Opción 3: Usar una herramienta de gestión de secretos

Integrar una herramienta externa como **Vault by HashiCorp** o **AWS Secrets Manager** para manejar las contraseñas y pasarlas al contenedor como variables de entorno.

Consideraciones importantes

1. Seguridad de las claves: Si cifras las contraseñas, asegúrate de proteger la clave de cifrado (no guardarla en el repositorio). 2. Docker Secrets es la mejor opción: Si puedes usar Docker Secrets, lo ideal es no manejar contraseñas en los archivos `.env`. 3. Pruebas: Asegúrate de probar la configuración y verificar que las contraseñas se están aplicando correctamente.


Diferencias entre usar localhost y 127.0.0.1 en MySQL

Cuando configuramos aplicaciones para conectarse a una base de datos MySQL, como Laravel, es importante entender cómo funcionan `localhost` y `127.0.0.1`, ya que su comportamiento es distinto y puede causar problemas inesperados.

1. ¿Qué significa usar localhost?

- Cuando se usa `DB_HOST=localhost`, MySQL intenta conectarse utilizando un **socket Unix** en lugar de TCP/IP. - Un socket Unix es un archivo especial que permite la comunicación entre procesos en la misma máquina sin usar la red. Este archivo generalmente se encuentra en `/var/run/mysqld/mysqld.sock`.

2. ¿Qué significa usar 127.0.0.1?

- Cuando se usa `DB_HOST=127.0.0.1`, MySQL utiliza **TCP/IP** para establecer la conexión. - Incluso si la base de datos está en la misma máquina, se comunica a través de la red (bucle local).

3. Diferencias clave

| **Aspecto** | **localhost** | **127.0.0.1** | |---------------------------|----------------------------------|----------------------------| | **Método de conexión** | Socket Unix | TCP/IP | | **Velocidad** | Más rápida (local) | Ligeramente más lenta | | **Compatibilidad en Docker** | Puede fallar si no se comparte el socket | Funciona sin problemas | | **Uso en Laravel** | Requiere configurar `DB_SOCKET` | Sólo necesita IP y puerto |

4. Problemas comunes

- **Error con localhost**: Si MySQL no tiene configurado el socket correctamente o el cliente no puede acceder a él, las conexiones fallarán. - **Error con 127.0.0.1**: Si MySQL está configurado para no escuchar en TCP/IP, las conexiones fallarán.

5. Opciones para solucionar problemas

Opción 1: Usar 127.0.0.1

La forma más sencilla de evitar problemas es configurar Laravel para que use `127.0.0.1` y se conecte a través de TCP/IP. Esto es especialmente útil si la base de datos está en un contenedor Docker.

    • Configuración en `.env`**:

Idioma no válido.

Necesita especificar un idioma como esto: <source lang="html4strict">...</source>

lenguajes soportados para sintaxis remarcada:

4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, algol68, apache, applescript, apt_sources, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, c_loadrunner, c_mac, caddcl, cadlisp, cfdg, cfm, chaiscript, cil, clojure, cmake, cobol, coffeescript, cpp, cpp-qt, csharp, css, cuesheet, d, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, j, java, java5, javascript, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nsis, oberon2, objc, objeck, ocaml, ocaml-brief, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, php-brief, pic16, pike, pixelbender, pli, plsql, postgresql, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, rails, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, sas, scala, scheme, scilab, sdlbasic, smalltalk, smarty, spark, sparql, sql, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xorg_conf, xpp, yaml, z80, zxbasic


DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=instituto
DB_USERNAME=manuel
DB_PASSWORD=manuel

Esta configuración asegura que Laravel se comunique con MySQL mediante TCP/IP.

Opción 2: Compartir el socket Unix

Si deseas usar `localhost`, puedes compartir el socket Unix entre Docker y tu sistema host. Esto permite que Laravel acceda directamente al archivo del socket.

    • Paso 1: Compartir el socket en `docker-compose.yml`**:
services:
  mysql:
    image: mysql
    volumes:
      - /var/run/mysqld:/var/run/mysqld # Compartir el socket
      - ./mysql:/var/lib/mysql
    environment:
      - MYSQL_DATABASE=instituto
      - MYSQL_USER=manuel
      - MYSQL_PASSWORD=manuel
      - MYSQL_ROOT_PASSWORD=root12345
    • Paso 2: Configurar Laravel para usar el socket**:

En el archivo `.env` de Laravel, define el socket:

Idioma no válido.

Necesita especificar un idioma como esto: <source lang="html4strict">...</source>

lenguajes soportados para sintaxis remarcada:

4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, algol68, apache, applescript, apt_sources, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, c_loadrunner, c_mac, caddcl, cadlisp, cfdg, cfm, chaiscript, cil, clojure, cmake, cobol, coffeescript, cpp, cpp-qt, csharp, css, cuesheet, d, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, j, java, java5, javascript, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nsis, oberon2, objc, objeck, ocaml, ocaml-brief, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, php-brief, pic16, pike, pixelbender, pli, plsql, postgresql, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, rails, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, sas, scala, scheme, scilab, sdlbasic, smalltalk, smarty, spark, sparql, sql, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xorg_conf, xpp, yaml, z80, zxbasic


DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=
DB_DATABASE=instituto
DB_USERNAME=manuel
DB_PASSWORD=manuel
DB_SOCKET=/var/run/mysqld/mysqld.sock

Esto instruye a Laravel para usar el socket compartido en lugar de TCP/IP.

6. ¿Cuál elegir?

- **Usar 127.0.0.1**:

 - Es más sencillo y funciona en la mayoría de los casos.
 - Ideal para configuraciones con Docker o en redes locales.

- **Compartir el socket**:

 - Ofrece mejor rendimiento al eliminar la sobrecarga de TCP/IP.
 - Útil si tienes control completo del entorno y quieres usar `localhost`.

7. Conclusión

Ambas opciones son válidas dependiendo de tu contexto. Si estás usando Docker, `127.0.0.1` es más confiable. Si prefieres usar `localhost`, asegúrate de configurar correctamente el socket y compartirlo entre el contenedor y tu máquina local.

¿Tienes dudas? ¡Explora estas configuraciones y elige la que mejor se adapte a tu entorno!

ENV vs ARG

  • Qué bien explicado :)
https://www.docker.com/blog/docker-best-practices-using-arg-and-env-in-your-dockerfiles/