Docker学习相关视频笔记(二)

发布于:2025-07-30 ⋅ 阅读:(16) ⋅ 点赞:(0)

参考视频地址:40分钟的Docker实战攻略,一期视频精通Docker。感谢作者的辛苦付出。
本文是Docker学习相关视频笔记(一)的后续

4、Docker命令

4.3 docker run 和docker ps

docker run使用镜像创建并运行容器,这是本期视频最重要的命令了,run后面可以接一个镜像的名字,或者接一个镜像的id,就像我们视频开头提到的,用模具做糕点的例子,这一步就是使用镜像创建一个容器,正如我们使用模具制作一个糕点。这样回车运行。这样我们就把容器启动起来了。
在这里插入图片描述
然后我新开一个窗口二,我们可以执行这个命令

docker ps

PS也就是process status的缩写,查看进程状况,这个是一个LINUX上的经典命令,这个概念也被继承到docker里面,表示查看正在运行的容器。
在这里插入图片描述
在这里有几个需要注意的,第一列container id容器的id,每创建一个容器就会自动分配一个唯一的id,接下来image就是基于哪个镜像创建出来的,对应视频开头的例子,就是这个糕点是用哪个模具制作出来的。最后一个叫做names,也就是容器的名字。我们使用docker run命令的时候,如果没有手动设置名字
,系统会自动分配一个随机的名字给它。
我们再回到窗口一,看到这里一直在刷日志,而且这个窗口已经被占用住了,没法做别的操作了,
在这里插入图片描述

所以一种更常见的启动方式是,在docker run命令后面接一个-d,这里的d表示detached mode,也就是分离模式,表示让容器在后台执行,不会阻塞当前的窗口,这里控制台只打印了一个容器id,后续容器的日志不会打印在控制台,也不会阻塞控制台的使用。
在这里插入图片描述
我们还是可以使用docker ps命令,查看正在运行的容容器,我们注意到docker ps命令显示的容器id比较短,刚才那一串很长,这个短id其实是把长id截取了前面几位,但是它们的功能是一样的
在这里插入图片描述
在上面的例子里,我们先用docker pull下载镜像,然后使用docker run创建并且运行容器,其实第一步里的docker pull可以省略,我们可以直接使用docker run命令,如果docker发现本地不存在镜像,它会先自动拉取一份,然后再创建并且运行容器。
在这里插入图片描述
我们来看docker run的一个重要参数,杠P杠P的作用是端口映射,
在这里插入图片描述
每个docker容器都运行在一个独立的虚拟环境里面,容器的网络与宿主机是隔离的,默认情况下,并不能直接从宿主机访问到docker的内部网络,比如我在宿主机上直接安装一个Nginx,在浏览器输入local host:80,就能访问到这个NGinx提供的网页,
在这里插入图片描述
但是我使用docker来启动Nginx,在浏览器输入localhost:80则无法访问到对应的网页,因为容器内的网络与宿主机的网络是隔离的,这时候我们需要添加一个启动参数,把容器内的端口与宿主机的端口进行一个映射,或者说绑定我们可以添加这个-p参数,在冒号前后各填写一个端口,
在这里插入图片描述
冒号前面是宿主机的端口,冒号后面是容器内的端口,顺序是先外后内,也就是把宿主机的八零端口,转发到容器内的八零端口进行处理.这样我们在浏览器访问local host80,也就是访问宿主机端口的时候,就等于访问到了容器内的端口,网页也就正确的显示出来了。
在这里插入图片描述
我用我的windows电脑来试一下

docker run -p 80:80 nginx

然后我打开浏览器,输入localhost:80,回车,
在这里插入图片描述
这样就打开了容器内部署的NGinX,
在这里插入图片描述

4.4 挂载卷

与-P绑定端口类似的参数是-V,-P是把宿主机与容器的端口进行绑定,
在这里插入图片描述

-V则是把宿主机与容器的文件目录进行绑定,容器内对这个文件夹的修改,会影响宿主机的文件夹,而在宿主机对文件夹的修改,同样会影响容器内的文件夹,宿主机与容器通过这个目录紧密地联系到了一起,这种目录也被称为是挂载卷。挂载卷的最大作用是数据的持久化保存。
在这里插入图片描述
因为当我们删除容器的时候,容器内的所有数据会被同时删除掉.如果我们使用了挂载券,容器内对应目录的数据,就会保存在宿主机的对应目录里面,这样删除容器的时候,保证了数据不会被删除。相当于把数据做了一个持久化的保存。
在这里插入图片描述

4.4.1 绑定挂载

我们来看一个具体的例子,实战一下刚才那三个重要参数,
docker run
-d表示容器在后台运行,
-p表示把宿主机的端口与容器内的端口做一个绑定,
-v表示把宿主机的目录跟容器内的目录做一个绑定。
我们看到容器内的这个目录一般是nginx。存放静态网页的目录,这里又做了端口映射,我们访问宿主机的80端口,也就等于访问我们容器的80端口,
在这里插入图片描述
这样启动起来,我们试着访问一下宿主机的80端口,这里403
在这里插入图片描述

这里的原因是使用绑定挂载的时候,宿主机的目录会覆盖掉容器内的目录,因为宿主机这边的目录是空的,所以容器内也没有任何的网页,所以访问的时候显示403,我们可以直接修改宿主机的目录,把文件加载宿主机的对应目录,下面就等于修改了容器内的目录.
接下来我们进入宿主机的目录:

cd /website/html

然后我创建一个文件:

sudo vi index.html

在这里插入图片描述

我把一个网页文件的代码粘贴过来,然后ESC冒号WQ叹号回车,
在这里插入图片描述
这样我们再访问一下80端口,可以看到就展现出了一个小网页.
在这里插入图片描述
在刚才的例子里面,直接把宿主机的目录写在了docker run命令里面,这种挂载方式叫做绑定挂载,还有另外一种方式是让docker自动创建一个存储空间,我们为这个存储空间起一个名字,然后挂载的时候直接使用名字就可以了,这种方式叫做命名卷挂载
在这里插入图片描述

4.4.2 命名卷挂载

在开始之前,我们需要先把刚才的容器清理掉,执行这个命令,docker ps 。我们看到这是刚才创建的容器,然后docker rm后面接容器的id表示删除容器,不过删除这种正在运行的容器,我们需要再加一个-f强制删除,这里我再多提一嘴,删除容器docker rm删除镜像docker rmi,回车
在这里插入图片描述
接下来我们使用命令新创建一个挂载卷Docker volume create,后面是卷的名字.这里叫nginx_html,然后我们在docker run的时候,这里就不需要输入目录了,我们直接可以使用挂载券的名字回车,
在这里插入图片描述

在这里插入图片描述
这个挂载卷在宿主机的真实目录是在哪里呢,我们可以这么执行

docker volume inspect nginx_html

后面接挂载卷的名字,回车,这里显示这个名字的挂载卷,它的真实目录是在这里
在这里插入图片描述
不过进入这个目录,我们需要先切换成root用户,这里

sudo -i

切换成root用户,然后进入这个目录,接下来我们看一下index文件,
在这里插入图片描述
看到这里面已经有一些数据了,这个是命名卷的一个特别功能。命名卷第一次使用的时候,docker会把容器的文件夹同步到命名卷里面。进行一个初始化,而绑定挂载就没有这个功能
在这里插入图片描述
我们还是把自己的网页文件替换上。最后保存一下。
在这里插入图片描述
接下来再访问服务器的IP地址。加80端口,就能看见我们创建的网页了。
在这里插入图片描述
命令

docker volume list

可以列出所有创建过的卷,

docker volume remove

可以删除一个卷,
在这里插入图片描述

docker volume prune -a

删除所有没有任何容器在使用的卷,输入Y回车,
在这里插入图片描述

4.5 docker run 其他参数

4.5.1 -e

下一个参数-e用来往容器里面传递环境变量
比如现在我想启动一个MONGODB的容器,MONGODB作为一个数据库使用的时候,一般需要设置账号名密码,所以我们可以像这样使用两个-e参数,把数据库的账号名密码作为环境变量传递进去,这样启动的时候,数据库就会预设上账号名密码。
在这里插入图片描述
启动成功以后,我从这台windows电脑上连接一下我们的数据库,MONGOSH账号名冒号密码,后面是服务器的公网IP地址,接下来端口27017能够成功连接进来。这样账号名密码是生效的,可以成功连接进来。
在这里插入图片描述
如果不清楚容器的环境变量有哪些,我们可以来到docker hub上面搜索一下,比如这里我搜索MONGO这个镜像,
在这里插入图片描述
在下面的文档里就列出了可以传递的环境变量,如果是开源项目的话,我们可以去GITHUB仓库找一下,一般都会有详细的说明.
在这里插入图片描述

4.5.2 --name

我们来看下一个docker run命令,–name,后面可以给容容器起一个自定义的名字。这里要注意的是,这个名字在整个宿主机上必须是唯一的,不能重复,我们来执行一下,然后使用docker ps命令,可以看到正在运行的容器,看到容器names也就是名字,这里变成了我们自定义的那个名字,这个容器的名字跟前面的容器id的功能,是等价的,名字更加方便于记忆,比如现在我要把容器删除掉,我们执行这个命令,docker rm后面接容器的名字就可以了,正在运行的容器需要接一个-f,这样通过名字也成功删除了镜像。
在这里插入图片描述

4.5.3 -it

还有一对重要参数,我们一起来看一下,-it可以让我的控制台进入容器进行交互,–rm指的是当容器停止的时候,就把容器删除掉,这次我用的镜像是alpine,是一个轻量级的LINUX系统,我们来启动一下,看到这样直接进入到了容器内部,然后我们用exit退出以后,这个容器同时被从宿主机上删除了,所以这套命令一般连在一起用,用于临时调试一个容器,
在这里插入图片描述

4.5.4 --restart

最后一个重要参数是–restart,用来配置容器在停止时的重启策略,常用的有–restart always,也就是只要容器停止了。就会立即重启,包含容器,因为内部错误崩溃或者宿主机断电等等的场景。
在这里插入图片描述
还有一个类似的是把always换成unless stopped的,这个跟always非常的相似,有一个关键区别是,手动停止的容器就不会尝试重启了,这对于生产环境非常有用,docker会自动重启,因为意外原因停止的容器,而手动停止的容器就不会再重启了.
在这里插入图片描述

4.6 调试容器

4.6.1 docker start 和docker stop:对原有的容器进行一个启停

我们再来理解一下docker run命令,docker run命令是从镜像创建并且运行容器
在这里插入图片描述
也就意味着我们每次执行docker run,都会创建一个全新的容器,
在这里插入图片描述
如果我们不想创建容器,只想对原有的容器进行一个启停,那可以使用以下两个命令,
在这里插入图片描述
我们先用docker run启动一个MONGODB的容器,接下来使用docker ps命令,可以查看这个正在运行的容器,使用docker stop命令后面接容器的id或者名字,可以停止这个容器的运行,然后再使用docker ps命令,就看不到那个容器了,因为PS命令只能看到正在运行的容器,
在这里插入图片描述
我们可以在PS命令后面加一个-a,-a的意思是all,查看所有的容器,包括正在运行的和已经停止的,可以使用docker start命令后面接容器的id或者名字,把一个容器重新启动起来,这里的status显示六秒之前启动起来了,我们使用stop还有start启停容器的时候,之前写过的端口映射挂载卷,还有环境变量等等的参数,都不需要再重新写一遍了,docker已经为我们记录并且保存下来了,我们只需要重新启动就可以照原样运行.
在这里插入图片描述
如果我们忘记了容器启动时填的参数是什么,可以执行这个命令,docker inspect后面接容器的id,看到docker这里打印了非常长一串,
在这里插入图片描述
但是这种我们也不需要自己分析,直接把它贴给AI就行了,我问AI容器有没有做端口映射,有没有做挂载卷,这里给出了答案,首先做了八零端口的端口映射,同样的也给出了挂载卷的答案,把宿主机的这个目录,挂载到了容器内的这个目录,虽然docker给的信息非常的复杂,但是AI还是能够精准的进行判断,当然这个docker inspect的命令还有很多功能,可以查看很多关于容器的信息,不过这里我就不挨个讲了,感兴趣的话可以多跟AI交流,询问他这些信息都是做什么用的.

4.6.2 docker create

docker create命令与docker run命令非常的类似,唯一点区别是docker create命令只创建容器,但不立即启动,如果想启动的话,还需要输入docker start命令,后面接容器的id就可以了,
在这里插入图片描述

4.6.3 docker logs

docker logs命令后面接容器的id或者名字,可以查看容器的日志
在这里插入图片描述
还有一种更常见的方式,在logs后面加上-f表示滚动查看日志,比如这里我登录一下MONGODB,我们看到后面的日志也同步进行了刷新,
在这里插入图片描述
在这里插入图片描述

4.6.4 docker exec

简单补充下docker的技术原理,docker利用了LINUX内核的两大原功能,实现容器化,

  • Cgroups用来限制和隔离进程的资源使用,可以为每个容器设定CPU内存,网络带宽等资源的使用上限,确保了一个容器的资源消耗,不会影响到宿主机或者其他正在运行的容器器;
  • Name spaces,用来隔离进程的资源视图,name spaces使得容器只能看到自己内部的进程,id网络资源和文件目录,而看不到宿主机的,所以容器本质上还是一个特殊的进程,不过当我们进入到容器内部后,容器内部看起来就像一个独立的操作系统
    在这里插入图片描述
    每个docker容器都是一个独立的运行环境,每个容器内部表现的都像一个独立的LINUX系统,docker exec可以在容器的内部执行LINUX命令
    在这里插入图片描述
    我想进入这个容器,查看一下里面正在运行的进程,我们可以执行这个命令,docker exec后面是容器的id或者名字,最后是你想执行的LINUX命令,这里查看进程一般是ps -ef,回车,这样就看到了容器里面的进程情况,因为容器内进行了资源视图的隔离,所以这里看不到宿主机的进程。
    在这里插入图片描述
    还有一个常用用法,使用这个命令,可以进入一个正在运行的docker容器内部,获得一个交互式的命令行环境,容器内部表现出来的就像一个独立的操作系统,我们可以进入容器内部执行LINUX命令,查看文件系统,管理容器内的进程,或者更加深入地进行调试。
    在这里插入图片描述
    我们先创建并且运行一个Nginx容器,这里做了端口映射,
    在这里插入图片描述
    从浏览器访问服务器的IP地址,就可以看到这个Nginx的网页,
    在这里插入图片描述
    接下来我们进入容器,把这个网页修改一下,docker exec -it 后面是容器的id,这里也可以用这个长id,接下来bin/sh,接下来的所有命令都是在容器内执行的,我们进入到容器内存放静态网页的目录。目录下面有两个网页文件,这里使用vi命令修改一下index,我们看到这里显示找不到vi命令,docker为了尽量压缩镜像的大小,它内部一般是一个极简的操作系统,也就是很多系统工具可能都是缺失的,这时候我们自己来安安装一下就可以了,
    在这里插入图片描述
    在容器内安装软件之前,我们需要先执行这个命令,查一下容器内的LINUX是什么发行版的,我们看到这里写的是Debian的,
    在这里插入图片描述
    Debian安装软件的命令就是apt,先更新一下apt索引,
    在这里插入图片描述
    接下来apt install vim,
    在这里插入图片描述
    接下来使用vi命令修改一下index点HTML,
    在这里插入图片描述

这里改成welcome to tetrp,保存一下。
在这里插入图片描述
再回到浏览器,刷新一下页面,看到网页的标题这里更改过来了。

4.7 Dockerfile

dockerfile是什么,在视频开头的例子里面,容器是用镜像这个模具生产出来的糕点,镜像是制作糕点的模具,而dockerfile就是制作模具的图纸,docker file是一个文件,里面详细的列出了镜像是如何制作的。
在这里插入图片描述
接下来的例子里面,我们使用dockerfile制作一个镜像,并且把它推送到docker hub上面,我们来看这个例子,这是一个非常简单的Python程序,使用fast API创建了一个get接口,它运行在8000端口上面,
在这里插入图片描述
还有一个requirements文件里面,列出了程序的Python依赖,
在这里插入图片描述
我们想在本地把这个代码运行起来,只需要三个步骤,第一步给电脑安装Python环境,第二步安装依赖pip install -r requirements.txt,第三步启动项目Python main.py,然后浏览器访问localhost:8000,打印出了hello world,我们的程序就运行成功了。把这么一个程序打包成docker镜像,原理也差不多。

  • (1)创建dockerfile文件:我们先创建一个dockerfile文件,注意D要大写,而且这个文件没有任何的后缀名,

  • 在这里插入图片描述

  • (2)编辑dockerfile文件
    1、第一行:所有dockerfile第一行都是from,选择一个基础镜像(也就是我们的镜像,从哪个镜像的基础上面构建而来的),我们希望基础镜像里面自带Python,在docker hub上面搜索Python,我选择这个这个基础镜像的LINUX发行版是slim,里面内置了python3.13。对应的FROM python:3.13-slim。
    在这里插入图片描述
    在这里插入图片描述
    2、第二行:这个WORKDIR有点像CD切换到镜像内的一个目录,作为工作目录,后面的命令都是在这个目录下面执行的。
    3、第三行:然后我们使用copy,把我们的代码文件拷贝到镜像内的工作目录,后面写两个点儿,第一个点代表我这台电脑的当前目录,第二个点代表镜像内的当前工作目录,也就是这个斜杠app。
    4、第四行:接下来安装依赖,我们安装依赖的命令就是pip install,在前面加一个大写的run,表示这个命令要在镜像里面执行,
    5、第五行:Expose 8000,这里声明我镜像提供服务的端口是哪个,因为我的fast API启动的时候使用8000端口,这个expose并不是强制的expose,在这里只是做一个声明,给其他使用镜像的人做一个提示,即使不写,对镜像的功能也没有影响,实际使用的时候还是以-P参数为准。
    6、第六行:接下来最后一行,CMD是容器运行时的默认启动命令,也就是每当容器启动的时候,容器内部会自动执行这个命令,使得容器内有一个Python程序在运行命令,最好写成这种数组的形式,中间最好不要用空格,一个docker file文件里面只能写一个CMD,与CMD类似的是entry point,entry point的优先级更高,它不容易被覆盖,
    在这里插入图片描述
    在这里插入图片描述

  • (3)构建镜像:docker file文件准备好以后,我们就可以构建镜像,在当前目录执行docker build,后面-t,-t后面可以给镜像起一个名字,我叫docker_test,名字后面可以加冒号,输入一个版本号,这里也可以省略不写,最后点指的是在当前文件夹构建,这样我们的镜像就构建好了。

  • 在这里插入图片描述
    然后我们可以使用docker run命令,基于这个镜像创建一个容器,并且运行起来.docker run -d,后面-p做一下端口映射,把容器内的8000端口映射到宿主机上,最后是镜像的名字叫docker test,回车
    在这里插入图片描述
    在浏览器还是输入localhost:8000,这样看到了输出结果:
    在这里插入图片描述
    在docker desktop这边,images里面显示了我们构建出来的镜像,
    在这里插入图片描述
    container里面显示了正在运行的容器,
    在这里插入图片描述
    接下来我们把镜像推送到docker hub上面,这里先来到docker hub的首页,没有账号的话,点击signup,注册一个,我选择GITHUB登录,登录完成,给自己起一个用户名,这个就是我们自己在docker hub上面的命名空间,点击sign up。
    我们想把自己的镜像推送到docker hub上面,需要先登录一下,这里输入docker login,这里给了一个英文验证码,还有一个网站,
    在这里插入图片描述
    我们打开这个网站,把验证码填写过来,
    在这里插入图片描述
    回到命令行显示login succeed就成功了,
    在这里插入图片描述
    接下来我们重新打一个镜像,因为我们要推送镜像的时候,必须在前面带上自己的用户名,所以这里我在前面填上自己的用户名回车,
    在这里插入图片描述
    接下来最后一步。Docker push。后面是镜像的名字,注意这里要带着自己的用户名回车,我们看到镜像就推送到了docker hub上面,这是仓库的地址,后面是命名空间,也就是我的用户名,最后是镜像的名字.
    在这里插入图片描述
    推送成功以后,用我的命名空间加镜像的名字,在docker hub上面就能搜索到我们推送上来的镜像,
    在这里插入图片描述
    在这里插入图片描述

其他小伙伴使用docker pull命令,就能下载到这个镜像。
在这里插入图片描述
参考视频地址:40分钟的Docker实战攻略,一期视频精通Docker。感谢作者的辛苦付出。


网站公告

今日签到

点亮在社区的每一天
去签到