核心概念

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

镜像

命令表格

命令 解释 选项
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. react: nextJs koa project basic structure

    1.init nextJs project npm init npm install react react-dom next config script in package.json " ...

  2. 关于mysql的范式——反范式的思路

    数据库的设计,是有模式的,就是在实际生产的项目中,按照怎样怎样步骤的去做.减少冗余呀,一对多呀等等. 那么回归到一个问题:数据库究竟是为了添加,还是为了查询?这个问题有些轴,以 增删改查四律而言,都是 ...

  3. deepin15.11小毛病解决

    目录 边缘花屏问题 QQ`Tim头像问题 ssh卡死问题 看直播卡 边缘花屏问题 sudo apt install systemsettings 打开kde系统设置 打开显示与设置,修改如图下,基本上 ...

  4. Hbase的安装与基本操作

    简介: 1安装 HBase​   本节介绍HBase的安装方法,包括下载安装文件.配置环境变量.添加用户权限等. 1.1 下载安装文件   HBase是Hadoop生态系统中的一个组件,但是,Hado ...

  5. myod实验(选做)

    myod实验 实验任务 1 复习c文件处理内容 2 编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能 main与其他分开,制作静态库和动态库 编写Makefile ...

  6. Zabbix3.4安装部署

    Zabbix3.4安装部署 一.系统环境 cat /etc/redhat-release  CentOS Linux release 7.3.1611 (Core)  关闭防火墙及selinux sy ...

  7. mysql-管理命令【创建用户、授权、修改密码、删除用户和授权、忘记root密码】

    一.创建用户 命令: CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 关键参数说明: username - 创建登录用户名, host ...

  8. PAT A1023

    简单的大数问题,long long并不能容纳21位数字,这是刚开始没有注意到的 #include<iostream> #include<stdlib.h> #include&l ...

  9. React技术栈——Redux

    Redux 1.Redux是什么?   Redux对于JavaScript应用而言是一个可预测状态的容器.换言之,它是一个应用数据流框架,而不是传统的像underscore.js或者AngularJs ...

  10. 02-线性结构4 Pop Sequence

    02-线性结构4 Pop Sequence   (25分) 时间限制:400ms 内存限制:64MB 代码长度限制:16kB 判题程序:系统默认 作者:陈越 单位:浙江大学 https://pta.p ...