从零开始学Docker(二)-- 使用Docker,减少一半工作量!

2,556 阅读9分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第二十一天,点击查看活动详情

📣 大家好,我是Zhan,一名个人练习时长一年半的大二后台练习生🏀

📣 这篇文章是 从零开始学Docker 的第二篇学习笔记📙

📣 如果有不对的地方,欢迎各位指正🙏🏼

📣 与君同舟渡,达岸各自归🌊


👉引言

在上篇文章 从零开始学Docker(一)-- 初识“偷懒神器”中我们初步了解了Docker这个工具,关于它的优点、工作原理、架构以及安装,我们在上文中都讲解了,那么本文我们正式开始使用Docker

本文我们会讲解Docker操作镜像、容器以及数据卷,从这三个方面来讲解如何去使用Docker,帮助我们去快速交付软件,完成环境部署,如果没有安装Docker的环境可以去看我的上一篇文章:从零开始学Docker(一)-- 初识“偷懒神器”


🧊 操作镜像

在了解如何操作镜像之前,我们先了解一下如何去给镜像命名,在了解了镜像的命名之后我们就能快速的定位出镜像的意思:

镜像名称一般分为两部分:[repository]:[tag]

  • Repository:这个表示镜像的类型
  • Tag:指版本号
  • 例如:MySQL:5.7指的就是5.7的MySQL 如果Tag没有指定,代表的就是最新的版本

操作镜像,其实说来说去最基本的就是增删查改,我们就来聊一聊如何增删查改

  1. :新增一个镜像,我们有三种方法:
    1. docker build:自己构建一个镜像
    2. docker pull:从远程镜像托管平台拉取一个镜像
    3. docker load:就像我们的Maven工程一样,我们可以通过一个docker save打包一个镜像为压缩包,然后使用本命令进行加载
  2. :删除一个镜像,我们可以直接docker rmi,也就是remove image
  3. :查询所有存在的镜像,我们可以使用docker images
  4. :如果我们做了修改推送到远程服务器就可以使用docker push
  5. 如果忘记了命令,我们可以使用docker --help查看官方提供的帮助文档

有了基础的命令,我们可以尝试从Docker Hub上拉取一个Nginx镜像练练手

进入网站,我们直接搜索nginx,在这里我们能看到它有哪些的版本tag

然后我们就可以在命令行去拉取镜像,此处没有指定tag,因此使用了最新的版本作为默认的版本(ps:记得检查Docker是否是开的):

此时我们查看我们的所有镜像,就能看到:

然后我们这里再去试一下docker savedocker load命令:

  • docker save -o 输出文件名 IMAGE,此处的IMAGE就是镜像名称repository:tag
  • 示例:docker save -o nginx.tar nginx:latest
  • docker load -i 文件名
  • 示例:docker load -i nginx.tar


📦 操作容器

我们刚刚学习了镜像的常见命令,并做了从DockerHub拉取了一个镜像的演示,那么如何基于这个镜像创建容器,完成容器的各种操作,我们一起来看看:

操作容器就是让容器的状态发生改变,而容器的状态无非四种:未创建、运行中、暂停、停止

  1. 未创建:在我们拉取镜像或者创建镜像后,是没有基于这个镜像创建容器的,我们基于这个镜像创建容器的方法就是:docker run
  2. 运行中:在我们执行完docker run后,基于这个镜像的容器就产生了
  3. 暂停:在运行中的容器我们使用docker pause,将会处于暂停状态,使用docker unpause,就回归于运行中状态
  4. 停止:在运行中的容器我们使用docker stop,将会处于暂停状态,使用docker start,就回归于运行中状态

这里的暂停停止听起来很像,但实际上它们造成的效果并不一样:

他们的差别主要在于操作系统的处理方式: 暂停:会将容器内的进程挂起,内存暂存,CPU不执行这个进程 停止:会把容器的进程杀死,内存回收,留下来的只剩文件系统里的静态资源


那我们首先演示一下如何去使用上面的五个命令,进行状态的转换:

  1. docker run:我们以一个例子来作具体的分析:
    1. docker run --name myNginx -p 80:80 -d nginx
    2. --name:表示这个容器的名字
    3. -p port1:port2:其中port1是服务器本来的端口,port2是这个容器的端口,在最开始的时候我们就讲到,容器是处于隔离状态的,这个意思就是可以允许服务器的port1端口的请求,映射到容器的port2端口
    4. -d:表示后台运行
    5. nginx:镜像名称,由于我们之前安装的是最新版,因此省略了版本号

既然容器有这四种状态,我们查看容器的状态的方式就是:docker ps,有点类似于Linux的命令,我们看到的信息为:

还有三个容器的命令:

  1. docker logs:我们可以查看容器的运行日志,方便我们监视运行状况
  2. docker exec:进入容器执行命令,相当于进入了容器这个内置系统,有点类似于进入MySQL
  3. docker rm:这里不是rmi,这里是删除容器的指令,会把硬盘上的文件系统也清除

基于Nginx镜像的容器以及创建好并运行起来了,我们应该去哪修改它的配置文件呢?

那么想要找到它的配置文件,我们首先就需要进入这个容器内部:

  • docker exec -it myNginx bash
  • -it:表示给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互
  • myNginx:容器的名称
  • bash:进入容器后执行的命令,bash是一个linux终端交互命令

进来之后我们会发现,里面就是一个阉割版的Linux系统:

那么我们要去找Nginx的配置文件,我们是肯定不知道在哪的,但是创建这个镜像的作者一定是知道在哪的,因此从哪里来,我们又回到Docker Hub,找到How to use this image,然后我们就能找到的它的静态资源、配置文件的具体位置了……

此处我们找到访问的index.html页面的目录为/usr/share/nginx/html/index.html,我想修改一下这个页面,但是发现:

也就是说,这些命令在这个阉割的Linux系统中并不能使用,那么我们如何去修改这些配置文件呢?这就涉及到操作数据卷了,我们下面来讲解


🧵 操作数据卷

正如我们刚刚讨论,我们其实不难发现数据是与容器耦合在一起的,给我们带来了一些问题:

  1. 不便于修改:如果我们需要进行修改就需要使用docker exec进入容器内部去
  2. 数据不可复用:对容器内的所有修改都对外不可见,在容器内进行了修改,如果我们想要创建一个相同的容器,就需要把这些修改操作重复做一遍
  3. 升级维护困难:数据存在容器里面,如果我们需要升级镜像版本,那么肯定需要删除原有的容器,那么所有的数据也会跟着删除

因此,我们就引入了数据卷:一个虚拟目录,指向宿主机文件系统的某个目录。简单来说就是一个映射关系,把Docker中的文件放在服务器主机中映射过去:

var/lib/docker/volums/html的修改,会直接影响到Docker容器中,这样我们编辑就可以使用那些高级文本编辑器,然后数据的复用,可以两个容器指向一份配置,然后数据是独立于容器的,因此升级迭代也方便~


接下来我们就来看看如何操作数据卷,也就是数据卷相关指令:

  • docker volumn create 数据卷名:创建一个数据卷
  • docker volumn inspect 数据卷名:显示一个或者多个数据卷的信息
  • docker volumn ls:列出所有的数据卷
  • docker volumn prune:删除未使用的数据卷,可能有数据卷创建了但是未使用
  • docker volumn rm 数据卷名:删除一个或者多个指定的数据卷

上一步只是创建了一个新的数据卷名,但是并没有使用这个数据卷,或者说进行数据卷的挂载,接下来学习一下如何形成两个文件之前的映射:

我们可以在创建容器的时候就指定数据卷,也就是映射关系,我们先回顾一下创建容器的命令:docker run --name myNginx -p 80:80 -d nginx,实际上有一个参数是我们最开始没有讲的-v,我们可以使用如下的命令:

docker run --name myNginx -v html:/usr/share/nginx/html -p 80:80 -d nginx

这时我们就把数据卷与容器中的/usr/share/nginx/html文件夹挂载了,我们可以来到/var/lib/docker/volums/html/_data找到这个文件夹中的信息:


💬 总结

本文讲述了如何去操作镜像、容器、数据卷这三个重要成分,Docker的操作大多都是操作这三个,这样我们的知识从昨天的仅限于理论,到今天可以完成开发,有了很大的进步

  • 对于操作镜像:我们了解了镜像的命名规范增删查改指令
  • 对于操作容器:有了镜像之后我们就要基于镜像创建一个容器,这里讲解了容器的四种状态,以及转换状态的命令,并进入到容器中,发现是一个阉割版的Linux系统
  • 对于操作数据卷:由于把数据存放在容器中的耦合有我们所说的三个问题,因此有了数据卷帮助我们解决问题,这里我们学习的数据卷的增删查改指令挂载

相信读完今天的文章,大家能对Docker的使用、开发有了不错的了解~


🍁 友链


✒写在最后

都看到这里啦~,给个点赞再走呗~,也欢迎各位大佬指正以及补充,在评论区一起交流,共同进步!也欢迎加微信一起交流:Goldfish7710。咱们明天见~