核心概念

  • 镜像:一个只读的模板,类似虚拟机的镜像。
  • 容器:可以理解为镜像的一个运行实例。运行时类似于沙箱,多个容器互相独立。
  • 仓库:存放镜像文件的地方。

镜像

命令表格

命令 解释 选项
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学习笔记:镜像、容器、数据卷的更多相关文章

  1. Docker(六)容器数据卷

    容器数据卷 docker的理念回顾 将应用和环境打包成一个镜像 需求:数据可以持久化和同步 使用数据卷 指定路径挂载 docker run -it -v 主机目录:容器内目录 # 测试 [root@h ...

  2. Docker 学习笔记(持久化数据的备份,还原)

    假如我们应用程序需要一台 mssql 数据库来持久化数据,我们将 mssql 数据库运行于 Docker 容器中: docker run -d -p 1433:1433 -e "ACCEPT ...

  3. Docker学习笔记——制作容器与容器概念

    Docker能做些什么? 1.docker能够解决虚拟机能够解决的问题 2.隔离应用依赖 3.创建应用镜像并复制 4.创建容易分发的即启即用的应用 5.docker的想法是创建软件程序可移植的轻量容器 ...

  4. docker学习笔记:容器的网络设置

    创建一个docker容器,docker系统会自动为该容器分配一个ip地址,通常是172.17开头. 我们可以在主机上用 docker inspect 命令 或者进入容器用ifconfig命令来查看容器 ...

  5. Docker 学习笔记(一)

    Docker 入门 Docker 学习 概述 安装 命令 镜像命令 容器命令 操作命令 Docker 镜像 容器数据卷 DockerFile Docker网络原理 IDEA 整合Docker 单机版D ...

  6. Docker学习笔记---通俗易懂

    目录 Docker 简介 Docker安装 Docker的基本组成 安装Docker 配置阿里云镜像加速 回顾helloworld流程 工作原理 Docker的常用命令 帮助命令 镜像命令 容器命令 ...

  7. docker学习笔记-04:docker容器数据卷

    一.容器数据卷是什么 1.为了保存docker容器运行时产生的数据,做数据的持久化,我们需要用到容器数据卷.因为如果不通过docker commit 生成新的镜像,那么当容器被删除时,数据自然就没有了 ...

  8. Docker学习笔记 - Docker的数据卷容器

    一.什么是数据卷容器 如果你有一些持续更新的数据需要在容器之间共享,最好创建数据卷容器. 数据卷容器:用于容器间的数据共享,主动挂载宿主机目录,用于其他容器挂载和共享. 二.数据卷容器的操作 1.创建 ...

  9. 1.docker介绍、命令、容器、镜像、数据卷、Dockerfile、常用软件安装、推送阿里云

    一.docker介绍 1.docker是什么 一款产品从开发到上线,从操作系统,到运行环境,再到应用配置.作为开发+运维之间的协作我们需要关心很多东西,这也是很多互联网公司都不得不面对的问题,特别是各 ...

随机推荐

  1. Linux学习笔记(一)目录处理命令

    目录处理命令 ls cd mkdir rmdir tree ls 英文原意: list 功能: 显示目录文件 语法: ls 选项[-ald] [文件或目录] ls -a 显示所有文件,包括隐藏文件 l ...

  2. 前端面试的那些事儿(1)~JavaScript 原始数据类型

    前言 自我总结面试常问的一些细节,方便不断回顾与补充.第一次发表文章,如有问题或不足之处望及时指出. JavaScript 原始数据类型 1.1 基础数据类型 7大基础数据类型 boolean nul ...

  3. MySQL基础知识和常用命令总结

    说明:以下内容是阅读书籍<<MySQL必知必会>>的摘要和总结 检索数据 排序检索数据 过滤数据 使用通配符过滤 使用正则表达式进行搜索 创建计算字段 使用数据处理函数 汇总数 ...

  4. web--ajax--json

    案例: 其中,用eval()解析的话,如果json有一些代码,如:{"age":"alert(你好)"},他也会帮你实行,而JOSN.parse();则会自动报 ...

  5. thinkphp5 -- _initialize()初始化控制器

    public function _initialize() { parent::_initialize(); } public function __construct() { $; parent:: ...

  6. 虚拟化KVM之优化(三)

    KVM的优化 1.1 cpu的优化 inter的cpu的运行级别,(Ring2和Ring1暂时没什么用)Ring3为用户态,Ring0为内核态 Ring3的用户态是没有权限管理硬件的,需要切换到内核态 ...

  7. 第八章服务器raid及配置实战

      版本 特点 磁盘个数 可用空间 故障磁盘数 应用环境 RAID0 读写速度快,数据容易丢失 两个 全部 一块 测试,临时性 RAID1 读写速度慢,数据可靠 至少两个,可以2的倍数 总容量的一半 ...

  8. java在指定区间内生成随机数

    Random对象生成随机数 首先需要导入包含Random的包 import java.util.Random; nextInt(int)方法将生成0~参数之间的随机整数但不包括参数. 例如生成0~99 ...

  9. vue2.x学习笔记(三十二)

    接着前面的内容:https://www.cnblogs.com/yanggb/p/12684060.html. 深入响应式原理 vue最独特的特性之一,是其非侵入式(耦合度低)的响应式系统:数据模型仅 ...

  10. document.documentElement.scrollTop指定位置失效解决办法

    近期在vue的H5项目中,做指定位置定位的时候发现使用document.documentElement.scrollTop一直不生效. 解决办法是document.documentElement.sc ...