Docker技术简介

Docker 是一个开源的应用容器引擎,让开发者可以打包配置文件、启动命令、应用程序、环境变量、第三方软件库和依赖包、运行时环境和操作系统到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。

一个完整的Docker有以下几个部分组成:

DockerClient客户端

Docker Daemon守护进程

Docker Image镜像

DockerContainer容器

Docker采用C/S架构模式,其中Docker daemon作为服务端接受来自客户的请求,而容器与镜像的关系则可以对应面向对象编程中的对象和类。

我从常用的三个指令来解释一下docker具体的运行原理。通过客户端执行docker pull指令时,先会调用docker daemon守护进程从仓库中拉取对应名字和tag的镜像文件到本地环境中。执行docker run 指令时,先通过调用docker daemon进程检测本地是否存在指定的运行容器所依赖的镜像,如果有则根据参数创建一个容器,没有则从仓库之中进行拉取。docker build通过调用docker daemon来根据预先设定好的dockerfile文件来在本地环境中构建镜像,也可通过指令把在本地构建好的镜像push到仓库之中。

Docker的具体作用

通过Docker技术的灵活性,可移植性和高效性,开发者可以快速搭建运行环境并让代码在其中能够被部署,一般性作用可以体现在以下几点:

  • 快速的组建一个微服务架构,比如国产开源Linux运维面板1Panel就是基于Dockerk进行服务环境的搭建,能够快速搭建起LNMP架构,帮助开发者快速建站。

  • 更方便的在服务器上进行代码测试,通过搭建Docker环境进行软件测试,不会污染宿主机的环境,只要在开发环境成功实现部署,就可以在生成测试环境实现部署。

  • 方便开发者对web应用进行自动化打包发布,无代码能力的人可以根据开发者配置的docker-cli或者compose文件一键部署web应用而无需进行编译和依赖配置。

  • docker容器可以随开随关随时重建,非常适合动态规划和缩容,能够提供弹性的云服务。

Docker在常见Linux发行版(Ubuntu)的安装

我们在选择搭建Docker环境中应选择具有良好兼容性,稳定性和易用性的操作系统。

  • 在服务器上使用,推荐安装UbuntuServer来作为Docker客户端的宿主机,相对于其他Linux发行版来说,ubuntu更加容易上手且是Dokcer开发者默认推荐的运行环境。

  • 在个人计算机上使用,推荐使用Windows下wsl子系统,这个功能可以在Windows更多的程序中进行安装。或者可以直接安装Docker Desktop图形化的程序来在Windows上来进行Docker的环境的搭建,在安装Docker Destop的过程中系统会自动帮你安装wsl2。

这里我给出在UbuntuServer下安装docker环境的指令:

更新软件包索引

sudo apt-get update

允许APT使用HTTPS

sudo apt-get install apt-transport-https ca-certificates curl software-properties-common   

添加Docker官方GPG密钥

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -  

添加Docker的稳定版本仓库

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" 

安装Docker CE

sudo apt-get install docker-ce

验证Docker是否安装成功并运行

sudo systemctl status docker

这里我给出更加简单命令,从网站上下载.sh脚本,它会自动执行上述的所有步骤:

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

在安装完成之后,可以通过一下docker命令来验证是否安装成功同时查看当前Docker服务的版本:

sudo systemctl start docker
docker --version

守护进程初始化配置

为了让普通用户能够运行Docker命令,可以获取当前用户的环境变量并添加到Docker的用户组中,在本命令执行完成之后你需要重启当前会话:

sudo usermod -aG docker ${USER}

由于Docker默认的镜像源服务器在国外,可以通过以下两种方式来加快镜像的拉取速度:

  • 第一种方法注册国内的镜像加速源

docker指令大多都是由docker守护进程Docker daemon来执行的,所以我们需要修改它的相关配置。

sudo nano /etc/docker/daemon.json  #创建并编辑daemon.json

复制粘贴以下代码到daemon.json中,ctrl+o,ctrl+x保存并退出

{
    "registry-mirrors": [
        "https://registry.hub.docker.com",
        "http://hub-mirror.c.163.com",
        "https://mirror.baidubce.com"
    ]
}

重启docker进程,让其加载配置文件,如果无法重启可能是上述json文件语法出错,建议重新复制

sudo systemctl daemon-reload
sudo systemctl restart docker

查看当前的docker信息,如果末尾显示注册了以上镜像加速源的地址,代表注册成功

  • 第二种方法配置docker守护进程的代理,不推荐此方法,只给命令,不多加赘述

sudo mkdir -p /etc/systemd/system/docker.service.d
sudo nano /etc/systemd/system/docker.service.d/http-proxy.conf

写入以下内容

[Service]
Environment="HTTP_PROXY=http://127.0.0.1:7890/"
Environment="HTTPS_PROXY=https://127.0.0.1:7891/"

重启docker守护进程并更新配置

sudo systemctl daemon-reload
sudo systemctl restart docker

Docker的基本命令详解

  • 从注册仓库中拉取镜像,docker的镜像由多个层(layers)构成,层可以进行复用,当你的本地没有拉取过镜像文件时,docker镜像的拉取会比较的慢,这是正常现象,因为本地没有可以复用的层文件。在一般拉取镜像之前,我建议先去dockerhub中查看所要拉取镜像的Tag,确保所部署的容器版本是所需要的。

docker image pull [OPTIONS] NAME[:TAG|@DIGEST]
docker pull #上行指令的快捷指令

这里给出官方的拉取示例,当你的镜像名字后面没有带Tag时,docker守护进程会默认使用tag:latest,这代表将会拉取最新的镜像。当然由于注册仓库的问题,这个默认tag并不会每次都正好拉取上最新的镜像,还是如前文所说的,去仓库的tag页看一看,确保你拉取的的镜像是你所需要的。

docker image pull debian

Using default tag: latest
latest: Pulling from library/debian
e756f3fdd6a3: Pull complete
Digest: sha256:3f1d6c17773a45c97bd8f158d665c9709d7b29ed7917ac934086ad96f92e4510
Status: Downloaded newer image for debian:latest
docker.io/library/debian:latest
  • 查看本地的镜像文件,不带名称和标签默认显示所有的镜像文件,带名称和标签显示匹配的镜像。

docker image ls [OPTIONS] [REPOSITORY[:TAG]]
docker images    #上行指令的快捷指令

-a, --all:显示所有镜像
--digests:显示摘要
  • 删除所有悬空的镜像文件,如果指定还有删除任何容器为引用的镜像。

docker image prune [OPTIONS]

-a, --all:删除所有未使用的镜像
-f, --force:强制删除,不进行确认
  • 从主机节点中删除(并取消标记)一个或多个镜像。如果图像有 多个标签,使用此命令并将标签作为参数仅删除标记。如果标签是图像的唯一标签,则图像和标签都是删除。这个命令无法删除正在运行的容器所注册的镜像,建议先停止容器,再进行删除。

docker image rm [OPTIONS] IMAGE [IMAGE...]
docker rmi     #上行指令的快捷指令

-f, --force:强制删除图像
  • 运行docker容器的命令,并根据需要拉取镜像并运行容器,这个命令较为复杂,所需参数需要根据项目具体问题具体分析,在这里我不多展开讲,详情可以等我的后续docker教程。

docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]
docker run    #上行指令的快捷指令
  • 显示当前所有的容器(默认正在运行的容器)。

docker container ls [OPTIONS]
docker ps   #上行指令的快捷指令

-a, --all:显示所有容器(包括没运行的)
  • 暂停指定容器的所有进程,在Linux上这个命令使用的是freezer cgroup,可以去看freezercgroup来获取更多的信息。

docker container pause CONTAINER [CONTAINER...]
docker pause   #上行指令的快捷指令
  • 下述三条命令分别是开始容器,统计容器的信息和停止容器。这里的停止stop和上述命令pause不同,停止代表了容器完成了自身的生命周期而被停止,容器内的所有进程将被结束。而run指令和start又不同,run指令可以理解为pull指令和start指令先后运行,先进行镜像的拉取然后再开始容器。

docker container start [OPTIONS] CONTAINER [CONTAINER...]
docker start   #上行指令的快捷指令

docker container stats [OPTIONS] [CONTAINER...]
docker stats   #上行指令的快捷指令

docker container stop [OPTIONS] CONTAINER [CONTAINER...]
docker stop   #上行指令的快捷指令

进入dockerfile所在的文件夹内,执行该命令可以在本地进行docker镜像的构建。

docker image build [OPTIONS] PATH | URL | -
docker build #上行指令的快捷指令

在运行的容器中执行命令,可以先用docker ps -a查询正在运行的容器,然后使用容器ID进入容器。

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

-d :分离模式: 在后台运行
-i :即使没有附加也保持STDIN 打开
-t :分配一个伪终端