Docker

学习Docker主要是在学爬虫要用到Splash然后就按照网上的教程一顿操作发现最后把Docker下载下来了,然而对我来说完全不知道这是一个什么技术,以至于之后的一段时间甚至连借助Docker打开Splash都不会,所以决定简单的学习一下Docker相关的知识。

主要参考文章:

视频教程:

【狂神说Java】Docker最新超详细版教程通俗易懂_哔哩哔哩_bilibili

一、Docker概述

1.Docker简介

Docker是个什么东西?有什么作用?为什么要使用它?

Docker概念多出现在JAVA软件开发中,当开发人员开发好一个jar包之后,会利用Docker将jar包和相关运行环境打包在一起发布在Docker仓库上,运维人员只需要去仓库下载这个镜像即可运行,不需要再手动配置相关运行环境 —— 这个概念是不是很熟悉?Python中的Anaconda是一个Python发行版(内置安装有conda包管理工具),可以配置不同的虚拟环境来兼容不同的Python解释器以及Python包,便于我们使用不同的环境运行不同的项目;需要注意的是,两者的概念尽管相似,但是Docker涉及的范围实际更大,我们可以在Docker的仓库中找到Anaconda的镜像下载并运行Anaconda(因为Anaconda也是一个软件),可以参照基于Docker搭建Anaconda环境 - 知乎 (zhihu.com)进一步区分两者;

另外一点是,Docker使用容器技术(一种虚拟化技术),而VMware使用虚拟机技术(同样是一种虚拟化技术,本质上是一种环境解决方案),乍一看两者有些相似(的确,在Docker出来之前,程序员使用的都是虚拟机技术),但是Docker之所以火爆的原因就在于它的体积特别小巧,我们知道使用VM配置运行一个虚拟机需要占用很大的内存(因为虚拟机完全虚拟了一个完整的计算机,但实际上我们利用这个虚拟机只会做一些单一的工作),而使用Docker就只需要一些必备的核心以及运行环境我们就能启动运行需要的软件,体积最大也才几百M,非常的方便;

虚拟机技术:虚拟出一套硬件,运行一个完整的操作系统,在这个操作系统上安装和运行软件

容器技术:容器内的应用直接运行在宿主机(我的是Windows)的内容,容器是没有自己的内核的(用的是宿主机的内核),也没有虚拟化硬件,故极为轻便(可以在一个物理机上运行几十个MySQL,使用虚拟机技术是基本不可能的);且每个Docker容器互相隔离互不影响

两者横向对比:由下图可以看出Docker是比VM快速、小巧的

2.容器技术

前面介绍说了一堆容器技术,这里简单总结一下:

  • 容器镜像是轻量的、可执行的独立软件包 ,包含软件运行所需的所有内容:代码、运行时环境、系统工具、系统库和设置;
  • 容器化软件适用于基于 Linux 和 Windows 的应用,在任何环境中都能够始终如一地运行;
  • 容器赋予了软件独立性,使其免受外在环境差异(例如,开发和预演环境的差异)的影响,从而有助于减少团队间在相同基础设施上运行不同软件时的冲突;

3.Docker结构

Docker最重要的三个概念分别是:

  • 镜像:可以将镜像看作C++中的模板,通过这一个镜像可以创建多个容器(使用run命令创建容器,注意镜像是不能提供服务的,容器才是提供服务的);
  • 容器:可以将容器理解为简易版本的操作系统(相当于是VM的阉割版,只有一部分功能),可以独立运行一个或多个应用;
  • 仓库:这里的仓库概念与GitHub的仓库概念是类似的,Docker仓库用于存放Docker镜像,分为私有仓库和公有仓库(国外有Docker Hub,国内有aliyun等);

4.Docker Desktop

Docker Desktop是可以部署在windows运行docker的应用服务,基于windos的Hyper-V服务和WSL2内核在windos上创建一个子系统(linux),从而实现其在windows上运行docker。

我们需要在Windows的环境下安装Docker可以参考下面的文章:

关于Docker Desktop的简单使用参考:

二、Docker命令

1.帮助命令

1
docker version          #查看docker的版本信息

1
docker info             #查看docker的系统信息,包括镜像和容器的数量

1
docker 命令 --help       #帮助命令(可查看可选的参数)

2.镜像命令

2.1 查看镜像

1
2
3
4
Docker images #查看本地主机上的所有镜像
# 可选参数
-a/--all 列出所有镜像
-q/--quiet 只显示镜像的id

2.2 搜索镜像

1
Docker search 镜像名

2.3 下载镜像

1
Docker pull 镜像名[:tag]

2.4 删除镜像

1
2
#删除指定镜像
docker rmi -f 镜像id
1
2
#删除多个镜像
docker rmi -f 镜像id 镜像id 镜像id
1
2
#删除全部镜像
docker rmi -f $(docker images -aq)

3.容器命令

3.1 列出容器

1
2
3
4
5
Docker ps  # 列出当前正在运行的容器
#可选参数
-a # 列出所有容器的运行记录,也就是查看所有容器
-n=? # 显示最近创建的n个容器
-q # 只显示容器的编号

3.2 删除容器

因为在实际开发过程中我们经常会使用删除容器这个操作,不要担心删除了的影响,删除了再创建就行了

1
2
3
docker rm 容器id                 #删除指定的容器,不能删除正在运行的容器,强制删除使用 rm -f
docker rm -f $(docker ps -aq) #删除所有的容器(Windows下这个命令的参数-f意义好像和此处不同)
docker ps -a -q|xargs docker rm #删除所有的容器(xargs只有在Linux下是可识别的命令)

3.3 创建并运行容器

1
2
3
4
5
6
7
8
9
10
docker run [可选参数] image
#参数说明
--name="名字" 指定容器名字
-d 后台方式运行,这种方式启动实际上会自动停止这个容器,因为后台运行必须要有一个前台进程,假如没有前台进程会导致自动停止后台应用
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口
( -p ip:主机端口:容器端口 配置主机端口映射到容器端口
-p 主机端口:容器端口
-p 容器端口)
-P 随机指定端口(大写的P)

3.4 启动和重启容器

1
2
3
4
docker start 容器id          #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前运行的容器
docker kill 容器id #强制停止当前容器

3.5 进入容器

run命令加了 -d 参数默认不会进入容器(即容器在启动后进入后台运行),想要进入容器需要使用指令:

  • docker attach:进入容器正在执行的终端,不会启动新的进程,如果从这个容器退出,会导致容器的停止
  • docker exec:进入容器后开启一个新的终端,可以在里面操作,如果从这个容器退出,容器不会停止,这就是为什么推荐使用 docker exec 的原因

3.6 退出容器

1
2
#exit 停止并退出容器(后台方式运行则仅退出)
#Ctrl+P+Q 不停止容器退出

3.7 查看容器中进程

1
docker top 容器ID

Docker
https://gintoki-jpg.github.io/2022/08/01/工具_Docker/
作者
杨再俨
发布于
2022年8月1日
许可协议