前言
续接上一篇博文: 开发必备技术--docker(一) 这也是开学了,假期的最后一篇博文,后面的一些文章可能就是以图片,pdf文档的形式了,尤其后面设计到数学,算法类型的博文都是这种形式的,当然无所谓,写东西的核心目的还是方便自己,如果觉得对你有用的话,请不要吝啬你的三连~
Docker的基本概念
概念
在docker的操作之中有两个比较重要的概念,镜像和容器。其实他们的之间的关系非常简单,我们通过镜像来创建容器。因此对于docker的命令其实也就是分为三个类别,第一个是关于镜像的操作,第二个是关于容器的操作,第三个其实就是一些其他的辅助的命令。
那么镜像和容器之间的关系是啥呢,我们用虚拟机来举例子其实就是,这个镜像其实就相当于我们在创建虚拟机的时候系统镜像,只不过这个系统镜像比较特殊,它里面自带了一些“捆绑软件”,这些软件是我们开发的时候需要用到的软件,比如mysql,redis,mongdb,之类的东西。那么容器呢起就是我们创建出来的虚拟机,通过一个镜像我们可以创建很多个虚拟机。所以说我们用docker后面部署运行的其实就是容器,但是这个容器和我们的虚拟机不一样的是,虚拟机是在一个系统上模拟一个新的系统,然后在模拟的系统上面在运行软件,但是docker不是,他就是在同一个系统上面去运行,只是环境进行了隔离。其实再类比一下就是,虚拟机是我们使用一些模拟玩游戏的场景类似,在运行游戏的时候,还需要运行一个模拟的安卓系统。那么docker里面的容器其实就相当于这个微信,或者支付宝小程序一样,小程序之间是不同的,只是用微信,或者支付宝作为载体。
数据卷
现在的话我们已经知道了镜像和容器之间的关系。我们需要使用镜像来创建我们的容器,容器是一个相对隔离的东西,那么有时候,我们希望在容器里面的一些操作可以被我们持久化到我们的本地。因此此时一个容器,我们还是可以看做一个虚拟操作系统的,我们可以运行这个容器,也可以到容器里面操作,但是我们还希望有时候容器里面的一些数据也可和我们本地的计算进进行一个保存。
那么数据卷其实就相当于我们本地计算机和容器之间的一个映射,那么这样做有啥好处嘛?首先肯定是保存数据,那么第二其实也是方便我们直接做一些修改。比如我们部署了一个nginx的容器,现在要修改里面的配置文件,我们可以进入到容器里面进行修改,但是这样做的其实还是比较麻烦的,也可以做一个映射,我们在我们的宿主电脑上直接修改配置文件。
所以: 数据卷(volume)是一个虚拟目录,指向宿主机文件系统中的某个目录
那么这个在文章下面关于容器的操作当中会进行描述,因为这个显然和我们容器是相关的。
虚拟网络
是的和虚拟机一样,docker也是支持虚拟网络的。 docker 使用linux 桥接,在宿主机虚拟一个docker 容器网桥(docker0) ,docker 启动一个容器时会根据docker 网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker 网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的 Container-IP 直接通信。 docker 网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法直接通过Container-IP 访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主机(端口映射),即 docker run 创建容器时候,通过 -p 或者 -P 参数来启用。访问容器的时候,就通过 [宿主机IP]:[映射端口] 访问容器。
docker run -itd --name=为容器指定名称 -p 宿主机端口:容器端口 镜像名称
这里的话我就不展开了,其实也挺复杂的,我用的挺少的,当然我的开发水平也就这样,接触的不多,我顶多就是部署一下环境,部署一下java应用,部署一下pytorch 写的dome,或者跑跑智能计算的benchmark。
镜像操作
镜像名称
镜名称一般分两部分组成:[repository]:[tag]。
在没有指定tag时,默认是latest,代表最新版本的镜像
mysql就是repository,5.7就是tag,合一起就是镜像名称,代表5.7版本的MySQL镜像。
镜像命令
镜像之间的操作如图所示:
对于这些指令的话,我们直接通过--help可以看到如何用,以save指令为例子:
docker save --help
那么这里可能用的比较频繁的指令有:
docker pull 镜像名:(拉取镜像,在线) docker load -i 镜像压缩包 docker save -o [保存的目标文件名称] [镜像名称] docker images 查看拉取到的镜像 docker rmi 镜像名:版本号 (删除镜像)
容器操作
基本操作
那么说了有关于镜像的操作,我们来看到关于容器的操作,他们的之间的关系如图:
首先的话我们的容器有几个基本的状态。
运行:进程正常运行
暂停:进程暂停,CPU不再运行,并不释放内存
停止:进程终止,回收进程占用的内存、CPU等资源
此外:
docker run:创建并运行一个容器,处于运行状态
docker pause:让一个运行的容器暂停
docker unpause:让一个容器从暂停状态恢复运行
docker stop:停止一个运行的容器
docker start:让一个停止的容器再次运行
docker ps -a 查看所有容器
docker container -ls / docker ps -n x 查看在运行的容器
docker rm:删除一个容器
容器创建
那么之后我们来看到我们关于容器的一个重点,那就是我们如何通过镜像来创建我们的容器。
那么这里的话,我们直接以一段命令来解释: (安装ElasticSearch)
命令解释:
数据卷操作
okey,我们现在来说一下这个数据卷,前面我们有说到数据卷是啥,并且在容器的创建当中我们通过-v指令其实也是
数据卷操作的基本语法如下:
docker volume [COMMAND]
docker volume命令是数据卷操作,根据命令后跟随的command来确定下一步的操作:
create 创建一个volume
inspect 显示一个或多个volume的信息
ls 列出所有的volume
prune 删除未使用的volume
rm 删除一个或多个指定的volume
创建和查看数据卷
需求:创建一个数据卷,并查看数据卷在宿主机的目录位置
创建数据卷
docker volume create html
查看所有数据
docker volume ls
查看数据卷详细信息卷
docker volume inspect html
其他指令
数据卷操作:
- docker volume create:创建数据卷 - docker volume ls:查看所有数据卷 - docker volume inspect:查看数据卷详细信息,包括关联的宿主机目录位置 - docker volume rm:删除指定数据卷 - docker volume prune:删除所有未使用的数据卷
创建使用实例:
$ docker volume create hello
hello
$ docker run -d -v hello:/world busybox ls /world
当然这些其实都是最基本的用法,后面其实还有如何自己做一个镜像,如何拉取私服镜像等等。不过这件事情如果按照职责划分的话,应该算是运维干的事情。我们只是用一用,能够完成需求就可以,精力充沛的可以直接去看docker开发手册。