
Docker技术入门教程和基本命令详解
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 :分配一个伪终端
- 感谢你赐予我前进的力量