Docker学习04-常用命令
0x00 帮助启动类
启动docker:systemctl start docker
停止docker:systemctl stop docker
重启docker:systemctl restart docker
查看docker状态:systemctl status docker
开机自启动:systemctl enable docker
查看docker概要信息:docker info
查看docker总体帮助文档:docker --help //和Linux一样,有问题,问男人 man mkdir之类的
查看docker命令帮助文档:docker 具体命令 --help
如:docker command --help
0x01 镜像命令
01、docker images:列出本地所有镜像
REPOSITORY:表示镜像的仓库源
TAG:镜像的标签,版本号
IMAGE ID:镜像ID
CREATED:镜像创建时间
VIRTUAL SIZE:镜像大小

同一个仓库源可以有多个TAG版本,代表这个仓库员的不同版本,我们使用REPOSITORY:TAG来定义不同的镜像。如果你不指定一个镜像的版本标签,例如你只使用ubuntu,docker将默认使用ubuntu:lastest镜像
docker images -a 列出本地所有镜像(含有历史映像层)
docker images -q 只显示镜像ID
02、docker search:搜寻某个镜像是否在远程仓库

里面有各个不同的组织,一般选第一个就行,点赞数最多,官方的。
docker search redis
docker search --limit redis //只列出N个镜像,默认是前25个
docker search --limit 5 redis //这条命令就足够了,limit和redis的顺序无所谓
03、docker pull:下载镜像
同git pull
docker pull mysql <===> docker pull mysql:lastest //下载最新版mysql
docker pull mysql:5.6 //下载mysql5.6版本
注意,docker pull不能同时拉取,一个一个来,并且无法拉取多个镜像,以后可以写个yml文件,使用docker-compose来拉取多个。
04、docker system df:查看镜像/容器/数据卷所占的空间
其实是类似于Linux的df -h,以human的显示方式查看所占用的空间

05、docker rmi: remove image删除镜像
docker rmi IMAGE ID/REPOSITORY //可以是ID,也可以是名字,建议ID
docker rmi -f ID //强制删除,有时候会报错,因为container在使用这个镜像
docker rmi -f 镜像名1:TAG 镜像名2:TAG //删除多个镜像
docker rmi -f $(docker images -aq) //删除全部镜像,这条命令到公司的生产环境千万不能敲!删库到坐牢!危险!!!!!!
//命令解释:后面的docker images -aq 表示展示出所有的镜像ID,通过$传递给前面的删除命令,类似于mysql的 delete from users where id in(1,2,3,4,5....)

06、docker 虚悬镜像是什么?(面试题)
docker构建的时候,可能会出现问题,即仓库名和标签都是的image,出现了就建议删除。

07、思考
结合Git学习心得,猜想是否有docker commit/docker push???
0x02 容器命令
再次复习docker的理论知识:
docker 并非是一个通用的容器工具,它依赖于已经存在并运行的Linux内核环境。实质上是在已经运行的Linux下制造了一个隔离的文件环境,因此它执行的效率几乎等同于所部署的Linux主机。因此,Docker必须部署在Linux内核系统上,如果其他系统想部署Docker就必须安装一个虚拟Linux环境。
左边的图
因为docker必须建立在Linux内核上,所以我们win10系统会创建一个虚拟机,从而搭建一个centos7。在此基础上我们搭建的docker,在搭建一个超级小的Centos

右边的图
为了防止混淆懵逼,可以看右边的图。Centos7可以被当成阿里云,上面建立了一个Docker,然后再安装精简版的ubuntu
平时搭建环境的时候,都是新建各种虚拟机,一次就得小半天。
当学会了docker后,可以在docker的基础上,新建一些别的虚拟机。
01、docker run
在java和php中,使用new来实例化一个对象,在docker中,使用run
启动交互式容器
重点参数
--name指定名称
-d 后台运行容器并返回容器ID,即启动守护试容器(后台运行)
-i 以交互模式运行容器,通常与-t同时使用,interactive
-t 即Linux的tty,为容器重新分配一个伪输入终端,通常与-i同时使用,即启动交互式容器(前台有伪终端,等待交互,说白了就是等待用户输入命令)
说白了,我们可以直接使用docker run ubuntu,但是这样的结果就是下图,没有任何的其他操作了

如果我们想要对这个ubuntu进行操作,需要一个前台终端,如下
docker run -it ubuntu /bin/bash

相当于跑到集装箱里面干活了,里面没有任何的命令,很正常,它毕竟只是启动了启动ubuntu所需最小的组件,需要别的到时候再装

-P:随机端口映射,大写P,一般不用这个命令
-p:指定端口映射,小写p,一般都是用这个命令
如这张图,大方框是鲸鱼,背上驮着tomcat与redis,那么我们怎么才能访问到里面的各种服务呢?需要做端口映射。左边的6379是centos宿主机的端口,右边即里面各种集装箱服务的端口。
docker run redis -p 6379:6379

docker run -it --name=u4 ubuntu /bin/bash
docker run -it --name=u5 ubuntu /bash
//这两个命令效果一样,但是书写命令时,保证选项在前,镜像名靠后,交互式终端最后

选项说明:PORTS这里是空的,因为ubuntu不需要端口映射
02、docker ps列出所有正在运行的容器

docker ps //罗列正在运行的containers
docker ps -a //罗列历史所有containers,包括删除的,退出停止的
docker ps -l //罗列最近创建的容器
docker ps -n //显示最近N个创建的容器
docker ps -q //静默模式,只显示容器编号

03、退出容器
exit退出并且停止容器运行
ctrl+p+q退出但是不停止容器运行

04、启动、停止运行容器
docker start ID 重启容器
docker stop ID 停止容器
docker kill ID 强制停止容器
启动和停止容器都可以批量操作。

05、删除已经停止容器
docker rmi中的i表示images,去掉i就表示删除容器了
docker rm ID 删除已经停止的容器,无法删除正在运行的
docker stop ID
docker rm -f ID 强制删除正在运行的
06、一次删除多个容器实例(危险命令)
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm //将上一个结果参数,集成在xargs然后执行删除命令,保证删除干净

0x03 重要命令——启动守护式容器
01、守护式进程启动容器
在大部分的场景下,我们希望docker的服务是在后台运行的,我们可以通过-d指定容器的后台运行模式。
docker run -d 镜像名
这里演示一下,可以看到并没有容器启动。所以要养成一个习惯,每次run起来一个容器,一定要使用ps来查看。那么这里为什么没有运行呢?
Docker容器后台运行,就必须要有一个前台进程,容器运行的命令如果不是那些一直挂起的命令(比如运行top、tail),就是会自动退出的。平时我们运行apache或者nignx在后台,他会一直开着等待我们运行他们。但是docker不一样,docker认为我在后台开着,前台没有人用我,没人需要我,我就自杀了。当一个人没有被需要的价值,就会自闭。但是注意,是有些镜像!!不是所有镜像都是如此!!下方的ubuntu和redis就是个对比例子!
docker run -d ubuntu
docker ps
docker run -d redis:6.0.8
docker ps

02、容器日志查看
假设我开的集装箱太多了,我要查看容器怎么办?
Devops工程师职责:编码开发微服务、上线部署容器化、时时刻刻要监控。
docker logs 容器ID
到时候我们学可视化工具,这个命令就不怎么用到了,不过也要会敲!

03、查看容器内运行的进程
docker top 容器ID

04、查看容器内部细节
再次复习理论:可以把容器看作是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
docker inspect 容器ID
05、进入正在运行的容器并以命令行交互
docker exec -it 容器ID /bin/bash
docker exec -d 容器ID //不常用
docker attach 容器ID //不需要输入bin bash
docker exec和docker attach的区别:
docker exec是在容器中打开新的终端,并且可以启动新的进程,用exit退出,不会导致容器的停止。

docker attach直接进入容器启动命令的终端,不会启动新的进程,用exit退出,会导致容器的停止。

下面用redis进行演示的时候我要特殊记一下,因为这个命令更能体现出docker的特点,自己体会吧!

06、从容器中拷贝文件到主机
将docker启动的一个ubuntu主机里面的文件拷贝出来,支持递归复制!
docker cp 容器ID:容器文件绝对路径 主机绝对路径
docker cp

07、导入导出容器
这个就更好理解了,上面的将文件拷贝出来,就是一个简单的文件备份,如果我想要把整个容器全部导出来,全部备份,也是可以的。
同时导出和导入容器可以用来制作属于自己的容器内容。
导出容器:
docker export 容器ID > 名字(自定义).tar //导出容器的内容流作为一个tar归档文件,可以理解成导出一个全新的镜像。导出的路径默认为终端的
cat 文件名.tar | docker import - 镜像用户(自定义)/镜像名(自定义):镜像版本号(自定义) //注意中间有个-,这个-呢,左右两边空格不能省略!!


0x03 小总结
有些不常用的例如暂停啥的,暂不深入。有兴趣可以深入。
