Docker学习笔记:镜像、容器、数据卷
核心概念
- 镜像:一个只读的模板,类似虚拟机的镜像。
- 容器:可以理解为镜像的一个运行实例。运行时类似于沙箱,多个容器互相独立。
- 仓库:存放镜像文件的地方。
镜像
命令表格
| 命令 | 解释 | 选项 |
|---|---|---|
| docker pull NAME[:TAG|@DIGEST] | 拉取镜像 | |
| docker push NAME[:TAG] | 推送镜像 | |
| docker images [REPOSITORY[:TAG]] | 镜像列表 | |
| docker rmi IMAGE [IMAGE...] | 删除镜像,如果有容器正在使用镜像,无法删除。 | -f:强制删除。 |
| docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG] | 打标签,类似于多了一引用。source与target的image id是相同的。 | |
| docker inspect NAME|ID [NAME|ID...] | 查看镜像/容器信息 | |
| docker image prune | 删除未使用镜像镜像。 | -a:删除所有未使用的镜像 |
创建镜像
- 基于已有容器创建:docker commit
- 基于本地模板导入:docker import(与export命令一起在容器部分介绍)
- 基于Dockerfile创建:docker build(内容较多,后面单独拿出来)
docker commit
基于其他镜像修改、安装一些程序后,commit提交生成新的镜像。
准备一个ubuntu镜像
-> [feifei@ffmac.local] [~] docker pull ubuntu
-> [feifei@ffmac.local] [~] docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 1d622ef86b13 2 weeks ago 73.9MB
-> [feifei@ffmac.local] [~] docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
运行镜像添加一个文件
-> [feifei@ffmac.local] [~] docker run -it ubuntu /bin/bash
root@af9221c0bb6e:/# touch a.txt
root@af9221c0bb6e:/# exit
exit
查看容器列表,查看修改内容,生成新的镜像myubuntu
-> [feifei@ffmac.local] [~] docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
af9221c0bb6e ubuntu "/bin/bash" 22 seconds ago Exited (0) 6 seconds ago fervent_wiles
-> [feifei@ffmac.local] [~] docker diff af9221c0bb6e
A /a.txt
C /root
A /root/.bash_history
-> [feifei@ffmac.local] [~] docker commit af9221c0bb6e myubuntu
sha256:9a8c0fa00cdadc308be6cf9e846602dd17a058699f2ba9a0bd52ad2a346265f4
-> [feifei@ffmac.local] [~] docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myubuntu latest 9a8c0fa00cda 7 seconds ago 73.9MB
ubuntu latest 1d622ef86b13 2 weeks ago 73.9MB
docker save/load
docker save IMAGE [IMAGE...]
save的存出目标是镜像。通常用法 docker save -o myimport2.tar myimport 或者 docker save myimport > myimport2.tar
-> [feifei@ffmac.local] [~] docker save -o myimport2.tar myimport
-> [feifei@ffmac.local] [~] ls
import.txt myimport.tar myimport2.tar
删除myimport镜像后载入
-> [feifei@ffmac.local] [~] docker load -i myimport2.tar
90441ead6bbb: Loading layer [==================================================>] 1.536kB/1.536kB
Loaded image: myimport:latest
载入后的镜像与删除之前的image id相同,这也是与import的区别所在。
容器
命令表格
| 命令 | 解释 | 备注 |
|---|---|---|
| docker create IMAGE [COMMAND] [ARG...] | 从镜像创建一个容器,刚创建完的容器状态是Created | 参数极多,help。 |
| docker start CONTAINER [CONTAINER...] | 开始一个或多个容器 | -i:让容器的标准输入保持打开 |
| docker container prune | 移除所有已停止的容器,包括Created和Exited状态的。 | |
| docker stop CONTAINER [CONTAINER...] | 终止容器运行 | -t:默认为10,表示等待最长多长时间后会被kill |
| docker kill CONTAINER [CONTAINER...] | 向容器发送信号 | -s:默认是KILL |
| docker attach CONTAINER | 多个窗口同时attach到一个容器时,所有窗口会同步显示。当某个窗口阻塞时,其他窗口也无法操作。 | |
| docker exec CONTAINER COMMAND [ARG...] | 每个窗口都是独立的 | 通常用法:docker exec -it c1 /bin/bash |
| docker rm CONTAINER [CONTAINER...] | 只能删除终止和退出的容器,-f 强制删除运行中的容器。Docker会先发送SIGKILL信号给容器,终止其中应用,然后删除容器。 | -f:强制删除运行中的容器 |
| docker inspect NAME|ID [NAME|ID...] | 此指令可以查看镜像信息,也可以查看容器信息 | |
| docker cp CONTAINER:SRC_PATH DEST_PATH|- docker cp SRC_PATH|- CONTAINER:DEST_PATH |
在宿主机与容器之间拷贝文件 | docker cp c1:/a.txt ./ 从c1容器拷贝/a.txt到宿主机当前目录 |
| docker port CONTAINER [PRIVATE_PORT[/PROTO]] | 查看容器端口映射情况 |
docker run
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
此命令根据镜像创建一个容器,并运行。如果镜像在本地不存在,会尝试从仓库拉取。
| 选项 | 解释 |
|---|---|
| -t | 让Docker分配一个伪终端并绑定到容器的标准输入上 |
| -i | 让容器的标准输入保持打开 |
| -d | 以守护进程方式运行 |
| --rm | 再起结束后自动删除 |
-> [feifei@ffmac.local] [~] docker run ubuntu echo 'Hello World'
Hello World
-> [feifei@ffmac.local] [~] docker run -it ubuntu /bin/bash
root@8324e8546f47:/#
docker wait
docker wait CONTAINER [CONTAINER...]
阻塞直到一个或多个容器停止运行,然后打印他们的exit codes
开启两个窗口分别运行一个容器,然后开启第三个窗口运行
// 窗口1运行容器c1
docker run -it --name c1 ubuntu /bin/bash
// 窗口2运行容器c2
docker run -it --name c2 ubuntu /bin/bash
// 窗口3运行docker wait
docker wait c1 c2
// 窗口1执行 exit 1,窗口3无反应;再在窗口2执行 exit 2,窗口3输出两行分别是1、2。
docker logs
获取一个容器的日志
-f:持续输出;-t:输出时间戳;--details:额外的详细信息
// 窗口1
-> [feifei@ffmac.local] [~] docker run -it --name c1 ubuntu /bin/bash
root@046d5a62374e:/# pwd
/
root@046d5a62374e:/# touch a.txt
root@046d5a62374e:/# exit 123
exit
// 窗口2
-> [feifei@ffmac.local] [~] docker logs -tf c1
2020-05-13T16:55:10.398202931Z root@046d5a62374e:/# pwd
2020-05-13T16:55:10.398297213Z /
2020-05-13T16:55:38.712593120Z root@046d5a62374e:/# touch a.txt
2020-05-13T16:55:55.908622227Z root@046d5a62374e:/# exit 123
2020-05-13T16:55:55.909431626Z exit
docker pause/unpause
暂停容器:docker pause CONTAINER [CONTAINER...]
取消暂停:docker unpause CONTAINER [CONTAINER...]
// 窗口1
-> [feifei@ffmac.local] [~] docker run -it --rm --name c1 ubuntu /bin/bash
root@505f1b39efa0:/#
// 窗口2
-> [feifei@ffmac.local] [~] docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
505f1b39efa0 ubuntu "/bin/bash" 11 seconds ago Up 11 seconds c1
-> [feifei@ffmac.local] [~] docker pause c1
c1
-> [feifei@ffmac.local] [~] docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
505f1b39efa0 ubuntu "/bin/bash" 26 seconds ago Up 26 seconds (Paused) c1
-> [feifei@ffmac.local] [~] docker unpause c1
c1
-> [feifei@ffmac.local] [~] docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
505f1b39efa0 ubuntu "/bin/bash" 39 seconds ago Up 39 seconds c1
docker import/export
import根据一个tar文件创建一个镜像,但这个tar文件并不一定要是export导出的,也可以自己生成。
docker import
docker import file|URL|- [REPOSITORY[:TAG]]
对于同一个tar文件,多次使用docker import生成的镜像,其image id是不一样的。
-> [feifei@ffmac.local] [~] touch import.txt
-> [feifei@ffmac.local] [~] tar -cvf myimport.tar import.txt
a import.txt
-> [feifei@ffmac.local] [~] docker import myimport.tar myimport
sha256:3572df2ff16b9508c780770c28eef250589d5c0bf4d77e1dfeb84d406e5b34d2
-> [feifei@ffmac.local] [~] docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myimport latest 3572df2ff16b 5 seconds ago 0B
ubuntu latest 1d622ef86b13 2 weeks ago 73.9MB
docker export
docker export CONTAINER,
export的导出目标是容器,而不是镜像。通常使用:docker export -o c11.tar c1 或者 docker export c1 > c11.tar
-> [feifei@ffmac.local] [~] docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
68e152e8e6ee ubuntu "/bin/bash" 31 minutes ago Up 31 minutes c1
-> [feifei@ffmac.local] [~] docker export -o c11.tar c1
-> [feifei@ffmac.local] [~] docker export c1 > c12.tar
-> [feifei@ffmac.local] [~] ls
c11.tar c12.tar
export与save的区别
操作目标不同:export是容器,save是镜像。
导出文件内容不同:export导出的是当时的文件快照,save导出的是带有历史记录和元数据的完整镜像。
import与load的区别
import导入多次同一个tar文件会得到多个image id不同的镜像,而load只会得到一个。
docker top
docker top CONTAINER [ps OPTIONS]
查看运行中的容器内的进程信息
-> [feifei@ffmac.local] [~] docker top c1
PID USER TIME COMMAND
2504 root 0:00 /bin/bash
docker stats
docker stats [CONTAINER...]
查看统计信息,包括CPU、内存、存储、网络等
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
0e5fa15b44a9 c1 0.00% 884KiB / 1.945GiB 0.04% 1.05kB / 0B 0B / 0B 1
docker diff
docker diff CONTAINER
查看容器内文件系统的变更
- A(Add):添加;
- C(Change):更改;
- D(Delete):删除
-> [feifei@ffmac.local] [~] docker diff c1
A /a.txt
C /.dockerenv
D /tmp
docker update
docker update CONTAINER [CONTAINER...]
更改容器运行时的一些配置,主要是资源限制份额,比如cpu、内存。具体参数help。
数据管理
本章讨论如何对容器内的数据持久化;如何在容器间共享数据。
数据卷
数据卷是一个可供容器使用的特殊目录,它将宿主机目录直接映射到容器。类似Linux mount。它有以下特性:
- 数据卷可以在容器间共享和重用
- 对数据卷的修改立刻生效
- 数据卷一直存在,直到没有容器使用,可以安全卸载
创建数据卷
docker volume create [VOLUME]
其他docker volume子命令有:ls、rm、prune、inspect。
// 创建名为test的数据卷
-> [feifei@ffmac.local] [~] docker volume create test
test
// 不指定名称会分配一个
-> [feifei@ffmac.local] [~] docker volume create
b03ca993f283336bbc227e2a58e3683e175316222321074ec4b24f556fe3bdd2
// 查看结果
-> [feifei@ffmac.local] [~] docker volume ls
DRIVER VOLUME NAME
local b03ca993f283336bbc227e2a58e3683e175316222321074ec4b24f556fe3bdd2
local test
绑定数据卷
使用docker run时,可以使用--mount选项使用数据卷,其支持三种类型:
- volume:普通数据卷,映射到宿主机的/var/lib/docker/volumes
- bind:绑定数据卷,映射到宿主机指定路径下
- tmpfs:临时数据卷,只存在于内存中
type=bind
将宿主机hostdir映射到vtest容器的/root/cntrdir。下面两条等价。
docker run --rm --name vtest --mount type=bind,src=`pwd`/hostdir,dst=/root/cntrdir -it ubuntu
docker run --rm --name vtest -v `pwd`/hostdir:/root/cntrdir -it ubuntu
docker挂载数据卷的默认权限是读写(rw)。可以指定只读(ro),容器内就无法对数据卷进行修改了,但宿主机不受影响。
docker run --rm --name vtest -v `pwd`/hostdir:/root/cntrdir:ro -it ubuntu
type=volume
如果src指定的卷不存在,则自动创建。如果不指定src,则创建一个名字随机的卷,且其生命周期与容器相同,容器被销毁时,卷也被销毁。
将普通数据卷v1挂载到容器vtest的/root/cntrv1
docker run --rm --name vtest --mount type=volume,src=v1,dst=/root/cntrv1 -it ubuntu
docker run --rm --name vtest -v v1:/root/cntrv1 -it ubuntu
mac上查看数据卷内容
docker在Mac上是运行在LinuxKit VM中的,需要用screen命令进入查看。
// 先创建一个数据卷
-> [feifei@ffmac.local] [~] docker volume create v1
// screen
-> [feifei@ffmac.local] [~] screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty
// 进入虚拟机
docker-desktop:~# cd /var/lib/docker/volumes/
docker-desktop:/var/lib/docker/volumes# ls
metadata.db v1
看到数据卷目录找到了!
数据卷容器
创建及使用
数据卷容器的目的是专门给其他容器提供数据卷挂载。
--volumes-from并不要求参数指定的数据卷容器处于运行状态。
创建两个数据卷容器 db1 db2 db3,其中db1与db3映射在容器内的内容相同
-> [feifei@ffmac.local] [~] docker run --name db1 -v /root/db1 -itd ubuntu
-> [feifei@ffmac.local] [~] docker run --name db2 -v /root/db2 -itd ubuntu
-> [feifei@ffmac.local] [~] docker run --name db3 -v /root/db1 -itd ubuntu
使用--volumes-from 来挂载容器中的数据卷,可以多次使用此选项
-> [feifei@ffmac.local] [~] docker run --name cntr1 --volumes-from db1 --volumes-from db2 -it ubuntu
root@63c9ba535eec:/# ls /root/
db1 db2
可以从其他已挂载了数据卷容器的容器挂载数据卷。有点类似于继承。
-> [feifei@ffmac.local] [~] docker run --name cntr2 --volumes-from cntr1 -it ubuntu
root@640c49fee4ad:/# ls /root/
db1 db2
如果挂载不同的数据卷容器,但是映射路径相同,则实际上是使用后面的数据卷容器。
-> [feifei@ffmac.local] [~] docker run --name cntr3 --volumes-from db1 --volumes-from db3 -it ubuntu
root@7aba448230b8:/# ls /root/
db1
如果删除了挂载的容器(db1,db2,cntr1),数据卷不会被自动删除。如果要删除,需要在删除最后一个挂在这它的容器是执行 docker rm -v。
备份
备份数据卷容器db1内的数据卷内容到本地当前目录。
docker run --volumes-from db1 -v `pwd`:/bak --name cntrbak ubuntu tar -cvf /bak/db1.tar /root/db1
使用--volumes-from db1 挂载一个容器数据卷;使用-v `pwd`:/bak映射宿主机当前目录到容器cntrbak的 /bak 目录;然后tar打包db1到 /bak/db1.tar。
Docker学习笔记:镜像、容器、数据卷的更多相关文章
- Docker(六)容器数据卷
容器数据卷 docker的理念回顾 将应用和环境打包成一个镜像 需求:数据可以持久化和同步 使用数据卷 指定路径挂载 docker run -it -v 主机目录:容器内目录 # 测试 [root@h ...
- Docker 学习笔记(持久化数据的备份,还原)
假如我们应用程序需要一台 mssql 数据库来持久化数据,我们将 mssql 数据库运行于 Docker 容器中: docker run -d -p 1433:1433 -e "ACCEPT ...
- Docker学习笔记——制作容器与容器概念
Docker能做些什么? 1.docker能够解决虚拟机能够解决的问题 2.隔离应用依赖 3.创建应用镜像并复制 4.创建容易分发的即启即用的应用 5.docker的想法是创建软件程序可移植的轻量容器 ...
- docker学习笔记:容器的网络设置
创建一个docker容器,docker系统会自动为该容器分配一个ip地址,通常是172.17开头. 我们可以在主机上用 docker inspect 命令 或者进入容器用ifconfig命令来查看容器 ...
- Docker 学习笔记(一)
Docker 入门 Docker 学习 概述 安装 命令 镜像命令 容器命令 操作命令 Docker 镜像 容器数据卷 DockerFile Docker网络原理 IDEA 整合Docker 单机版D ...
- Docker学习笔记---通俗易懂
目录 Docker 简介 Docker安装 Docker的基本组成 安装Docker 配置阿里云镜像加速 回顾helloworld流程 工作原理 Docker的常用命令 帮助命令 镜像命令 容器命令 ...
- docker学习笔记-04:docker容器数据卷
一.容器数据卷是什么 1.为了保存docker容器运行时产生的数据,做数据的持久化,我们需要用到容器数据卷.因为如果不通过docker commit 生成新的镜像,那么当容器被删除时,数据自然就没有了 ...
- Docker学习笔记 - Docker的数据卷容器
一.什么是数据卷容器 如果你有一些持续更新的数据需要在容器之间共享,最好创建数据卷容器. 数据卷容器:用于容器间的数据共享,主动挂载宿主机目录,用于其他容器挂载和共享. 二.数据卷容器的操作 1.创建 ...
- 1.docker介绍、命令、容器、镜像、数据卷、Dockerfile、常用软件安装、推送阿里云
一.docker介绍 1.docker是什么 一款产品从开发到上线,从操作系统,到运行环境,再到应用配置.作为开发+运维之间的协作我们需要关心很多东西,这也是很多互联网公司都不得不面对的问题,特别是各 ...
随机推荐
- 20200107——记spring的DataSource
spring项目中总要跟数据库打交道,其中怎么连接数据库的方法都有很多,大概分为3类: 1) 通过JNDI获取应用服务器(如JBOSS, Tomcat) 的数据源 2) Spring容器中直接配置数 ...
- [GO] mac安装GO 初次尝试
其实试了好多方法,我用的是下面这种方法,简单快捷! 安装homebrew 在终端输入命令 ruby -e "$(curl -fsSL https://raw.githubuserconten ...
- 实现Nginx Upload 模块 功能上传文件。
分析(也许我表达的让人难以理解,但是我想说一句,直接实践是最好的.....): 一.Ningx 上传( 1.安装Nginx 的模块文件(upload):https://www.nginx.com/re ...
- Docker网络与存储(三)
Docker的网络和存储 1.1 Docker的4种网络模式 host模式,使用--net=host指定. container模式,使用--net=container:NAME_or_ID指定. no ...
- js之用IndexOf返回指定字符串的次数
代码 var Str = "strs,strs,stras,str,strs,strs"; var subStr ="strs" ; var count = 0 ...
- RF(作用与目的)
1.robotframework 自动化原理 通过 ride 工具编写脚本,加载指定的 UI 测试库,再通过 pybot 程序去运行指定脚本,调用浏览器驱动,打开浏览器,操作浏览器页面元素,达到模拟用 ...
- muduo网络库源码学习————日志滚动
muduo库里面的实现日志滚动有两种条件,一种是日志文件大小达到预设值,另一种是时间到达超过当天.滚动日志类的文件是LogFile.cc ,LogFile.h 代码如下: LogFile.cc #in ...
- 慎用ToLower和ToUpper,小心把你的系统给拖垮了
不知道何时开始,很多程序员喜欢用ToLower,ToUpper去实现忽略大小写模式的字符串相等性比较,有可能这个习惯是从别的语言引进的,大胆猜测下是JS,为了不引起争论,我指的JS是技师的意思~ 一: ...
- Flutter 打包Android APK 笔记与事项
获取一个KEY 首先要获取 你的 打包应用的一个 key ,这一步其实和 在AndroidStudio 上打包 APK 一样,都是要注册一个本地的 key,key 其实也就是 jks文件啦. 如果已经 ...
- CODING 敏捷实战系列课第二讲:Scrum 敏捷项目管理核心要素之 3355
Scrum 是敏捷开发流派中最著名和最落地的一支,全球 70% 以上公司的敏捷转型都是以 Scrum 起步.CODING 特邀敏捷顾问.CST & CTC 认证敏捷教练申健老师将在本课程< ...