docs/deployment.md
# Docker Deployment
* [Install docker](deployment.md#dockers)
* [Build image](deployment.md#build-image)
* [Run image](deployment.md#run-image)
* [Login into docker](deployment.md#login-into-docker-container)
## Docker
To run project you only need host machine with **operating system** with installed **git** (to clone this repo)
and [docker](https://www.docker.com/) and thats all - any other software is not needed
(other software like node.js etc. will be automatically downloaded and installed inside docker container during build step based on dockerfile).
### Install docker
#### MacOS:
`brew cask install docker`
And run docker by Mac bottom menu> launchpad > docker (on first run docker will ask you about password)
#### Ubuntu:
```
sudo apt-get update
sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
sudo apt-add-repository 'deb https://apt.dockerproject.org/repo ubuntu-xenial main'
sudo apt-get update
apt-cache policy docker-engine
sudo apt-get install -y docker-engine
sudo systemctl status docker # test: shoud be active
```
And add your user to docker group (to avoid `sudo` before using `docker` command in future):
```
sudo usermod -aG docker $(whoami)
```
and logout and login again.
### Build image
Because *node.js* is big memory consumer you need 1-2GB RAM or virtual memory to build docker image
(it was successfully tested on machine with 512MB RAM + 2GB virtual memory - building process take 7min)
Go to main project folder. To build big (~280MB) image which has cached data and is able to **FAST** rebuild
(this is good for testing or staging environment) type:
`docker build -t angular-starter .`
To build **SMALL** (~20MB) image without cache (so each rebuild will take the same amount of time as first build)
(this is good for production environment) type:
`docker build --squash="true" -t angular-starter .`
The **angular-starter** name used in above commands is only example image name.
To remove intermediate images created by docker on build process, type:
`docker rmi -f $(docker images -f "dangling=true" -q)`
### Run image
To run created docker image on [localhost:8080](localhost:8080) type (parameter `-p 8080:80` is host:container port mapping)
`docker run --name angular-starter -p 8080:80 angular-starter &`
And that's all, you can open browser and go to [localhost:8080](localhost:8080).
### Run image on sub-domain
If you want to run image as virtual-host on sub-domain you must setup [proxy](https://github.com/jwilder/nginx-proxy)
. You should install proxy and set sub-domain in this way:
```
docker pull jwilder/nginx-proxy:alpine
docker run -d -p 80:80 --name nginx-proxy -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy:alpine
```
And in your `/etc/hosts` file (linux) add line: `127.0.0.1 angular-starter.your-domain.com` or in yor hosting add
folowing DNS record (wildchar `*` is handy because when you add new sub-domain in future, you don't need to touch/add any DNS record)
```
Type: CNAME
Hostname: *.your-domain.com
Direct to: your-domain.com
TTL(sec): 43200
```
And now you are ready to run image on subdomain by:
```
docker run -e VIRTUAL_HOST=angular-starter.your-domain.com --name angular-starter angular-starter &
```
### Login into docker container
`docker exec -t -i angular-starter /bin/bash`
___