Reflecting code changes in docker containers - express

I have a basic hello world Node application written on express. I have just dockerised this application by creating a basic dockerfile in the applications root directory. I created a docker image, and then ran that image to run it in a running container
# Dockerfile
FROM node:0.10-onbuild
RUN npm install
EXPOSE 3000
CMD ["node", "./bin/www"]
sudo docker build -t docker-express
sudo docker run --name test-container -d -p 80:3000 docker-express
I can access the web application. My question is.. When I made code changes to my application, eg change 'hello world' to 'hello bob', my changes are not reflected within the running container.
What is a good development workflow to update changes in the container? Surely I shouldn't have to delete and rebuild the images after each change?
Thank you :)

Check out the section on Sharing Volumes. You should be able to share your host volume with the docker container and then any time you need a change you can just restart the server (or have something restart it for you!).
Your command would look something like: sudo docker run -v /src/webapp:/webapp --name test-container -d -p 80:3000 docker-express
Which mounts /src/webapp (on the host) to /webapp (in the container).

Related

Why can I access my Apache default page ONLY when I go in my container's bash?

First of all, I would like to say that I'm new to Docker and all that is around it.
I have been wanting to make a container where I have Apache, php and Firebird installed. So far, so good ; everything seems to work and I can get my default page when I type in my Internet search bar my ip address and :8080. I do so by first starting my container like this :
docker run -p 8080:80 -d apps
Where "apps" is the name of my container.
I have achieved this with my Dockerfile, which looks like this (it might be a bit messy, still learning the good practices !) :
# Download of base image - ubuntu 20.04
FROM ubuntu:20.04
# Updating/upgrading
RUN apt-get update -y && apt-get upgrade -y
# Installing apache2, php and firebird with modules
RUN DEBIAN_FRONTEND="noninteractive" apt-get install apache2 php libapache2-mod-php -y && \
apt-get install php-curl php-gd php-intl php-json php-mbstring php-xml php-zip -y && \
DEBIAN_FRONTEND="noninteractive" apt-get install firebird3.0-server -y && apt-get install firebird->
# Start up apache in foreground by default
CMD /usr/sbin/apache2 -D FOREGROUND
ENTRYPOINT service apache2 restart && /bin/bash
# Expose apache
EXPOSE 80
Now, my idea was to export this container to another computer and try the same thing. I have followed a few tutorials and got to import my container on the new machine. My problem here is that somehow, the command I previously used doesn't work ; it shows me this error :
docker: Error response from daemon: No command specified.
See 'docker run --help'.
Which is odd, because it works just fine on the other machine. I also did this command, WHICH WORKS :
docker run -i -t -p 8080:80 apps /bin/bash
This one works alright, but I don't want to have to access the bash everytime I want my Apache page to load. I would want my container to run without me having to get in my container, if that makes sense.
In my opinion, it probably comes from the fact that I only loaded the container, and not the image used to build it (maybe a bad practice? Couldn't find anything about it on google).
Here is my setup just in case ---
On the first machine (which is the one where I created the image and the container) :
Ubuntu 20.04 LTS
Apache/2.4.41
Docker 19.03.8
On the other machine which I'm trying to make my container work :
Ubuntu 18.04 LTS
Apache/2.4.29
Docker 19.03.6
Thank you for your patience and time !
apps is your docker image, if you want to give name for your container you can specify --name in the run command ie,
docker run --name container_name -p 8080:80 -d apps
You can use sudo docker save -o apps.tar apps to create a tar file of the image
then change the root permission of the tar file sudo chmod 777 apps.tar
Copy this tar file to the other system you want to try, then
sudo docker load --input apps.tar
This will load the image, then you can use the previous command to start the container
docker run -p 8080:80 -d apps
Where "apps" is the name of my container. <- This statement is incorrect and perhaps the misunderstood concept that leads you to the problem.
apps is the name of the image, not the name of the container. On the host on which you can run the container, you must have built that image from the Dockerfile that you shared using the command:
docker build -t apps .
Copy the Dockerfile on the host where you cannot run the container, built the image in-there as well and try again running the container.

creating docker container to host website

I want to run static website inside a docker container.
For this i have create ubuntu EC2 machine,installed docker and pulled centos image.
docker pull centos
docker run -td 9f38484d220f bash
docker exec -it aa779e39eb0f bash
===>now inside the container i am using below command
yum update
yum install apache
service httpd start
but i am getting command not recognized error.
Please help me figure out what i am doing wrong.
Also i as i want to run static website i will be putting below code once apache is installed successfully
$touch /var/www/html/index.html
$chkconfig httpd on
$echo "<b>Hii this is my first conatiner running/b>"
>> /var/www/html/index.html
Is this correct way of doing it ?
You installed apache and you are trying to run httpd. Refer this to read the difference between apache2 and httpd. You can run following commands to install apache and run a static hello world page on local host.
$ sudo yum update -y
$ sudo yum install -y httpd
$ sudo service httpd start
$ echo "<html><h1>Hello World!</h1></html>" > test
$ cat test > /var/www/html/index.html
You don't need a container for hosting a static website. S3 is a better choice for this.
If you want to do it as an exercice, considere this simple nginx solution, see: https://hub.docker.com/_/nginx
You have an example in the section : Hosting some simple static content
FROM nginx:alpine
COPY . /usr/share/nginx/html
Remember that you usually don't start a container then start a service inside (for testing and debugging). Entrypoint and command are what start your service, aka what you would manually do.

Docker container cannot share data with host

I am running an automated test on a docker container that downloads a file as part of the test. The file ends up in the home/seluser/Download folder of the docker container. But I want to be ale to access it locally on my mac os x.
However, when I run the following command:
docker run -v /Users/MyUsername/Downloads/MappedFolder:/home/seluser/Downloads -d -P -p 4444:4444 selenium/standalone-chrome:3.7.1-beryllium
The downloaded files don't appear in either the docker container or the host.
As soon as I remove
-v /Users/MyUsername/Downloads/MappedFolder:/home/seluser/Downloads
and end up with
docker run -d -P -p 4444:4444 selenium/standalone-chrome:3.7.1-beryllium
the downloaded file shows up in the docker container
I can't seem to find a way to share that data with my host, so I can access the downloaded file in /Users/MyUsername/Downloads/MappedFolder
you are mounting /Users/MyUsername/Downloads/MappedFolder into docker container.
so it will overwrite the inside volume of docker container, so you can't see any files in the /home/seluser/Downloads directory, you can able to see data exst in host directory.
after running docker container.. you can able see all files whichever you download into /home/seluser/Downloads or in host directory

Docker container immediately exits when started after system reboot

I'm starting my custom docker container (OpenSuse, PHP, Apache, some add-ons) this way:
docker build --build-arg http_proxy=http://user:pwd#ip:port -t prefix/myapp myapp
create --name=myapp --hostname=myapp-p 80:80 -v ${PWD}/myapp:/srv/www/myapp prefix/myapp
docker start myapp
This works perfectly. I can stop and later start the container. However, if I reboot my host system (Windows 10), I'm not able to start the container again. When I try to, the container immediately exits.
How can this be? As stated above, I use the -p and -v flags to map ports and mount a directory.
This is the output of...
docker logs myapp
-> httpd (pid 1) already running
May or may not be your problem (the logs will be telling), but I ran into an issue with docker on windows where the container tries to start before the file system is ready, which causes an error with the volume mounts. I never found a great solution aside from running a task that verifies the volume mount and restarts the container if it failed.

Httpd docker stops after a number of days

I'm trying to run a small personal web server in docker using the httpd image in the docker store (https://store.docker.com/images/httpd).
However, it works ok in the beginning, but tends to simply stop a number of days later, and needs to be restarted using "docker start", and I've not found what is wrong. There are some advice on the net for a CentOS build, but I've not found any for the Docker Store image as-is.
Docker file is:
FROM httpd:2.4
LABEL maintainer "mats.ohrman#gmail.com"
COPY ./content/ /usr/local/apache2/htdocs/
COPY ./config/httpd.conf /usr/local/apache2/conf/httpd.conf
COPY ./config/httpd-vhosts.conf /usr/local/apache2/conf/extra/httpd-vhosts.conf
Docker "build" cmd I used:
docker build -t matsohrman/web .
Docker "run" cmd I used:
docker run -dit --name web -p 80:80 matsohrman/web