Web Application Deployment With Docker
Table of Contents
Installing Docker
Install: From https://docker.github.io/engine/getstarted/linux_install_help/
curl -fsSL https://get.docker.com/ | sh
Verify installation:
docker version docker run hello-world
Get some images from the registry:
docker pull ubuntu:14.04 docker pull ubuntu:16.04 docker run ubuntu:14.04 /bin/echo 'Hello world' docker run ubuntu:16.04 /bin/echo 'Hello world'
Create a web application container
Create a new container from ubuntu-upstart:
docker run -d --name=webapp --hostname=example.org \ -p 8000:80 ubuntu-upstart:14.04
Install apache2 and mysql inside the container:
alias docker-webapp-exec='docker exec -it webapp env TERM=xterm' docker-webapp-exec bash apt-get update apt-get -y upgrade apt-get -y install apache2 mysql-server php5 php5-mysql a2enmod ssl a2ensite default-ssl service apache2 restart exit
Add this line on
/etc/hosts
.127.0.0.1 example.org
- Try it in browser: http://example.org:8000/
Create more web application containers
Save the webapp container as a new image (make a snapshot):
docker stop webapp docker commit webapp lamp:v1.0 docker images
Create new containers from this image:
mkdir /opt/test/ cd /opt/test/ mkdir -p app01 docker run -d --name=webapp01 --hostname=example.org \ -v $(pwd)/app01:/var/www/html \ -p 8001:80 lamp:v1.0 mkdir -p app02 docker run -d --name=webapp02 --hostname=example.org \ -v $(pwd)/app02:/var/www/html \ -p 8002:80 lamp:v1.0
Modify applications:
vim app01/index.php vim app02/index.php
- Test them in browser:
Building images
Create
/opt/test/lamp/Dockerfile
with a content like this:FROM ubuntu-upstart:14.04 RUN apt-get update; apt-get -y upgrade RUN apt-get -y purge openssh-server openssh-client ; apt-get -y autoremove RUN apt-get update ; DEBIAN_FRONTEND=noninteractive apt-get -y install \ vim apache2 mysql-server php5 php5-mysql RUN a2enmod ssl && \ a2ensite default-ssl
Build the image:
cd /opt/test/ docker build --tag=lamp:v1.1 lamp/ docker images
- Rebuild and notice that the cache will be used.
Upload image to Docker Hub
- Register on Docker Hub: https://hub.docker.com/
Set a tag:
docker tag lamp:v1.1 username/lamp:v1.1
Push to Docker Hub:
docker login docker push username/lamp:v1.1
- Edit the information on: https://hub.docker.com/u/username/lamp/
Using container wsproxy
Get the code from GitHub:
cd /opt/test/ git clone https://github.com/docker-build/wsproxy
Create a workdir:
mkdir wsproxy1 cd wsproxy1 ln -s ../wsproxy .
Build the image and create a container:
cp wsproxy/utils/config.sh . vim config.sh wsproxy/docker/build.sh wsproxy/docker/create.sh wsproxy/docker/start.sh
Create containers of webapps:
docker stop webapp01 webapp02 docker rm webapp01 webapp02 docker run -d --name=webapp01 --hostname=app01.example.org \ -v $(pwd)/../app01:/var/www/html lamp:v1.1 docker run -d --name=webapp02 --hostname=app02.example.org \ -v $(pwd)/../app02:/var/www/html lamp:v1.1
Note that no HTTP ports are exposed to the host (for example using options
-p 80:80 -p 443:443
).Add domains
app01.example.org
andapp02.example.org
:wsproxy/domains-add.sh webapp01 app01.example.org wsproxy/domains-add.sh webapp02 app02.example.org cat containers.txt cat sites-enabled/app01.example.org.conf cat sites-enabled/app02.example.org.conf
Add these lines on
/etc/hosts
:127.0.0.1 app01.example.org 127.0.0.1 app02.example.org
- Try in browser:
Try to get a free SSL cert from letsencrypt.org:
wsproxy/get-ssl-cert.sh info@app01.example.org app01.example.org --test
It will not work because
app01.example.org
is not a real domain owned by you andinfo@app01.example.org
is not a real address.
Install SchoolTool
Get scripts from GitHub:
cd /opt/test/ git clone https://github.com/docker-build/SchoolTool cd SchoolTool/
Edit
settings.sh
and comment out the ports:#PORTS="-p 7080:7080 -p 80:80 -p 443:443"
Build image, create the container, and start it:
./build.sh ./create.sh ./start.sh docker ps
Make some configurations and install apache2:
./exec.sh ./config.sh ./exec.sh ./install-apache2.sh
Add the domain to wsproxy:
cd /opt/test/wsproxy1/ wsproxy/domains-add.sh schooltool school1.example.org
- Add to
/etc/hosts
the line127.0.0.1 school1.example.org
and try http://school1.example.org/ in browser. Try to get a free SSL cert from letsencrypt.org:
wsproxy/get-ssl-cert.sh info@school1.example.org school1.example.org --test
It will not work because
school1.example.org
is not a real domain owned by you andinfo@school1.example.org
is not a real address.
Install Moodle
Get scripts from GitHub:
cd /opt/test/ git clone https://github.com/docker-build/moodle
Create a working directory for the container:
mkdir moodle1 cd moodle1/ ln -s ../moodle . cp moodle/utils/settings.sh .
Edit
settings.sh
and comment out the ports:IMAGE=moodle CONTAINER=moodle1 DOMAIN="moodle1.example.org" MYSQL_ROOT_PASSWD=random DBNAME=moodle1 DBUSER=moodle1 DBPASS=moodle1 #PORT_HTTP=80 #PORT_HTTPS=443 #PORT_SSH=2222
Build image, create the container, and start it:
moodle/docker/build.sh moodle/docker/create.sh moodle/docker/start.sh docker ps
Configure the new container:
moodle/config.sh
Add the domain to wsproxy:
cd /opt/test/wsproxy1/ wsproxy/domains-add.sh moodle1 moodle1.example.org
- Add to
/etc/hosts
the line127.0.0.1 moodle1.example.org
and try http://moodle1.example.org/ in browser. Try to get a free SSL cert from letsencrypt.org:
wsproxy/get-ssl-cert.sh info@moodle1.example.org moodle1.example.org --test
It will not work because
moodle1.example.org
is not a real domain owned by you andinfo@moodle1.example.org
is not a real address.
Install B-Translator Client
See: http://info.btr.fs.al/install.html
Get the image:
docker search btranslator docker pull btranslator/btr_client:v3.0 docker images
Create and start a container:
docker create --name=bcl_fr --hostname=fr.example.org btranslator/btr_client:v3.0 docker start bcl_fr
Add the domain to wsproxy:
cd /opt/test/wsproxy1/ wsproxy/domains-add.sh bcl_fr fr.example.org
- Add to
/etc/hosts
the line127.0.0.1 fr.example.org
and open in browser https://fr.example.org/ .
Installing a Drupal Application
- See: https://github.com/dashohoxha/dbox
Get the code of DBox from github:
cd /opt/test/ git clone --branch ubuntu-14.04 https://github.com/dashohoxha/dbox.git
Rename the project:
dbox/rename-project.sh # see usage dbox/rename-project.sh labdoo:webapp03 lbd:w03 mv dbox webapp03
Initialize a git repository:
cd webapp03/ git init . git add -A git commit -a -m 'My new project.' cd ..
Build a docker image and create a container:
mkdir webapp03-workdir cd webapp03-workdir/ ln -s ../webapp03/docker . cp docker/settings.sh . vim settings.sh docker/build.sh settings.sh vim config # comment out ports docker/create.sh docker/start.sh docker ps
Add the domain to wsproxy:
cd /opt/test/wsproxy1/ wsproxy/domains-add.sh webapp03-master example.org
- Add to
/etc/hosts
the line127.0.0.1 example.org
and open in browser https://example.org/ .