[Hilo Oficial] Docker

E

#58 tienes la capa gratuita de amazon durante 12 meses

2 meses después
bultack

Estoy empezando a pillar rollos con Docker.

Resulta que estoy intentando crear un contenedor a partir de una imagen de nosejs en la que quiero instalar gulp para montar un watcher de less para que me lo compile cuando detecte cambios.

El Dockerfile lo tengo tal que así:

FROM node:boron

# Create app directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

# Install app dependencies
COPY package.json /usr/src/app
RUN npm install

# Bundle app source
COPY . /usr/src/app

ADD . /usr/src/app
CMD [ "npm run watch" ]

Para esto me he basado en la guía que hay en la documentación de nodejs así que no sé si me sobra algo.

Dónde hago el ADD lo tenía con

VOLUME .;/usr/src/app

Con VOLUME ni ADD consigo que funcione porque me da el siguiente error:

docker: Error response from daemon: oci runtime error: container_linux.go:247: starting container process caused "exec: \"npm run watch\": executable file not found in $PATH".

Los archivos están en la ubicación correcta ya que he probado a ejecutar RUN ls -la y me devuelve el mismo contenido que tengo en el local

Ya lo he solucionado, el problema lo tenía en el CMD, le tenía que pasar cada parámetro en un string distinto.

1 respuesta
pineda

#62 llego tarde pero, para próximas veces, puedes hacer la ejecución del tipo

docker run -it imagen bash

así entras a la bash del contenedor, por lo cual no se ejecuta la línea CMD , y allí podrías tirar los comandos

1 respuesta
bultack

#63 Probé con eso pero me parece que acababa entrando en la terminal de node porque usaba ls, pwd y me saltaba un error diciendo que no reconocía el comando.

De lo ofuscado que estaba ni me paré a leer detenidamente el error para ver a qué se debía...

1 mes después
bultack

Estoy empezando a meter postgreSQL en docker-compose y para poder hacer consultas a la base de datos quiero usar PgAdmin. No sé muy bien si hay alguna forma de poder configurarlo sin tener que hacer un docker inspect sobre el contenedor de la base de datos para ver su ip. He probado usando el nombre del contenedor, localhost, 0.0.0.0, 127.0.0.0, etc... pero no me sirve ninguna...

Creo recordar que para mongodb no tuve tantos problemas para conectarlo al robomongo

1 respuesta
RaCe

#65 abre el puerto en el docker-compose ( https://docs.docker.com/compose/compose-file/#ports ) y accede con localhost:<port>

1 1 respuesta
bultack

#66 Gracias, ahora sí :)

1 respuesta
pineda

en respuesta a #67

Desconozco la aplicación de PgAdmin, pero si no quieres exponer el puerto de postgresql para fuera, lo que puedes hacer es linkear (o crearte una docker-network)

Lo harías así:

  • docker network create postgrenetwork
  • docker run -d --net postgrenetwork --name postgres postgres (este comando es el que usaste en origen para crear la base de datos, así que ponle las variables de entorno que necesites o configuraciones)
  • docker run -d -p 5050:5050 --net pg thajeztah/pgadmin4

Así consigues que pgadmin vea la base de datos por el nombre del contenedor (postgres)

Y si lo necesitas hacer sobre docker-compose, allí también puedes definir que network utiliza haciendo algo parecido a:

db:
    image: postgres
    networks:
      - postgrenetwork

Si trabajas con pocos contenedores relacionados, quizás es más fácil usar 'links' en lugar de networks, pero es algo que docker esta deprecando por lo que te aconsejo usar networks

1 respuesta
Saphyel

Si usas docker-compose te crea automaticante el network no?
foldername_default

1 respuesta
pineda

lo desconozco. Hasta donde se trabajará sobre la network default de docker, pero con ella sin realizar links no llegarías de un contenedor a otro por nombre de servicio

bultack

#68 #69 Ahora mismo en el docker-compose.yml tengo la comunicación entre la web y la base de datos con el parámetro link.

Si docker está pensando en dejar atrás los links le echaré un vistazo a network a ver qué averiguo.

2 meses después
bultack

Después de tanto tiempo, he metido en mi proyecto un paquete para crear migraciones y así tener un control de los cambios que voy haciendo en la base de datos. El problema que tengo es que cuando lanzo el comando para ejecutar el archivo acabo teniendo este error:

[ERROR] Error: connect ECONNREFUSED 127.0.0.1:5432
    at Object.exports._errnoException (util.js:1026:11)
    at exports._exceptionWithHostPort (util.js:1049:20)
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1136:14)

Mi docker-compose.yml está así:

version: "2"
services:
  server:
    build: .
    ports:
     - "5000:5000"
    volumes:
      - ./:/usr/src/app
    links:
      - "db:database"
    user: "1000"
  db:
    image: postgres:9.6.2
    ports:
      - "5432:5432"
    volumes:
      - db_data:/var/lib/postgres
    restart: always
    environment:
      POSTGRES_PASSWORD: devel
      POSTGRES_USER: devel
      POSTGRES_DB: devel

volumes:
  db_data:

He probado a crear una network y asignarla a los dos servicios pero nada de nada. Sigo teniendo el mismo error...

1 respuesta
Saphyel

#72 quita el restart:always y mata el postgress

1 respuesta
bultack

#73 Quitado.

Sigo teniendo el mismo problema, para asegurarme me he cargado los contenedores y las imágenes y lo he lanzado todo de nuevo pero sigue dándome el error.

1 respuesta
Saphyel

#74 el problema esta en que tu puerto esta siendo usado:

connect ECONNREFUSED 127.0.0.1:5432

y creo que por tu postrgress local...

una opcion si no quieres matar al postgress es que lo dejes asi

 db:
    image: postgres:9.6.2
    ports:
      - "5433:5432"
1 respuesta
bultack

#75 Me parece raro porque no tengo postgresql instalado de forma local...Pero por descartar que fuera por algún conflicto con ese puerto se lo he cambiado.

El error sigue apareciendo y sigue dando ese mismo puerto... :(

EDIT: He buscado por ese error en concreto y he encontrado esto: https://stackoverflow.com/questions/33357567/econnrefused-for-postgres-on-nodejs-with-dockers

He probado a crear esa variable de entorno y asignarle mis valores. Ahora no recibo el error pero se me queda ahí haciendo algo pero no sé el qué porque no lo veo, creo que ahora podré investigar un poco más.

Gracias por la ayuda.

EDIT2: La razón por la que se quedaba esperando ha sido un fallo mío. A la hora de crear la tabla estaba usando la versión callback en vez de la promise. Ahora ya está todo funcionando :D

4 meses después
Txaman_

Hola buenas, estoy con un proyecto de docker y me está llevando por el camino de la locura, sobretodo por el tema del dockerfile y las configuraciones. La cuestión es, que el proyecto va de crear 4 contenedores (o más si fuere necesario) con un servicio dentro en cada uno de ellos.
Los servicios a meter son:
FTP, WebServer, BBDD, Backups y de opcionales tengo Firewall, DHCP, DNS, LDAP y servidor de dominios.

Los opcionales ya casi que lo dejo y me centro en los 4 principales. Aparte en cada contenedor tiene que haber SSH, pero esto no tiene problema.
Alguien que se le de bién esto me podría echar una mano y mostrarme algun dockerfile? O joder, si teneis un proyecto parecido mostrarmelo.
Gracias!

1 respuesta
Markitos_182

#77 ¿Tienes que crear tu tus propios contenedores? Es decir, dockerizar un FTP, WebServer, BBDD y software de backups?

Porque webserver tienes nginx y bbdd un mongo o una mariadb los tienes oficiales. Por ejemplo.

Sobre Dockerfiles: https://docs.docker.com/engine/reference/builder/#predefined-args
Ejemplo: https://github.com/nginxinc/docker-nginx/blob/c8bfb9b5260d4ad308deac5343b73b027f684375/mainline/stretch/Dockerfile

1 respuesta
Txaman_

#78 Si, tenemos que crear 4 contenedores. Del FTP va a ser VSFTPD ya que pesa poquito, de webserver apache2 ya que lo tengo por mano crearlo, bbdd había pensado en mysql o mariadb y de software de backups ni puta idea porque no he instalado ninguno aun con docker.
El problema está en crear el dockerfile y que funcione, ya que crear a pelo el contenedor no da problemas y cuando lo hago con el dockerfiles da problemas de por todo, principalment el ftp que es con lo que estoy ahora. Estamos un par de compañeros con esto que nos damos de cabeza.

1 respuesta
Markitos_182

#79 Por partes: un Dockerfile crea una imagen. De la imagen puedes crear contenedores.

¿Qué es lo que has probado? Tanto lo que te ha funcionado como lo que no. Escribe los comandos o dockerfiles.

Txaman_

Okey, por partes como dijo jack el destripador, el proyecto son 4 imagenes creadas con 4 dockerfiles i en cada imagen un servicio.

Por otra parte Como haces para iniciar un servicio cada vez que haces un docker start de una imagen que has creado a partir de un Dockerfile?

1 respuesta
Markitos_182

#81 Para eso tienes la sentencia ENTRYPOINT. En el entrypoint señalas un script o el binario que quieres que se ejecute cuando hagas docker start. La diferencia con CMD es que ésta está pensada para ser sobreescrita facilmente, por ejemplo, para añadir argumentos en arranque al contenedor.

Cuando invoques al binario que da servicio dentro del contenedor (ejemplo: /usr/bin/nginx), asegúrate de que se ejecuta en primer plano y no como daemon (en nginx se ejecuta siempre con los argumentos "-g daemon off;"), y a ser posible que los logs vayan al STDOUT para que sean accesible mediante el comando docker logs <container>

1 respuesta
Txaman_

#82 Oh yeah! el ENTRYPOINT era lo que fallaba, ha funcionado en el dockerfile del VSFTPD. A ver con todo lo demás.
Gracias por todo, si tengo alguna duda ya te digo

1 respuesta
Markitos_182

#83 ponlo por aquí y así usamos el hilo este para algo xD

1 1 respuesta
Txaman_

#84 Tengo cierto problema a la hora de crear una imagen, he decidido crear un dockerfile el cual lanza un tomcat, que hace un clone de un repositorio de github. A la hora de crearse me da errores. Paso el codigo, a ver si alguien tiene corage:

FROM openjdk:8-jre-alpine

ENV CATALINA_HOME /usr/local/tomcat
ENV PATH $CATALINA_HOME/bin:$PATH
RUN mkdir -p "$CATALINA_HOME"
WORKDIR $CATALINA_HOME

RUN rm -fr /app && git clone https://github.com/username/customapp.git /app

EXPOSE 80 3306

CMD ["/run.sh"]
1 respuesta
Markitos_182

#85 Epa, que me olvidé de esto el finde.

¿Qué errores te da?

1 respuesta
Txaman_

#86 Al final lo dejé estar este codigo, era demasiado complicado, el profesor me decia que pillará codigos ya hechos y los modificase a mi gusto, pero me era más complicado que hacerlo yo desde cero.

Lo que intento hacer es un dockerfile con un servidor web que me lance una web (un hola mundo), pero no se me lanza con el servidor web ya encencido.

2 meses después
ke2g

soy un fuckin nub de docker y tengo una duda, a ver si alguien puede ayudarme:

Tengo un Dockerfile el cual hace una serie de cosas y al final hace un "copy" de un fichero de configuración. Quiero subir este Dockerfile al hub de docker para poder utilizarlo en otras máquinas, lo hago utilizando "automate build" desde mi repo de github donde tengo el dockerfile.

Hasta aquí todo bien, PERO mi idea es no subir el fichero de configuracion al repo de github, porque hay datos sensibles. Pero si no lo subo, al hacer el "automate build", me lanzara un error, ¿no? ¿Cómo arreglo esto o cuales son las buenas prácticas hacer lo que quiero?

1 respuesta
HeXaN

#88 Yo no subo nada a Docker Hub. Tengo mi propio repositorio donde subo esas cosas y las clono cuando las necesito.

1 respuesta
ke2g

#89 te refieres a que clonas el Dockerfile? pero entonces tienes que hacer build de la imagen cada vez, no?

1 respuesta