So I was able to build on my MacBook: docker build -t my-first-demo .
But then when I tried to run the app: docker run -p 80:80 my-first-demo
it gives me the error:
Error response from daemon: Ports are not available: port is already allocated.
ERRO[0000] error waiting for container: context canceled
I changed the port to things like 81:80, but still not working:
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
Here is my Dockerfile:
FROM php:7.2-apache
COPY src/ /var/www/html/
EXPOSE 80
And a simple php file:
<?php
echo "Hello, World";
?>
Any help would be greatly appreciated!
Use the command
docker ps -a
to see that allocated port. Also check if any other process is using it with:
sudo lsof -i:80
In order to run another container in that same port you should stop any container in used port with:
docker kill <container id> or <container name>
Use tab keyboard and docker will list available active container names.
Is there any way we can change default port os selenoid-ui from 8080 to some other port? I've tried as below in yml file but no success. With this configuration selenoid-ui neither works with 8080 nor 8181,
selenoid-ui:
image: "aerokube/selenoid-ui"
network_mode: bridge
links:
- selenoid
command: ["--selenoid-uri", "http://selenoid:4444"]
command: ["--listen",":8081"]
I have read in few posts about using cm tool to start selenoid-ui with different port. But is it possible to make it in docker-compose yml file?
Thanks in advance.
Selenoid UI is just a regular web-service by default listening on port 8080. Having said that you have several options:
1) When running as a binary simply use -listen flag as follows:
$ ./selenoid-ui -listen :8081
2) When running as Docker container it is better to use port mapping:
$ docker run -d --name selenoid-ui -p 8081:8080 aerokube/selenoid-ui:latest-release
I am trying to connect to a remote DB using SSH programatically from a web application.
I have been trying ssh2 module and I can connect to the remote server but what I would like to do is to connect directly to the tables in the DB.
I also tried tunnel-ssh in the bootstrap.js file so I can tunnel to the db but now what I believe is happening is that the db connection is starting before the tunnel is set up and therefore I am getting a Connection refused.
Is it possible to achieve this tunneling using some kind of configuration in the connections.js file of sails js?
Any other suggestion?
Thanks
Finally what I did is using a docker-compose with 2 dockers 1) web app and 2) SSH client. My docker-compose file looks something like this:
services:
db:
image: agonza1/sshclient
volumes:
- .:/ssh
command: "ssh -Ng -L 5432:localhost:5432 -i sshkey.pem -o StrictHostKeyChecking=no root#site.com -p 1234"
web:
build: .
env_file:
- .env
ports:
- "443:443"
links:
- db
depends_on:
- db
where sshclient is just something like this: https://hub.docker.com/r/kroniak/ssh-client/~/dockerfile/
Suppose for example that I want to make an SSH host in Docker. I understand that I can EXPOSE 22 inside Dockerfile. I also understand that I can use -p 22222:22 so I can SSH into that Docker container from another physical machine on my LAN on port 22222 as ssh my_username#docker_host_ip -p 22222:22. But suppose that I'm so lazy that I can't be bothered to docker run the container with the option -p 22222:22 every time. Is there a way that the option -p 22222:22 can be automated in a config file somewhere? InDockerfile` maybe?
You can use docker compose
You can defind listening port in docker-compose.yml file as below:
version: '2'
services:
web:
image: ubuntu
ssh_service:
build: .
command: ssh ....
volumes:
- .:/code
ports:
- "22222:22"
depends_on:
- web
I want to run rabbitmq-server in one docker container and connect to it from another container using celery (http://celeryproject.org/)
I have rabbitmq running using the below command...
sudo docker run -d -p :5672 markellul/rabbitmq /usr/sbin/rabbitmq-server
and running the celery via
sudo docker run -i -t markellul/celery /bin/bash
When I am trying to do the very basic tutorial to validate the connection on http://docs.celeryproject.org/en/latest/getting-started/first-steps-with-celery.html
I am getting a connection refused error:
consumer: Cannot connect to amqp://guest#127.0.0.1:5672//: [Errno 111]
Connection refused.
When I install rabbitmq on the same container as celery it works fine.
What do I need to do to have container interacting with each other?
[edit 2016]
Direct links are deprecated now. The new way to do link containers is docker network connect. It works quite similar to virtual networks and has a wider feature set than the old way of linking.
First you create your named containers:
docker run --name rabbitmq -d -p :5672 markellul/rabbitmq /usr/sbin/rabbitmq-server
docker run --name celery -it markellul/celery /bin/bash
Then you create a network (last parameter is your network name):
docker network create -d bridge --subnet 172.25.0.0/16 mynetwork
Connect the containers to your newly created network:
docker network connect mynetwork rabbitmq
docker network connect mynetwork celery
Now, both containers are in the same network and can communicate with each other.
A very detailed user guide can be found at Work with networks: Connect containers.
[old answer]
There is a new feature in Docker 0.6.5 called linking, which is meant to help the communication between docker containers.
First, create your rabbitmq container as usual. Note that i also used the new "name" feature which makes life a litte bit easier:
docker run --name rabbitmq -d -p :5672 markellul/rabbitmq /usr/sbin/rabbitmq-server
You can use the link parameter to map a container (we use the name here, the id would be ok too):
docker run --link rabbitmq:amq -i -t markellul/celery /bin/bash
Now you have access to the IP and Port of the rabbitmq container because docker automatically added some environmental variables:
$AMQ_PORT_5672_TCP_ADDR
$AMQ_PORT_5672_TCP_PORT
In addition Docker adds a host entry for the source container to the /etc/hosts file. In this example amq will be a defined host in the container.
From Docker documentation:
Unlike host entries in the /etc/hosts file, IP addresses stored in the environment variables are not automatically updated if the source container is restarted. We recommend using the host entries in /etc/hosts to resolve the IP address of linked containers.
Just get your container ip, and connect to it from another container:
CONTAINER_IP=$(sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}' $CONTAINER_ID)
echo $CONTAINER_IP
When you specify -p 5672, What docker does is open up a new port, such as 49xxx on the host and forwards it to port 5672 of the container.
you should be able to see which port is forwarding to the container by running:
sudo docker ps -a
From there, you can connect directly to the host IP address like so:
amqp://guest#HOST_IP:49xxx
You can't use localhost, because each container is basically its own localhost.
Create Image:
docker build -t "imagename1" .
docker build -t "imagename2" .
Run Docker image:
docker run -it -p 8000:8000 --name=imagename1 imagename1
docker run -it -p 8080:8080 --name=imagename2 imagename2
Create Network:
docker network create -d bridge "networkname"
Connect the network with container(imagename) created after running the image:
docker network connect "networkname" "imagename1"
docker network connect "networkname" "imagename2"
We can add any number of containers to the network.
docker network inspect ''networkname"
I think you can't connect to another container directly by design - that would be the responsibility of the host. An example of sharing data between containers using Volumes is given here http://docs.docker.io/en/latest/examples/couchdb_data_volumes/, but I don't think that that is what you're looking for.
I recently found out about https://github.com/toscanini/maestro - that might suit your needs. Let us know if it does :), I haven't tried it myself yet.
Edit. Note that you can read here that native "Container wiring and service discovery" is on the roadmap. I guess 7.0 or 8.0 at the latest.
You can get the docker instance IP with...
CID=$(sudo docker run -d -p :5672 markellul/rabbitmq /usr/sbin/rabbitmq-server); sudo docker inspect $CID | grep IPAddress
But that's not very useful.
You can use pipework to create a private network between docker containers.
This is currently on the 0.8 roadmap:
https://github.com/dotcloud/docker/issues/1143