第1节 Docker运行容器的常见用法
docker怎么管理容器的
概述
互联网上的镜像,不需要登入,直接下载,一般公司私有的镜像才需要login后去下载
COMMAND
可以修改为自己希望执行的命令,以及加上ARG也就是跟上参数,但是加的的cli必须是人家容器里有的命令否则无法执行的。比如上图hello-world容器里只有/hello这个命令,其他的红色框框👆里的cil都是没有的, 所有都是报错的。 # 我就想到其实容器里是否可以封装一个busybox呢,哈哈基本很多常用cli就都有了。我觉得还不错~
镜像就是没有boot(内核)的根文件系统+app程序文件(mysql、nginx、等各自的程序包括各自依赖的库)。
下个busybox看看多大是否可以后面集成到我工作中的images里
1、首先hub.docker.com搜索latest
2、然后找哈希值一样的版本号,
有同学问,那你为什么不直接下latest,你猜我为啥
5MB不到,可以接受吧~
alpine举例,说明commond的是前台cli,否则就是运行后即退出
容器运行起来不退出,要求容器运行时对应的COMMAND的是前台执行,而👆/bin/sh是一个后台执行的cli,所以运行后就提出了。类似docker run nginx执行了就是前台占用。
所谓前台执行就是执行后就霸占了前台,而传统systemctl start nginx这种启动方式在容器里就不能使用了,因为后台执行,容器里执行就退出了。
怎么停不掉啊👆,关闭窗口还是up的,因为没有-it交互,你的ctrl c 发不进去👆
加个-d 放后台,但是不会退出,因为用的cli 是前台就行。
--name选项,指定容器NAME
比如指定容器的NAME方便后面,比如容器之间的互访
随机的名字肯定可读性不好👆
-it交互模式进入容器里,看看文件,看看状态等操作
-i是交互,还不够,还需要一个tty接口,类似交换机的vty
-i -t 还不够,还需要交互的sh否则👇
-it 配合什么shell,就是尝试尝试就行了
👆这就进来了
不仅仅有bash也有/bin/sh
只是用了bash交互,run的command还是原来的那个脚本
进来后,
通过👆boot里是空的就知道了,容器用的是宿主的boot(内核),所以这里只是空的。
这个nginx是基于Debian做出来的,Debian系列的典型代表就是ubuntu了,apt就是yum了
安装ps
ps就有了👇
容器里用sed修改为清华源,安装更快,调试更方便
容器安装东西大多数都是调试用的。
sed -i 's|http://deb.debian.org/debian|https://mirrors.tuna.tsinghua.edu.cn/debian|g' /etc/apt/sources.list.d/debian.sources
sed -i 's|http://deb.debian.org/debian-security|https://mirrors.tuna.tsinghua.edu.cn/debian-security|g' /etc/apt/sources.list.d/debian.sources
容器exit就真的将容器退出了,即使容器本来时run起来就前台执行的那种,你用-it bash进去再exit,容器就不再时running了👇
如果不想exit退出的时候把本来应该前台执行的容器退出也可以用ctrl p q 组合键来安全退出,不过此时nginx就不再时前台了,而是后台up了,类似于docker run -d nginx了
上图👆不是nginx这种run起来就up的,一样也会被ctl p q变成后台up👇
这下倒学到了一个让hello-world后台UP的方法,赶紧试试👇,不行人家压根就没有shell,所以无法进去。而有shell的倒是可以用这种方式后台UP着。
run -it用的少,大多数都是exec -it来针对运行中的容器进行交互排错
比如run了一个nginx
发现某个问题,需要进去排错,于是docker exec -it进去
hostname只在容器内部生效,不具备容器互通的功效,只是在容器内部可以拿来本地通信。
通过这个hostname和本机的程序通信
容器运行起来后,退出自动删除,临时测试屁股擦的比较干净
只要容器run完退出的,那么就给你删除
所以,要做守护式容器,就得至少有一个进程是前台永久运行的👆
很多添加前台永久运行的手段:
docker run alpine:3.19.1 tail -f /dev/null
👆上图就是前台运行不会退出,防止被ctrl c退出,于是加一个-d,是先保证一个前台cli再放到后台👇
然后前文也说了,这里也复制过来一并看下👇
怎么停不掉啊👆,因为没有-it交互,你的ctrl c 发不进去👆 放屁-it也不行
关闭窗口也没用
只能docker rm -f了 👇
那么问题来了,
1、docker run alpine tail -f /dev/null 无法ctrl c 中断
2、docker run nginx 为啥可以ctrl c 中断
难道nginx的COMMAND里的也就是xxx.sh里是用了-it的?
不行1:用sh -c 包装也不行,就是不接受ctrl c,不知道为啥
docker run -d nginx -d的后台和nginx的前台
1、-d的后台是docker run 这个命令后台执行
2、nginx容器前台执行,是nginx容器的COMMAND是容器里的cli是在容器里前台
所以要区分开来
一般都是-d 在后台run,服务类的容器肯定要容器里的cmd是前天的。
nginx为例,容器里的cmd是前台执行的,日志(比如访问日志)就是屏幕STDOUT的,docker run -d run在后太后,日志就用cli去看
后台运行-d 的容器log查看也简单docker logs idxxx就行👇
docker logs -f xxx 就很nice
还有传统艺能watch -n xxx
下图是wathc -n 5 docker logs nginx001的效果👇,就是-n 5秒刷一次,也是实时的。
容器的自启动,不是说原来exited,变成了up,而是说up还是up
1、之前学过一个,这是docker 服务重启,容器原本UP的还是UP。
stop 过30s start 都是ok的,就是说容器随docker服务,原来启动的,还是启动的
当然原来是停止的,就不会自启动了。
2、容器服务重启的时候,重启的时候容器的状态是什么 + policy 是什么 ==> 重启引擎后 容器的状态会是什么
no : 退出了不重新UP, 这是默认值,# 重启的时候容器是退出的(不管是异常还是正常),那么重启服务后,容器还是退出,这就是no。
on-failure[:max-retries] : 异常退出就重新UP,尝试N次。 non-zero exit status,这是$? ≠0 的意思,就是异常退出,状态码不等于0。 # 重启前容器是异常退出的,重启服务后,容器就会尝试起来。
always : 无论退出码是什么--也就是不管是正常退出还是异常退出--也就是不管认为退出($?=0)还是异常退出($?≠0)都随宿主机器起来而起来; # 重启服务(啥重启机器,重启机器也是对应到重启docker 引擎,搞搞清楚,讲的什么东西,当然整体还是不错,这里讲的很,不好说什么了)的时候容器不管是怎么退出的,是你重启导致退出还是本来就是认为退出的,重启后都给你起来。 与no相对。
unless-stopped : 重启机器(服务)的时候容器如果是人为退出的,那么启动了就不会给你UP容器,如果容器是异常退出的,比如重启的时候容器还是UP( 那么重启的时候容器就会是异常退出 ),重启后容器就给你UP起来
然后重启机器,此时web003就不会起来了,因为docker run 的是后默认是---restart no的,就是说重启等动作反正导致你退出的,docker引擎起来你容器也不会up的。
通过上面的截图可知web01是--restart always 方式启动的容器
启动后就是👇
所以重启宿主要用--restart always 这种或者至少--restart unless-stoped,而重启docker 服务,原来是up的希望它继续在重启服务后继续up就可以用live-restore配置选项,但该选项也做不到原来退出重启服务后给你起来的,而--restart always就可以👇