❤️ 专栏简介 :本专栏我们会从最基础的内容开始学习Docker的相关内容,循序渐进的掌握Docker知识并进行实战。
☀️ 专栏适用人群 :适用于具备基础 Linux 知识的 Docker 初学者,当然希望各位有经验的docker开发者不吝赐教。
专栏说明 :如果文章知识点有错误的地方,欢迎大家随时在文章下面评论,我会第一时间改正。让我们一起学习,一起进步。
专栏地址:https://blog.csdn.net/anchenliang_1002/category_11878561.html
在这一节中我们会学习Docker容器的相关管理操作,包括运行出容器
,容器的参数
,停止容器
,查看容器日志
,进入正在运行的容器
,容器端口映射
,提交容器等操作
;
docker run
:容器的创建+启动
docker run 镜像名,如果镜像不存在本地,则会在线去下载该镜像
另外关于容器,需要注意两点:
1、容器内的进程必须处于前台运行状态,否则容器就会直接退出
如果我们自己部署一个容器,运行相关命令,则命令不得后台运行,前台运行即可。
2、如果容器内,什么事也没做,容器也会挂掉
即容器内必须有一个进程在前台运行。
首先docker images
查看一下现在设备中的容器:
我们以centos 7.8.2003来演示,首先我们直接运行以下指令来启动容器
docker run afb6fca791e0
回车,你会发现终端里什么都没有,我们多运行几次:
这里我们运行了三次,可以看到在终端上,运行完该指令,终端上啥都没有;我们docker ps
看一下,会发现也是没有容器在运行:
这是因为我们刚刚执行的centos容器,都挂掉了,虽然我们在终端里什么都没看到,但并不是代表容器没有被运行,而只是运行了但是挂掉了;为什么会挂掉呢?就是因为我们虽然运行了容器,但是在容器里并没有任何操作,所以容器挂掉了;记住,我们执行一次docker run
,就会生成一条容器记录,那容器记录在哪里看呢?指令是 docker ps -a
,如下图:
我们可以看到,频繁生成了3条容器的执行记录,且每条记录中的容器id是不同的,说明每次都是独立的容器。
所以,docker run centos:1.8.2003
这种写法会产生多条独立的容器记录,且容器内没有程序在跑,因此容器挂了。
这次我们运行centos容器,并且进入容器内,并在容器内执行某个命令,指令如下:
docker run -it centos:7.8.2003 bash
这条执行的意思是进入centos:7.8.2003并执行bash
指令。进入后我们可以执行各种指令了,比如查看系统的版本等;然后exit可以退出,如下图:
又或者,我们运行centos容器,并使其在里面运行ping baidu.com
指令:
可以看到,直接在容器里面运行ping baidu.com
指令了。
这属于前台运行,会卡主一个终端,此时我们的终端就在运行ping baidu.com,并且只能运行这个,不能干别的,如果想要干别的就得ctrl+c停掉该指令,这就是前台运行。
如果ctrl+c停止后,该容器也就挂掉了,因为ping baidu.com
被终止,则容器内没有指令运行了,容器当然也就挂了。
当然该指令不加-it也是可以的,因为我们并不需要交互,只需要让其运行指令,如下:
-d 参数:让容器在后台(宿主机的后台)运行
相对于1.3容器运行在宿主机前台的情况,这个-d
参数是使容器运行在宿主机的后台;当然了,容器里的进程还是跑在容器的前台的。
例如,还是1.3中的例子,运行centos镜像并跑一个ping baidu.com
的程序,但是此次我们加一个-d
的参数,
docker run -d centos:7.8.2003 ping baidu.com
可以看到,该指令返回了一个容器id给我们,此时我们docker ps
看一下
可以看到有个id为7d958ffd82d8
的容器在运行;它基于的镜像是centos:7.8.2003;COMMAND表示这个容器里正在运行ping baidu.com
这个指令;创建时间是一分钟之前;状态是运行了一分钟了;PORTS代表该容器有没有端口映射;NAMES是容器的名字。
-d参数
: 在宿主机后台运行容器
--rm参数
:删除容器运行记录
--name
:给容器起个名字
前面写了每次docker ps -a可以查看容器运行的记录,但是有时候我们需要在容器中调试某些命令等,不想每次都生成容器记录,就可以使用--rm
参数,例如
docker run -d --rm --name test_acl centos:7.8.2003 ping baidu.com
这条指令意思是在宿主机的后台运行centos镜像,并在容器内执行ping baidu.com
指令,当该指令停止后,容器也就会挂掉;--rm
就是当容器挂掉是,自动删除该容器运行记录;--name
参数表示给容器起了个名字叫test_acl。我们看一下运行结果:
可以看到我们新运行的容器,名字为test_acl;此时我们docker stop
停止刚刚生成的test_acl容器,然后再docker ps -a
看一下有没有该容器的记录:
可以看到,容器运行记录里并没有test_acl的记录,因为我们加了--rm
参数,所以容器停止后就自动删除了该容器的运行记录。
docker stop +容器id
停止该容器的运行。
查看某容器的运行日志:
docker logs +容器id
当然我们也可以实时查看容器的日志:
docker logs -f +容器id
此时我们就可以看到终端在实时的刷新容器的日志,就跟tailf
的功能是一样的。
当然也可以利用管道符只查看最后五行日志:
docker logs -f +容器id | tail -5
docker exec -it +容器id bash
此指令可以交互式的进入正在运行的容器内,并执行bash指令,这样我们就可以使用终端命令行了。
演示过程如下:
可以看到执行完exec指令后,进入到了centos容器内部,用ps -ef 查看了一下当前容器内正在运行的进程,可以发现有bash
、ps -ef
以及ping
在执行。然后exit
可以退出。
docker container inspect +容器id
可以查看该容器的详细信息,如下图所示
可以看到返回的是一个json结构的数据,该数据详细的记录了容器的作用、运行状态、存储信息、网络等。
关于端口映射的原理这里不再详细的讲解,如果还有不清楚的可以返回第三节里的第1.2节内容去看:
【Docker-k8s学习和实战】(三)Docker初试:启动第一个docker容器;docker容器的运行、停止、重启以及镜像的删除
还是以nginx为例;
docker run -d --name nginx_acl1 nginx -p 85:80
该指令的意思是后台运行nginx,并把容器命名为nginx_acl1,且端口映射,把宿主机的85端口访问到容器内的80端口:如下图所示
此时,访问宿主机的85端口,就可以访问到容器内的nginx了;
-P参数
:随机端口映射
docker port +容器id
查看该容器内的端口映射关系。
可以看到,nginx容器内,80端口映射到了宿主机的85端口。
提交容器的指令:
docker commit 容器id 新的镜像名
这里我们还是以centos安装vim来演示容器的提交。具体过程是:
先运行基础版的centos:7.8.2003镜像生成容器,在centos容器中安装vim,然后提交该容器生成新的镜像;紧接着验证一下容器是不是提交成功?即下载新的镜像,并运行出新的容器,正常来讲这个新镜像运行出的容器里就已经有vim了。
首先运行centos:7.8.2003基础镜像生成容器,并安装vim:
docker run -it centos:7.8.2003 bash
yum install vim
然后将刚刚安装了vim的centos容器提交生成新的镜像,新镜像命名为chengliang/centos-vim-7.8.2003
:
exit
docker ps -a
docker commit 0d0e7dc3c3f7 chengliang/centos-vim-7.8.2003
可以发现提交成功了;此时docker images
可以看到本地已经有我们新提交的镜像了:
此时我们再去使用这个新的chengliang/centos-vim-7.8.2003
镜像生成容器,再进入容器即可发现里面已经有vim了: