前言
目前正在出一个Docker
系列教程, 篇幅会较多, 喜欢的话,给个关注❤️ ~
Docker
大家应该都听说过,特别是在当今云原生爆火的时代,更值得我们去学习,下面会带大家系统性的认识一下Docker
,并结合一些例子,让大家快速上手~
好了, 废话不多说直接开整吧~
TAG 标记镜像
有时候,我们需要将镜像进行归档,可以使用tag
命令
语法:
shell
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
示例:
shell
[root@iZ2ze5vrnucj8nu52fq932Z ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/hello-world latest feb5d9fea6a5 2 years ago 13.3 kB
[root@iZ2ze5vrnucj8nu52fq932Z ~]# docker tag feb5d9fea6a5 hello-world:test
[root@iZ2ze5vrnucj8nu52fq932Z ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world test feb5d9fea6a5 2 years ago 13.3 kB
[root@iZ2ze5vrnucj8nu52fq932Z ~]#
这里的SOURCE_IMAGE
也可以使用image id
替换,效果是一样的,因为有时候镜像的名字可能很长,会显得很冗长
history 查看镜像历史
用来查看某一个镜像的创建历史,也就是镜像的提交记录
语法:
shell
docker history [OPTIONS] IMAGE
示例:
shell
[root@iZ2ze5vrnucj8nu52fq932Z ~]# docker history -H=true hello-world
IMAGE CREATED CREATED BY SIZE COMMENT
feb5d9fea6a5 2 years ago /bin/sh -c #(nop) CMD ["/hello"] 0 B
<missing> 2 years ago /bin/sh -c #(nop) COPY file:50563a97010fd7... 13.3 kB
[root@iZ2ze5vrnucj8nu52fq932Z ~]#
-H
: 已可读的格式打印日期和大小,默认为true
save & 将镜像打包成文件
save
命令可以把一个镜像或多个镜像打包到一个文件中,包含镜像的所有信息
语法:
shell
docker save [OPTIONS] IMAGE [IMAGE...]
示例:
shell
[root@iZ2ze5vrnucj8nu52fq932Z ~]# docker save hello-world > hello-world-docker.tar
[root@iZ2ze5vrnucj8nu52fq932Z ~]# ls
hello-world-docker.tar
[root@iZ2ze5vrnucj8nu52fq932Z ~]#
- 这里的
>
也可以替换成-o
,效果是一样的
感兴趣的小伙伴可以解包看看有啥内容~
load & 从指定文件中加载镜像
从指定文件中加载镜像,该文件需要是save
命令保存的文件
语法:
shell
docker load [OPTIONS]
-i
: 指定文件的路径-q
:安静模式输出
示例:
shell
[root@iZ2ze5vrnucj8nu52fq932Z ~]# docker load -i hello-world-docker.tar -q
Loaded image: hello-world:test
[root@iZ2ze5vrnucj8nu52fq932Z ~]#
容器相关命令
run & 创建一个容器并运行
创建一个容器并运行,如果创建容器的镜像不存在则会从远程镜像仓库
下载,运行容器的同时还能给容器发送一个命令
语法:
shell
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
介绍一下相关的参数:
OPTIONS
:可选参数IMAGE
:镜像COMMAND
:需要运行的命令ARG
:命令的参数
OPTIONS
的常用值:
这里只选常用的一些参数,大家也可以使用docker run ---help
可以查看run
命令的所有可用参数
-i
: 以交互模式运行,通常与-t一起使用-t
: 为容器分配一个伪终端,通常与-i一起使用-d
: 后台模式运行容器,并返回容器id-p list
: 指定端口映射,格式为宿主机端口:容器端口-P
: 随机分配端口映射---name string
: 给容器指定一个名称-m bytes
: 限制容器可以使用的内存大小,单位可选b、k、m、g-v list
: 把宿主机的磁盘路径挂载到容器的某个路径---volumes-from list
: 绑定别的容器某个路径到此容器的某个路径-w
: 指定容器的工作目录,默认是根目录---rm
: 当容器停止运行时自动删除---hostname string
: 指定容器的主机名
示例:
shell
docker run -it -d ---name my-app -p 8888:8080 -v /logs/:/logs/ -m 500M my-app
上述示例(假设这个镜像存在,是一个web服务的镜像,大家不要直接拿过去就执行~),使用了my-app
镜像创建并运行了my-app
容器,并映射到了主机端口8888
,挂载了主机目录/logs/
,限制内存大小为500M
,并且在后台运行
这里可以理解为linux中的nohup
,如果不指定-d
,容器运行的时候不会退出终端,如果强行退出,容器也会随之停止,指定了,容器就可以在后台运行,一般部署服务的时候都会指定-d
start & 启动容器
可以启动一个或多个已经停止的容器
语法:
shell
docker start [OPTIONS] CONTAINER [CONTAINER...]
这里的CONTAINER
可以是指定的container name
也可以是container id
-a
: 将容器的标准输出或标准错误附加到终端-i
: 为容器附加一个标准输入终端
示例:
shell
[root@iZ2ze5vrnucj8nu52fq932Z ~]# docker start 3f2d1dd782f1 -a
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
[root@iZ2ze5vrnucj8nu52fq932Z ~]#
上述示例运行了已经停止的hello-world
的容器,并向终端输出了相关日志
restart && 重启容器
可以对一个或多个容器进行重启。如果容器是未启动的则会启动,如果是正在运行中的,则会重启
语法
shell
docker restart [OPTIONS] CONTAINER [CONTAINER...]
CONTAINER
:容器
OPTIONS
:可选参数:
-t int
: 在重启之前等待几秒,默认10秒
示例:
shell
[root@iZ2ze5vrnucj8nu52fq932Z ~]# docker restart -t 3 3f2d1dd782f1
3f2d1dd782f1
[root@iZ2ze5vrnucj8nu52fq932Z ~]#
上述示例在3
秒之后重启hello-world
容器
stop & 停止容器
可以停止一个或多个正在运行的容器
kill
命令也可以用来停止容器,不同的是stop
命令允许容器在停止之前有一定的时间来进行额外操作,如释放链接、关闭请求等 kill
命令则会直接强制杀死容器
语法
shell
docker stop [OPTIONS] CONTAINER [CONTAINER...]
OPTIONS
的常用值:
-t int
: 等待n秒后如果还没停止,直接杀死,默认10秒
示例:
shell
[root@iZ2ze5vrnucj8nu52fq932Z ~]# docker stop -t 3 3f2d1dd782f1
3f2d1dd782f1
[root@iZ2ze5vrnucj8nu52fq932Z ~]#
上述示例,3秒之后停止容器
kill & 杀死容器
杀死一个或多个正在运行的容器
语法
shell
docker kill [OPTIONS] CONTAINER [CONTAINER...]
OPTIONS
的常用值:
-s string
: 给容器发送一个信号,信号编号和linux
原生命令kill
的信号编号一致,默认值9,下文列出一些常用值
-s
参数信号编号常用值:
shell
1:杀死并重新加载,也可用HUP表示
9:强制杀死,也可用KILL表示,默认值
15:正常停止,也可用TERM表示
示例:
shell
docker kill -s 9 3f2d1dd782f1
ps & 查看容器列表
前边学习了运行,停止等命令,那如何判断一个容器是否已经被停止了或者正在运行呢,或者查看所有的容器信息呢。
使用ps
命令,可以列出所有容器的列表,查看容器的基本信息。不加任何参数的情况下,默认只展示正在运行的容器
语法:
shell
docker ps [OPTIONS]
OPTIONS
的常用值:
-a
: 显示所有容器,默认只显示正在运行的-f filter
: 根据条件过滤容器,过滤条件详见下文-n int
:显示最后创建的n个容器,包含所有状态-l
: 显示最新创建的容器,包含所有状态-q
: 只显示容器id-s
: 显示容器大小,默认不显示该列---no-trunc
:显示内容不截断,默认情况下显示的容器是截断后的信息
-f
参数表示根据条件过滤搜索出来的镜像,语法如下
shell
docker ps -f KEY=VALUE
KEY的可选值如下:
id
: 根据容器id过滤name
: 查看容器名称中包含给定字段的容器exited
: 根据容器退出的错误码进行过滤status
: 根据容器的状态进行过滤,状态可选值有:created、paused、exited、dead、running、restarting、removingbefore
: 只显示在某个容器之前创建的容器since
: 只显示在某个容器之后创建的容器volume
: 过滤绑定了某个目录的容器,只针对运行中的容器publish
: 根据宿主机端口过滤,只针对运行中的容器expose
: 根据容器端口过滤,只针对运行中的容器
示例:
shell
[root@iZ2ze5vrnucj8nu52fq932Z ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3f2d1dd782f1 hello-world "/hello" 7 days ago Exited (0) 13 minutes ago clever_mcnulty
[root@iZ2ze5vrnucj8nu52fq932Z ~]#
列含义如下 :
shell
CONTAINER ID | IMAGE | COMMAND | CREATED | PORTS | NAMES |
容器id | 对应的镜像 | 容器启动时运行的命令 | 创建时间 | 绑定的的端口 | 容器名称 |
学到这里, 基本命令够用了,使用上应该不会有太大问题,大家可以尝试部署一下nginx,redis
之类的第三方镜像了~
总之,多去尝试,没有那么难~
结束语
本节到这里就结束了,docker
命令很多,大家不要去背,如果忘了可以使用docker -h
进行查看,多动手,多尝试,多踩坑,下节继续给大家讲解它的用法~
本着把自己知道的都告诉大家,如果本文对有所帮助,点赞+关注
鼓励一下呗~
Docker教程相关文章
往前Shell脚本编程相关文章
- 一起来学Shell脚本编程(一)
- 一起来学Shell脚本编程(二)
- 一起来学Shell脚本编程(三)
- 一起来学Shell脚本编程(四)
- 一起来学Shell脚本编程(五)
- 一起来学Shell脚本编程(六)
- 一起来学Shell脚本编程(七)
往期Linux相关文章
- 一起来学Linux命令(一)
- 一起来学Linux命令(二)
- 一起来学Linux命令(三)
- 一起来学Linux命令(四)
- 一起来学Linux命令(五)
- 一起来学Linux命令(六)
- 一起来学Linux命令(七)
- 一起来学Linux命令(八)
- 一起来学Linux命令(九)
- 一起来学Linux命令(十)
往期面试题相关文章
- 查漏补缺第一期(Redis相关)
- 查漏补缺第二期(synchronized & 锁升级)
- 查漏补缺第三期(分布式事务相关)
- 查漏补缺第四期(Mysql相关)
- 查漏补缺第五期(HashMap & ConcurrentHashMap)
- 查漏补缺第六期(京东一面)
- 查漏补缺第七期(美团到店一面)
- 查漏补缺第八期(阿里一面)
- 查漏补缺第九期(阿里二面)
- 查漏补缺第十期(网易实习一面)
- 查漏补缺第十一期(网易实习二面)
- 查漏补缺第十二期(网易实习三面)
- 查漏补缺第十三期(滴滴实习一面)
- 查漏补缺第十四期(滴滴实习二面)
- 查漏补缺第十五期(华为一面)
- 查漏补缺第十六期(华为二面)
- 查漏补缺第十七期(华为三面)
- 查漏补缺第十八期(你了解class文件吗)
项目源码(源码已更新 欢迎star⭐️)
往期设计模式相关文章
- 一起来学设计模式之认识设计模式
- 一起来学设计模式之单例模式
- 一起来学设计模式之工厂模式
- 一起来学设计模式之建造者模式
- 一起来学设计模式之原型模式
- 一起来学设计模式之适配器模式
- 一起来学设计模式之桥接模式
- 一起来学设计模式之组合模式
- 一起来学设计模式之装饰器模式
- 一起来学设计模式之外观模式
- 一起来学设计模式之享元模式
- 一起来学设计模式之代理模式
- 一起来学设计模式之责任链模式
- 一起来学设计模式之命令模式
- 一起来学设计模式之解释器模式
- 一起来学设计模式之迭代器模式
- 一起来学设计模式之中介者模式
- 一起来学设计模式之备忘录模式
- 一起来学设计模式之观察者模式
- 一起来学设计模式之状态模式
- 一起来学设计模式之策略模式
- 一起来学设计模式之模板方法模式
- 一起来学设计模式之访问者模式
- 一起来学设计模式之依赖注入模式
设计模式项目源码(源码已更新 欢迎star⭐️)
Kafka 专题学习
- 一起来学kafka之Kafka集群搭建
- 一起来学kafka之整合SpringBoot基本使用
- 一起来学kafka之整合SpringBoot深入使用(一)
- 一起来学kafka之整合SpringBoot深入使用(二)
- 一起来学kafka之整合SpringBoot深入使用(三)
项目源码(源码已更新 欢迎star⭐️)
ElasticSearch 专题学习
项目源码(源码已更新 欢迎star⭐️)
往期并发编程内容推荐
- Java多线程专题之线程与进程概述
- Java多线程专题之线程类和接口入门
- Java多线程专题之进阶学习Thread(含源码分析)
- Java多线程专题之Callable、Future与FutureTask(含源码分析)
- 面试官: 有了解过线程组和线程优先级吗
- 面试官: 说一下线程的生命周期过程
- 面试官: 说一下线程间的通信
- 面试官: 说一下Java的共享内存模型
- 面试官: 有了解过指令重排吗,什么是happens-before
- 面试官: 有了解过volatile关键字吗 说说看
- 面试官: 有了解过Synchronized吗 说说看
- Java多线程专题之Lock锁的使用
- 面试官: 有了解过ReentrantLock的底层实现吗?说说看
- 面试官: 有了解过CAS和原子操作吗?说说看
- Java多线程专题之线程池的基本使用
- 面试官: 有了解过线程池的工作原理吗?说说看
- 面试官: 线程池是如何做到线程复用的?有了解过吗,说说看
- 面试官: 阻塞队列有了解过吗?说说看
- 面试官: 阻塞队列的底层实现有了解过吗? 说说看
- 面试官: 同步容器和并发容器有用过吗? 说说看
- 面试官: CopyOnWrite容器有了解过吗? 说说看
- 面试官: Semaphore在项目中有使用过吗?说说看(源码剖析)
- 面试官: Exchanger在项目中有使用过吗?说说看(源码剖析)
- 面试官: CountDownLatch有了解过吗?说说看(源码剖析)
- 面试官: CyclicBarrier有了解过吗?说说看(源码剖析)
- 面试官: Phaser有了解过吗?说说看
- 面试官: Fork/Join 有了解过吗?说说看(含源码分析)
- 面试官: Stream并行流有了解过吗?说说看