Docker Concepts
Basics
What is container?
- its layers of images
- Linux based image
- and application image on top
What is Docker?
It manages containers!
What is Docker Images?
It is kind of a readonly filesystem or say CD Disk like a ISO from which we can run a container.
How to create Image?
Option 1: Using Dockerfile
Dockerfile
FROM Ubuntu
1. OS - Ubuntu
RUN apt-get update
2. Update apt repo
RUN apt-get install python
RUN pip install flask
3. Install dependencies using apt
RUN pip install flask-mysql
4. Install Python dependencies using pip
COPY . /opt/source-code
ENTRYPOINT FLASK_APP=/opt/source-code/app.py flask run
docker build Dockerfile –t yourusername/my-custom-app
docker push yourusername/my-custom-app
This will upload your dockerfile to docker registory online such as dockerhub.io
Docker Registry
docker run nginx
In this case nginx is repository name where it pull from the remote location such docker hub.
When user give image name to pull it actually expect account name and repo name like this:
docker run nginx/nginx
In this case first nginx is account name and second is repo name. When user type of only one name i.e. docker run nginx
it assumes that both account name and repo name is that same name.
Public Registry
There are popular public docker repositories:
- gcr.io - google repository
- hub.docker.io - dockers official repository
Private Registry
There are self hosted or private registries to chose from incase you dont want public exposure. Many cloud providers gives you private registries :
- AWS
- Azure
- JCP
To run a container from private registry you need to first login to with following command :
docker login private-registry.io
then you can run your private repository:
docker run private-registry.io/apps/internal-app
Deploy private registry
What if you running your application on premise and dont have private registry how do you deploy your own private registry within your organization:
The docker registry is itself is an application and it available inside docker image. The name of the image is registry. It exposes the api on port 5000.
docker run -d -p 5000:5000 --name registry registry:2
Now that you have your custom registry running on port 5000 on how do you push your own image to it.
docker image tag my-name localhost:5000/my-image
docker push localhost:5000/my-image
Now you can pull this image anywhere within this network with server name i.e. localhost or ip address of the host.
docker pull localhost:5000/my-image
docker pull 192.168.56.100:5000/my-image
Example:
To push some images into our locally hosted registry we can first pull then, tag them and then push them like this:
Pulling:
docker pull nginx:latest
then Tagging:
docker image tag nginx:latest localhost:5000/nginx:latest
and finally push it:
docker push localhost:5000/nginx:latest
.
To check the list of images pushed , use: curl -X GET localhost:5000/v2/_catalog
To remove all locally non running images
docker image prune -a
Now we can pull images from our registry-server
as well. Use docker pull [server-addr/image-name]
to pull the images that we pushed earlier.
In our case we can use: docker pull localhost:5000/nginx