Skip to content

Docker easy to get started

About 1170 wordsAbout 4 min

deploy

2021-12-28

Docker is an open source application container engine that can package applications into a portable image. Makes applications easier to deploy on any Linux or Windows operating system machines. At the same time, environmental isolation is also provided, which greatly avoids various problems caused by inconsistencies in different environments. The lightweight portability of Docker has also greatly promoted the development of CI/CD.

Docker architecture diagram

architecture

As can be seen from the figure, the components of Docker include:

  • docker client: docker command line tool
  • docker host: Host, that is, the running environment server of docker daemon
  • docker daemon: docker daemon, docker client interacts with docker daemon via the command line
  • container: The smallest operating system environment that can containerize various services and applications
  • image: Mirror, can be understood as a template configuration of a container, and multiple containers can be started through one image
  • registry: Mirror repository, which stores various images, can pull or push mirrors from the mirror repository.

Install

Official Installation Document

The following only explains the installation process on the CentOS server

CentOS Installation

  1. Installation dependencies
yum install -y yum-utils device-mapper-persistent-data lvm2
  1. Add docker's yum image source. If it is in the country, add Alibaba Cloud's image source.
# Install docker official image source
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# If in the country, install the Alibaba Cloud image
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  1. Install docker
# Install docker
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  1. Start the service
systemctl enable docker

systemctl start docker

When the docker is installed successfully, you can use the following command to view the docker information

# View version information
docker --version

# View detailed version information
docker version

# View detailed configuration information
docker info

Daemon configuration

dockerd is the daemon of docker. dockerd can be configured through a configuration file. The configuration file location under linux is in /etc/docker/daemon.json. For more details, please refer to [official documentation] (https://docs.docker.com/engine/reference/commandline/dockerd/).

The log engine is json-file, which structures the logs and combines a suitable log system to facilitate log location. The storage engine is overrlay2.

mkdir /etc/docker

# Set docker daemon
cat > /etc/docker/daemon.json <<EOF
{
 "exec-opts": ["native.cgroupdriver=systemd"],
 "log-driver": "json-file",
 "log-opts": {
 "max-size": "100m"
 },
 "storage-driver": "overlay2",
 "storage-opts": [
 "overlay2.override_kernel_check=true"
 ]
}
EOF

# Restart docker
systemctl daemon-reload
systemctl restart docker

Mirror

A mirror is a configuration file used to create a container. A container can be considered as a smallest operating system.

The image and container of docker are both used for hierarchical storage using unionFS. The image is shared as a read-only layer. The container attaches a writable layer to the image, minimizing waste of space.

sharing layers

Union file systems

UnionFS is a layered, lightweight and high-performance file system that supports layer-by-layer overlay of modifications to the file system as a commit. The mirrors and containers of docker are hierarchical storage, and the available storage engines include aufs, overlay, etc.

For details about hierarchical storage, you can view the official document docker: About storage drivers

Mirror warehouse and pull

Official Mirror Repository

In most cases, we do not need to build the image ourselves, and can directly pull it from the official image repository.

Use the command docker pull to perform mirror pull. View mirror information via docker inspect:

# Add to pull a node:alpine image
docker pull node:alpine

# View mirror information
docker inspect node:alpine

Build mirroring and publishing

Use the command docker build to build the image. docker build will use the dockerfile of the current directory to build the image.

Use -t to specify the tag

# -t node-base:10: Mirror and version number
# .: Refers to the current path
docker build -t node-base:10.

When the image is built successfully, use docker push to push the image to the repository.

Dockerfile

When deploying your own application using docker, you often need to build your own image.

docker builds the image using Dockerfile as a configuration file:

FROM node:alpine

ADD package.json package-lock.json /code/
WORKDIR /code

RUN npm install --production

ADD . /code

CMD npm start

FROM

Based on an old mirror, the format is as follows

FROM <image> [AS <name>]

# It will be used during multi-stage construction
FROM <image>[:<tag>] [AS <name>]

ADD

Add directory, or url address files to the mirrored file system

ADD [--chown=<user>:<group>] <src>... <dest>

RUN

Execute the command, because of the ufs file system, it will add a new layer to the top layer of the current image

RUN <command>

CMD

Specify how the container starts

Only one CMD is allowed in a Dockerfile

# exec form, this is the preferred form
CMD ["executable","param1","param2"]

# as default parameters to ENTRYPOINT
CMD ["param1","param2"]

# shell form
CMD command param1 param2

Container

The relationship between mirror and container is similar to the relationship between code and process.

  • docker run creates container
  • docker stop Stop the container
  • docker rm delete container

Create container

Create the easiest container based on the nginx image: start the easiest http service

Use docker run to start the container, and docker ps to view the container startup status

docker run -d --name nginx -p 8888:80 nginx:alpine

docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
404e88f0d90c nginx:alpine "nginx -g 'daemon of..." 4 minutes ago Up 4 minutes 0.0.0.0:8888->80/tcp nginx
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

in:

  • -d: Start a daemon process
  • --name: Specify a name for the container
  • -p host-port:container-port: Mapping of host and container ports to facilitate container services to the outside world
  • nginx:alpine: Create container based on this image

At this time, use curl on the host to test whether the service provided by the container is normal

curl localhost:8888

Enter the container environment and use the docker exec -it container-name command

docker exec -it nginx sh
/ #
/ #
/ #

Container Management

  • docker ps lists all containers
docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
404e88f0d90c nginx:alpine "nginx -g 'daemon of..." 4 minutes ago Up 4 minutes 0.0.0.0:8888->80/tcp nginx
498e7d74fb4f nginx:alpine "nginx -g 'daemon of..." 7 minutes ago Up 7 minutes 80/tcp lucid_mirzakhani
2ce10556dc8f redis:4.0.6-alpine "docker-entrypoint.s..." 2 months ago Up 2 months 0.0.0.0:6379->6379/tcp apolloserverstarter_redis_1
  • docker port View container port mapping
docker port nginx

80/tcp -> 0.0.0.0:8888
  • docker stats View container resource usage
docker stats nginx
CONTAINER ID NAME CPU %MEM USAGE / LIMIT MEM %NET I/O BLOCK I/O PIDS
404e88f0d90c nginx 0.00% 1.395MiB / 1.796GiB 0.08% 632B / 1.27kB 0B / 0B 2