News:
On August 13, Docker updated its website service agreement to prohibit organizations and individuals from embargoed countries and those included in multiple lists such as the U.S. "Entity List" from using the service. The protocol's Docker website and all related websites.
This includes: Huawei, Hikvision, Dahua Technology, iFlytek, Megvii Technology, SenseTime and many other technology companies, as well as universities such as Harbin Institute of Technology and Harbin Engineering University.
In this article, we will explore the mysterious world of Docker, master the basic principles and practical operations of Docker from scratch, and understand why Docker is so important. [Related recommendations: Docker Video Tutorial]
In the rich Web era, applications are becoming more and more powerful, and at the same time, they are becoming more and more complex. Cluster deployment, isolation environment, grayscale release and dynamic expansion are all indispensable, and containerization has become a necessary bridge in the middle.
Tell a story
In order to better understand what Docker is, let’s tell a story first:
I I needed to build a house, so I moved rocks, chopped wood, drew drawings, and built the house. After a lot of work, the house was finally built.
# As a result, after living there for a while, I suddenly wanted to move to the beach. At this time, according to the previous method, I can only go to the beach, move stones, cut wood, draw drawings, and build a house again.
#When I was troubled, a magician came and taught me a magic. This magic can make a copy of the house I built, make it a "mirror image", and put it in my backpack.
When I get to the beach, I will use this "mirror" to copy a house and move in.
Isn’t it amazing? Corresponding to our project, the house is the project itself, the mirror is the copy of the project, and the backpack is the mirror warehouse.
If you want to dynamically expand the capacity, just take out the project image from the warehouse and copy it as you like. Build?once,Run?anywhere!
No need to worry about version, compatibility, deployment and other issues, completely solving the embarrassment of "crashing once online and building endlessly".
Virtual machines and containers
Before we start, let’s do some basic knowledge reserve:
①Virtual machine: virtualization hardware
Virtual machine Virtual Machine refers to a complete computer system with complete hardware system functions simulated by software and running in a completely isolated environment. Everything that can be done on a physical computer can be done on a virtual machine.
When creating a virtual machine on a computer, you need to use part of the hard disk and memory capacity of the physical machine as the hard disk and memory capacity of the virtual machine.
Each virtual machine has an independent CMOS, hard disk and operating system, and can operate the virtual machine just like a physical machine. Before container technology, the biggest influencer in the industry was virtual machines.
The representatives of virtual machine technology are VMWare and OpenStack.
②Container: virtualizes the operating system layer and is a standard software unit
Its characteristics are as follows:
Run anywhere: Containers can package code with configuration files and related dependent libraries to ensure consistent operation in any environment.
High resource utilization: Containers provide process-level isolation, so the CPU and memory usage can be set more granularly, thereby making better use of the server's computing resources.
Rapid expansion: Each container can run as a separate process and can share the system resources of the underlying operating system, which can speed up the efficiency of starting and stopping the container.
③ Differences and connections:
Although a virtual machine can isolate many "children" Computer", but takes up more space and starts slower. Virtual machine software may also cost money, such as VMWare.
Container technology does not need to virtualize the entire operating system, but only needs to virtualize a small-scale environment, similar to a "sandbox".
Running space, virtual machines generally require several GB to dozens of GB of space, while containers only require MB or even KB level.
Let’s take a look at the comparative data:
Virtual machines are virtualization technologies, and Docker is Container technology is lightweight virtualization.
Compared to virtual machines, containers are lighter and faster because they leverage the underlying Linux operating system to run in an isolated environment.
A virtual machine's hypervisor creates a very strong boundary to prevent applications from breaching it, whereas a container's boundary is not as strong.
Get to know Docker
## Docker is an open source application container engine that allows developers to package their The application and dependency packages are put into a portable container and then published to any popular Linux machine, which can also be virtualized. Containers completely use the sandbox mechanism and will not have any interfaces with each other.The three core concepts of Docker technology are:
Core concepts
The core concepts are as follows:http:// dockone.io/article/8788
Install Docker
①Command line installation
Homebrew's Cask already supports Docker for Mac, so you can easily use Homebrew Cask to install, execute the following command:brew cask install dockerFor more installation methods, please check the official documentation:
https://www.docker.com/get-started
②View the version
The command is as follows:docker -v
③Configure image acceleration
Set Docker Engine Write configuration:{ registry-mirrors: [ http://hub-mirror.c.163.com/, https://registry.docker-cn.com ], insecure-registries:[], experimental: false, debug: true }
④Install desktop side
Quick Start
After installing Docker, we first make an image of the actual project and learn while using it.①First of all, we need to have a general understanding of the 11 commands we will use
As shown below:
②New project
For the sake of speed, we directly use Vue scaffolding to build the project:vue create docker-demoTry to start it:
yarn serveAccess address: http://localhost:8080/. The project is ready, we then package the project:
yarn buildAt this time, the Dist in the project directory is the static resource we want to deploy, and we continue to the next step. Note: Front-end projects are generally divided into two categories, one is static deployment using Nginx directly, and the other requires starting the Node service. In this section we only consider the first type. Regarding the Node service, I will explain it in detail later.
③新建 Dockerfile
命令如下:
cd docker-demo && touch Dockerfile
此时的项目目录如下:
. ├── Dockerfile ├── README.md ├── babel.config.js ├── dist ├── node_modules ├── package.json ├── public ├── src └── yarn.lock
可以看到我们已经在 docker-demo 目录下成功创建了 Dockerfile 文件。
④准备 Nginx 镜像
运行你的 Docker 桌面端,就会默认启动实例,我们在控制台拉取 Nginx 镜像:
docker pull nginx
控制台会出现如下信息:
Using default tag: latest latest: Pulling from library/nginx 8559a31e96f4: Pull complete 8d69e59170f7: Pull complete 3f9f1ec1d262: Pull complete d1f5ff4f210d: Pull complete 1e22bfa8652e: Pull complete Digest: sha256:21f32f6c08406306d822a0e6e8b7dc81f53f336570e852e25fbe1e3e3d0d0133 Status: Downloaded newer image for nginx:latest docker.io/library/nginx:latest
如果你出现这样的异常,请确认 Docker 实例是否正常运行。
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
镜像准备 OK,我们在根目录创建 Nginx 配置文件:
touch default.conf
写入:
server { listen 80; server_name localhost; #charset koi8-r; access_log /var/log/nginx/host.access.log main; error_log /var/log/nginx/error.log error; location / { root /usr/share/nginx/html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }
⑤配置镜像
打开 Dockerfile ,写入如下内容:
FROM nginx COPY dist/ /usr/share/nginx/html/ COPY default.conf /etc/nginx/conf.d/default.conf
我们逐行解释一下代码:
FROM nginx 指定该镜像是基于 nginx:latest 镜像而构建的。
COPY dist/ /usr/share/nginx/html/ 命令的意思是将项目根目录下 dist 文件夹中的所有文件复制到镜像中 /usr/share/nginx/html/ 目录下。
COPY default.conf /etc/nginx/conf.d/default.conf 将 default.conf 复制到 etc/nginx/conf.d/default.conf,用本地的 default.conf 配置来替换 Nginx 镜像里的默认配置。
⑥构建镜像
Docker 通过 build 命令来构建镜像:
docker build -t jartto-docker-demo .
按照惯例,我们解释一下上述代码:
-t 参数给镜像命名 jartto-docker-demo。
. 是基于当前目录的 Dockerfile 来构建镜像。
执行成功后,将会输出:
Sending build context to Docker daemon 115.4MB Step 1/3 : FROM nginx ---> 2622e6cca7eb Step 2/3 : COPY dist/ /usr/share/nginx/html/ ---> Using cache ---> 82b31f98dce6 Step 3/3 : COPY default.conf /etc/nginx/conf.d/default.conf ---> 7df6efaf9592 Successfully built 7df6efaf9592 Successfully tagged jartto-docker-demo:latest
镜像制作成功!我们来查看一下容器:
docker image ls | grep jartto-docker-demo
可以看到,我们打出了一个 133MB 的项目镜像:
jartto-docker-demo latest 7df6efaf9592 About a minute ago 133MB
镜像也有好坏之分,后续我们将介绍如何优化,这里可以先暂时忽略。
⑦运行容器
命令如下:
docker run -d -p 3000:80 --name docker-vue jartto-docker-demo
这里解释一下参数:
-d 设置容器在后台运行。
-p 表示端口映射,把本机的 3000 端口映射到 container 的 80 端口(这样外网就能通过本机的 3000 端口访问了。
--name 设置容器名 docker-vue。
jartto-docker-demo 是我们上面构建的镜像名字。
补充一点:在控制台,我们可以通过 docker ps 查看刚运行的 Container 的 ID:
docker ps -a
控制台会输出:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ab1375befb0b jartto-docker-demo /docker-entrypoint.… 8 minutes ago Up 7 minutes 0.0.0.0:3000->80/tcp docker-vue
如果你使用桌面端,那么打开 Docker Dashboard 就可以看到容器列表了,如下图:
⑧访问项目
因为我们映射了本机 3000 端口,所以执行:
curl -v -i localhost:3000
或者打开浏览器,访问:localhost:3000。
⑨发布镜像
如果你想为社区贡献力量,那么需要将镜像发布,方便其他开发者使用。
发布镜像需要如下步骤:
登陆 dockerhub[2],注册账号。
命令行执行 docker login,之后输入我们的账号密码,进行登录。
推送镜像之前,需要打一个 Tag,执行 docker tag
全流程结束,以后我们要使用,再也不需要「搬石头、砍木头、画图纸、盖房子」了,拎包入住。这也是 Docker 独特魅力所在。
常规操作
到这里,恭喜你已经完成了 Docker 的入门项目!如果还想继续深入,不妨接着往下看看。
①参数使用
FROM:
指定基础镜像,所有构建的镜像都必须有一个基础镜像,且 FROM 命令必须是 Dockerfile 的第一个命令
FROM
FROM
示例:FROM mysql:5.0 AS database
MAINTAINER:
镜像维护人的信息
MAINTAINER
示例:MAINTAINER Jartto Jartto@qq.com
RUN:
构建镜像时要执行的命令
RUN
示例:RUN [executable, param1, param2]
ADD:
Add and copy local files to the container, the compressed package will be decompressed, you can access the files on the network, and they will be automatically downloaded
ADD
Example: ADD *.js /app Add js files to the app directory in the container
COPY:
The function is the same as ADD, it just copies, and does not decompress or download the file
CMD:
The command executed after starting the container is different from RUN. RUN is the command to be run when building the image.
When used When docker run runs the container, this can be overridden on the command line
Example: CMD [executable, param1, param2]
ENTRYPOINT:
is also an execution command, the same as CMD, except that this command will not be overwritten by the command line
ENTRYPOINT [executable , param1, param2]
EXPOSE
VOLUME /var /log specifies the directory that needs to be mounted in the container. This directory will be mapped to a random directory on the host to achieve data persistence and synchronization.
WORKDIR
##USER
Example: USER test
ARG [=
ARG name=sss
##https://docs.docker.com/
Best Practices
After mastering the regular operations of Docker, we can easily create the project image we want. However, the images produced by different operations are also very different. What exactly causes the mirroring differences? We might as well continue to explore.
The following are the best practices compiled in the process of applying Docker. Please try to follow the following guidelines: Require Clear: What image is required.Containerization technology will definitely be one of the indispensable skills in the cloud era, and Docker is just drop in the ocean. Along with this comes technologies such as cluster container management Kubernetes, Service Mesh, and Istio. Open the door of Docker, continue to peel off the cocoons, and go deeper layer by layer, you will feel the infinite charm of containerization. Related links: https://www.docker.com/products/docker-desktop https://hub.docker.com/ https://docs.docker.com/ Original address: http://jartto.wang/2020/07/04/learn-docker Author: jartto If you want to know more related knowledge, please visit: Docker usage tutorial! !