Keep lines under 80 chars whenever possible

This commit is contained in:
Marcel Ribeiro-Dantas 2022-11-13 12:43:08 -03:00
parent 6384e51166
commit f7cfce26aa
No known key found for this signature in database
GPG Key ID: BA6A9BC3398907E0

View File

@ -6,39 +6,79 @@ contributors:
- ["Ruslan López", "http://javapro.org/"] - ["Ruslan López", "http://javapro.org/"]
- ["Michael Chen", "https://github.com/ML-Chen"] - ["Michael Chen", "https://github.com/ML-Chen"]
- ["Akshita Dixit", "https://github.com/akshitadixit"] - ["Akshita Dixit", "https://github.com/akshitadixit"]
- ["Marcel Ribeiro-Dantas", "https://github.com/mribeirodantas"]
--- ---
Docker is a tool that helps you build, test, ship and run applications seamlessly across various machines. It replicates the environment our software needs on any machine. You can get Docker for your machine from https://docs.docker.com/get-docker/ Docker is a tool that helps you build, test, ship and run applications
seamlessly across various machines. It replicates the environment our software
needs on any machine. You can get Docker for your machine from
https://docs.docker.com/get-docker/
It has grown in popularity over the last decade due to being lightweight and
fast as compared to virtual-machines that are bulky and slow. Unlike VMs, docker
does not need a full blown OS of its own to be loaded to start and does not
compete for resources other than what the application it is running will use.
VMs on the other hand are pretty resource intensive on our processors, disks and
memory hence running multiple VMs for various applications becomes a challenge
in a limited capacity architecture.
It has grown in popularity over the last decade due to being lightweight and fast as compared to virtual-machines that are bulky and slow. Unlike VMs, docker does not need a full blown OS of its own to be loaded to start and does not compete for resources other than what the application it is running will use. VMs on the other hand are pretty resource intensive on our processors, disks and memory hence running multiple VMs for various applications becomes a challenge in a limited capacity architecture.
<pre> <pre>
┌────────────────────────┐ ┌───────────────────────┐ ┌────────────────────────┐ ┌───────────────────────┐ ┌────────────────────────┐ ┌───────────────────────┐
│ ┌───────────┐ │ │ ┌───────────┐ │ │ ┌───────────┐ │ │ ┌───────────┐ │ │ ┌───────────┐ │ │ ┌───────────┐ │
│ │ App │ │ │ │ App │ │ │ │ App │ │ │ │ App │ │ │ │ App │ │ │ │ App │ │
│ └───────────┘ │ │ └───────────┘ │ │ └───────────┘ │ │ └───────────┘ │ │ └───────────┘ │ │ └───────────┘ │
│ ┌────────┐ ┌────────┐ │ │ ┌────────┐ ┌───────┐ │ │ ┌────────┐ ┌────────┐ │ │ ┌────────┐ ┌───────┐ │ │ ┌────────┐ ┌────────┐ │ │ ┌────────┐ ┌───────┐ │
│ │ Libs │ │ Deps │ │ │ │ Libs │ │ Deps │ │ │ │ Libs │ │ Deps │ │ │ │ Libs │ │ Deps │ │ │ │ Libs │ │ Deps │ │ │ │ Libs │ │ Deps │ │
│ └────────┘ └────────┘ │ │ └────────┘ └───────┘ │ │ └────────┘ └────────┘ │ │ └────────┘ └───────┘ │ │ └────────┘ └────────┘ │ │ └────────┘ └───────┘ │
│ ┌───────────────────┐ │ │ ┌──────────────────┐ │ │ Container1 │ │ Container2 │ │ ┌───────────────────┐ │ │ ┌──────────────────┐ │
│ │ OS │ │ │ │ OS │ │ └────────────────────────┘ └───────────────────────┘ │ │ OS │ │ │ │ OS │ │
│ └───────────────────┘ │ │ └──────────────────┘ │ ┌──────────────────────────────────────────────────┐ │ └───────────────────┘ │ │ └──────────────────┘ │
│ VM1 │ │ VM2 │ │ Docker │ │ VM1 │ │ VM2 │
└────────────────────────┘ └───────────────────────┘ └──────────────────────────────────────────────────┘ └────────────────────────┘ └───────────────────────┘
┌──────────────────────────────────────────────────┐ ┌──────────────────────────────────────────────────┐ ┌──────────────────────────────────────────────────┐
│ Hypervisor │ │ OS │ │ Hypervisor │
└──────────────────────────────────────────────────┘ └──────────────────────────────────────────────────┘ └──────────────────────────────────────────────────┘
┌───────────────────────────────────────────────────┐ ┌──────────────────────────────────────────────────┐ ┌──────────────────────────────────────────────────┐
│ Hardware Infrastructure │ │ Hardware Infrastructure │ │ Hardware Infrastructure │
└───────────────────────────────────────────────────┘ └──────────────────────────────────────────────────┘ └──────────────────────────────────────────────────┘
(VM based architecture) (Docker based architecture) (VM based architecture)
┌────────────────────────┐ ┌───────────────────────┐
│ ┌───────────┐ │ │ ┌───────────┐ │
│ │ App │ │ │ │ App │ │
│ └───────────┘ │ │ └───────────┘ │
│ ┌────────┐ ┌────────┐ │ │ ┌────────┐ ┌───────┐ │
│ │ Libs │ │ Deps │ │ │ │ Libs │ │ Deps │ │
│ └────────┘ └────────┘ │ │ └────────┘ └───────┘ │
│ Container1 │ │ Container2 │
└────────────────────────┘ └───────────────────────┘
┌──────────────────────────────────────────────────┐
│ Docker │
└──────────────────────────────────────────────────┘
┌──────────────────────────────────────────────────┐
│ OS │
└──────────────────────────────────────────────────┘
┌──────────────────────────────────────────────────┐
│ Hardware Infrastructure │
└──────────────────────────────────────────────────┘
(Docker based architecture)
</pre> </pre>
Couple of terms we will encounter frequently are Docker Images and Docker Containers. Images are packages or templates of containers all stored in the [Docker Hub](https://hub.docker.com/). Containers are standalone, executable instances of these images which include code, runtime, system tools, system libraries and settings - everything required to get the software up and running. Coming to Docker, it follows a client-server architecture wherein the CLI client communicates with the server component, which here is, the Docker Engine using RESTful API to issue commands. Couple of terms we will encounter frequently are Docker Images and Docker
Containers. Images are packages or templates of containers all stored in the
[Docker Hub](https://hub.docker.com/). Containers are standalone, executable
instances of these images which include code, runtime, system tools, system
libraries and settings - everything required to get the software up and running.
Coming to Docker, it follows a client-server architecture wherein the CLI client
communicates with the server component, which here is, the Docker Engine using
RESTful API to issue commands.
## The Docker CLI ## The Docker CLI
```bash ```bash
# after installing Docker from https://docs.docker.com/get-docker/ # after installing Docker from https://docs.docker.com/get-docker/
# To list available commands, either run `docker` with no parameters or execute `docker help` # To list available commands, either run `docker` with no parameters or execute
# `docker help`
$docker $docker
>>> docker [OPTIONS] COMMAND [ARG...] >>> docker [OPTIONS] COMMAND [ARG...]
@ -65,63 +105,80 @@ $docker
# […] # […]
$docker run hello-world $docker run hello-world
# `docker run <container-name>` is used to run a container, it will pull the images from Docker Hub if they don't alrady exist on your system # `docker run <container-name>` is used to run a container, it will pull the
# Here the docker client connects to the daemon which in turn pulls the "hello-world" image from the Docker Hub. The daemon then creates a # images from Docker Hub if they don't alrady exist on your system. Here the
# new container from the image which runs the executable that produces the output streamed back to the client that we see on our terminals. # docker client connects to the daemon which in turn pulls the "hello-world"
# image from the Docker Hub. The daemon then creates a new container from the
# image which runs the executable that produces the output streamed back to the
# client that we see on our terminals.
$docker run -d ubuntu sleep 60s $docker run -d ubuntu sleep 60s
# The -d (or --detach) flag is when we want to run a container in the background and return back to the terminal. # The -d (or --detach) flag is when we want to run a container in the background
# Here we detach an ubuntu container from the terminal, the output should be the id and the command exits. If we check running containers, # and return back to the terminal. Here we detach an ubuntu container from the
# we should still see ours there: # terminal, the output should be the id and the command exits. If we check
# running containers, we should still see ours there:
# CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES # CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 133261b4894a ubuntu "sleep 60s" 3 seconds ago Up 2 seconds vigorous_gould # 133261b4894a ubuntu "sleep 60s" 3 seconds ago Up 2 seconds vigorous_gould
$docker run <container-id> -p 3000:8000 $docker run <container-id> -p 3000:8000
# The -p (or --publish) flag is used to expose port 8000 inside the container to port 3000 outside the container # The -p (or --publish) flag is used to expose port 8000 inside the container to
# This is because the app inside the container runs in isolation, hence the port 8000 where the app runs is private to the container. # port 3000 outside the container. This is because the app inside the container
# runs in isolation, hence the port 8000 where the app runs is private to the
# container.
$docker run -i or $docker run -it $docker run -i or $docker run -it
# Docker runs our containers in a non-interactive mode i.e. they do not accept inputs or work dynamically while running. # Docker runs our containers in a non-interactive mode i.e. they do not accept
# The -i flag keeps input open to the container, and the -t flag creates a pseudo-terminal that the shell can attach to (can be combined as -it) # inputs or work dynamically while running. The -i flag keeps input open to the
# container, and the -t flag creates a pseudo-terminal that the shell can attach
# to (can be combined as -it)
$docker ps -a $docker ps -a
# The `docker ps` command only shows running containers by default. To see all containers, use the -a (or --all) flag # The `docker ps` command only shows running containers by default. To see all
# containers, use the -a (or --all) flag
# Running the above command should output something similar in the terminal: # Running the above command should output something similar in the terminal:
# CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES # CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 82f84bf6912b hello-world "/hello" 9 minutes ago Exited (0) 9 minutes ago eloquent_sammet # 82f84bf6912b hello-world "/hello" 9 minutes ago Exited (0) 9 minutes ago eloquent_sammet
$docker start hello-world or $docker stop hello-world $docker start hello-world or $docker stop hello-world
# The stop command simply stops one or more containers, the start command starts the conatainer(s) up again! # The stop command simply stops one or more containers, the start command starts
# `docker start -a ubuntu` will attach our detached container back to the terminal i.e. runs in the foreground # the conatainer(s) up again! `docker start -a ubuntu` will attach our detached
# container back to the terminal i.e. runs in the foreground
$docker create alpine $docker create alpine
# `docker create` creates a new container for us with the image specified (here, alpine), the container does not auto-start unlike `docker run` # `docker create` creates a new container for us with the image specified (here,
# This command is used to set up a container configuration and then `docker start` to shoot it up when required. Note that the status is "Created": # alpine), the container does not auto-start unlike `docker run`. This command
# is used to set up a container configuration and then `docker start` to shoot
# it up when required. Note that the status is "Created":
# CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES # CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 4c71c727c73d alpine "/bin/sh" 29 seconds ago Created naughty_ritchie # 4c71c727c73d alpine "/bin/sh" 29 seconds ago Created naughty_ritchie
$docker rm 82f84 $docker rm 82f84
# Removes one or more containers using their container ID. # Removes one or more containers using their container ID.
# P.S.: we can use only the first few characters of the entire ID to identify containers # P.S.: we can use only the first few characters of the entire ID to identify
# containers
$docker images $docker images
# Displays all images and their information, created here means the latest image tag updated on Docker Hub: # Displays all images and their information, created here means the latest image
# tag updated on Docker Hub:
# REPOSITORY TAG IMAGE ID CREATED SIZE # REPOSITORY TAG IMAGE ID CREATED SIZE
# ubuntu latest a8780b506fa4 9 days ago 77.8MB # ubuntu latest a8780b506fa4 9 days ago 77.8MB
# alpine latest 9c6f07244728 3 months ago 5.54MB # alpine latest 9c6f07244728 3 months ago 5.54MB
# hello-world latest feb5d9fea6a5 13 months ago 13.3kB # hello-world latest feb5d9fea6a5 13 months ago 13.3kB
$docker rmi $docker rmi
# Removes one or more images from your system which do not have their instances (or containers as we know them) running. # Removes one or more images from your system which do not have their instances
# If the image has an attached container, either delete the container first or use the -f (or --force) flag to forcefully delete both the container and image. # (or containers as we know them) running. If the image has an attached
# container, either delete the container first or use the -f (or --force) flag
# to forcefully delete both the container and image.
$docker pull busybox $docker pull busybox
# The pull command downloads the specified image on our system from Docker Hub. # The pull command downloads the specified image on our system from Docker Hub.
$docker exec -it 7b272 bash $docker exec -it 7b272 bash
# This command is used to run a command in the running container's default directory # This command is used to run a command in the running container's default
# Here 7b272 was our ubuntu container and the above command would help us interact with the container by opening a bash session # directory. Here 7b272 was our ubuntu container and the above command would
# help us interact with the container by opening a bash session
$docker compose $docker compose