Creé dos contenedores Docker basados en dos imágenes diferentes. uno de db y otro para servidor web. ambos contenedores se ejecutan en mi mac osx.
Puedo acceder al contenedor db desde la máquina host y de la misma manera puedo acceder al servidor web desde la máquina host.
sin embargo, ¿cómo accedo a la conexión db desde el servidor web?
la forma en que comencé db container es
docker run --name oracle-db -p 1521:1521 -p 5501:5500 oracle/database:12.1.0.2-ee
Empecé wls container como
docker run --name oracle-wls -p 7001:7001 wls-image:latest
Puedo acceder a la base de datos en el host conectándome a
sqlplus scott/welcome1@//localhost:1521/ORCLCDB
Puedo acceder a wls en el host como
http://localhost:7001/console
Respuestas:
La forma más fácil es usar --link, sin embargo, las versiones más nuevas de la ventana acoplable se están alejando de eso y, de hecho, ese interruptor se eliminará pronto.
El enlace a continuación también ofrece una buena forma de conectar dos contenedores. Puede omitir la parte de adjuntar, ya que es solo una forma útil de agregar elementos a las imágenes.
https://deis.com/blog/2016/connecting-docker-containers-1/
La parte que le interesa es la comunicación entre dos contenedores. La forma más sencilla es hacer referencia al contenedor de base de datos por el nombre del contenedor del servidor web.
Ejemplo:
nombró el contenedor db
db1
y el contenedor del servidor webweb0
. Ambos contenedores deben estar en la red puente, lo que significa que el contenedor web debería poder conectarse al contenedor de base de datos haciendo referencia a su nombre.Entonces, si tiene un archivo de configuración web para su aplicación, entonces para el host de base de datos usará el nombre
db1
.si está usando una versión anterior de Docker, entonces debería usar --link.
Ejemplo:
Paso 1:
docker run --name db1 oracle/database:12.1.0.2-ee
luego, cuando inicie la aplicación web. utilizar:
Paso 2:
docker run --name web0 --link db1 webapp/webapp:3.0
y la aplicación web se vinculará a la base de datos. Sin embargo, como dije, el interruptor --link se eliminará pronto.
En su lugar, usaría docker compose, que construirá una red para usted. Sin embargo; deberá descargar Docker compose para su sistema. https://docs.docker.com/compose/install/#prerequisites
una configuración de ejemplo es como esta:
el nombre del archivo es
base.yml
esto nombrará a la red con un nombre genérico, no puedo recordar fácilmente cuál es ese nombre, a menos que use el interruptor --name.
ES DECIR
docker-compose --name setup1 up base.yml
NOTA: si usa el modificador --name, deberá usarlo cada vez que llame a docker compose, de
docker-compose --name setup1 down
modo que pueda tener más de una instancia de servidor web y db, y en este caso, para que docker compose sepa qué instancia desea ejecutar comandos contra; y también para que pueda tener más de uno ejecutándose a la vez. Excelente para CI / CD, si está ejecutando una prueba en paralelo en el mismo servidor.Docker compose también tiene los mismos comandos que Docker, por lo que
docker-compose --name setup1 exec webserver do_some_command
la mejor parte es que, si desea cambiar db o algo así para la prueba unitaria, puede incluir un archivo .yml adicional en el comando up y sobrescribirá cualquier elemento con nombres similares, lo considero una clave => reemplazo de valor .
Ejemplo:
db.yml
Luego llame
docker-compose --name setup1 up base.yml db.yml
Esto sobrescribirá el archivo db. con una configuración diferente. Cuando necesite conectarse a estos servicios desde cada contenedor, use el nombre establecido en servicio, en este caso, webserver y db.
Creo que esta podría ser una configuración más útil en su caso. Dado que puede establecer todas las variables que necesita en los archivos yml y simplemente ejecutar el comando para docker compose cuando necesite que se inicien. Así que empieza y olvídate de la configuración.
NOTA: no utilicé el
--port
comando, ya que exponer los puertos no es necesario para la comunicación contenedor-> contenedor. Solo es necesario si desea que el host se conecte al contenedor o la aplicación desde fuera del host. Si expone el puerto, entonces el puerto está abierto a todas las comunicaciones que permite el host. Así que exponer la web en el puerto 80 es lo mismo que iniciar un servidor web en el host físico y permitirá conexiones externas, si el host lo permite. Además, si desea ejecutar más de una aplicación web a la vez, por cualquier motivo, exponer el puerto 80 evitará que ejecute aplicaciones web adicionales si también intenta exponer en ese puerto. Por lo tanto, para CI / CD es mejor no exponer puertos en absoluto, y si usa Docker compose con el interruptor --name, todos los contenedores estarán en su propia red para que no colisionen. Así que prácticamente tendrás un contenedor de contenedores.ACTUALIZACIÓN: Después de usar más las funciones y ver cómo otros lo han hecho para programas CICD como Jenkins. La red también es una solución viable.
Ejemplo:
El comando anterior creará una "red_prueba" que también puede adjuntar a otros contenedores. Lo cual se simplifica con el
--network
operador de interruptores.Ejemplo:
Por supuesto, si tiene configuraciones de red proxy, aún debe pasarlas a los contenedores usando las instrucciones de cambio "-e" o "--env-file". Para que el contenedor pueda comunicarse con Internet. Docker dice que la configuración del proxy debería ser absorbida por el contenedor en las versiones más nuevas de Docker; sin embargo, todavía los paso como un acto de costumbre. Este es el reemplazo del interruptor "--link" que desaparecerá. Una vez que los contenedores están conectados a la red que creó, aún puede hacer referencia a esos contenedores desde otros contenedores usando el 'nombre' del contenedor. Según el ejemplo anterior, eso sería
db1
. Solo tiene que asegurarse de que todos los contenedores estén conectados a la misma red y esté listo para comenzar.Para obtener un ejemplo detallado del uso de la red en una tubería cicd, puede consultar este enlace: https://git.in.moodle.com/integration/nightlyscripts/blob/master/runner/master/run.sh
Cuál es el script que se ejecuta en Jenkins para una gran prueba de integración para Moodle, pero la idea / ejemplo se puede usar en cualquier lugar. Espero que esto ayude a otros.
fuente
psql -U {USER} -h database -p 5432 {DATABASE}
desde dentro del contenedor si me bombardearon en élEs fácil. Si tiene dos o más contenedores en ejecución, complete los siguientes pasos:
Ahora se conecta desde el contenedor web1 al contenedor web2 o al revés.
Utilice las direcciones IP de la red interna que puede encontrar ejecutando:
Tenga en cuenta que solo las direcciones IP internas y los puertos son accesibles a los contenedores conectados por el puente de red.
Entonces, por ejemplo, suponiendo que el contenedor web1 se inició con:
docker run -p 80:8888 web1
(lo que significa que su servidor se está ejecutando en el puerto 8888 internamente), y la inspecciónmyNetwork
muestra que la IP de web1 es 172.0.0.2, puede conectarse desde web2 a web1 usandocurl 172.0.0.2:8888
).fuente
web1
. Ej. ) Como nombre de host.Tendrá que acceder a db a través de la ip de la máquina host, o si desea acceder a él a través de localhost: 1521, ejecute el servidor web como -
Mira aquí
fuente
-p 7001:7001
, ya que todos los contenedores utilizan la propia pila de red del host.Al usar
docker-compose
, los servicios se exponen entre sí por nombre de forma predeterminada. Docs .También puede especificar un alias como;
Y luego acceda al servicio utilizando el alias especificado como nombre de host, por ejemplo,
mongo.openconceptlab.org
paramongo
en este caso.fuente