Docker 入门(一):镜像、容器、数据卷

  1. 基本概念

  • 镜像:一个只读的镜像文件,类似于虚拟机镜像文件。

  • 容器:可以理解为镜像的一个运行实例。运行时类似于沙箱,多个容器互相独立。

  • 仓库:存放镜像文件的地方。


   2.基础命令

命令解释选项
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删除未使用镜像镜像。

【镜像】

3.创建镜像

  • 基于已有容器创建:docker commit

  • 基于本地模板导入:docker import(与export命令一起在容器部分介绍)

  • 基于Dockerfile创建:docker build(内容较多,后面单独拿出来)

docker commit#

基于其他镜像修改、安装一些程序后,commit提交生成新的镜像。

pull  一个ubuntu镜像

[root@localhost ~]# docker pull ubuntu

[root@localhost ~]# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

ubuntu              latest              1d622ef86b13        4 weeks ago         73.9MB

 

运行一个镜像并创建一个keysou.txt 文件

[root@localhost ~]# docker run -it ubuntu /bin/bash 

root@a4b93890afbc:/# touch keysou.txt

root@a4b93890afbc:/# exit


查看容器列表,查看修改内容,生成新的镜像myubuntu

[root@localhost ~]# docker ps -a 

image.png

[root@localhost ~]# docker diff a4b93890afbc 

image.png

[root@localhost ~]# docker commit a4b93890afbc myubuntu

image.png

[root@localhost ~]# docker images

image.png


4、docker save/load#

docker save IMAGE [IMAGE...]
save的存出目标是镜像。

#save  myubuntu镜像

 [root@localhost ~]# docker save -o myimport2.tar  myubuntu

#删除myubuntu镜像后载入

删除镜像myubuntu

[root@localhost ~]# docker rmi myubuntu

[root@localhost ~]# docker images

image.png

载入myubuntu 镜像

[root@localhost ~]# docker load -i myimport2.tar  

[root@localhost ~]# docker images   

image.png


【容器】

基本命令

命令解释备注
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]]查看容器端口映射情况

1、docker run#

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
此命令根据镜像创建一个容器,并运行。如果镜像在本地不存在,会尝试从仓库拉取。

选项解释
-t让Docker分配一个伪终端并绑定到容器的标准输入上
-i让容器的标准输入保持打开
-d以守护进程方式运行
--rm再起结束后自动删除

[root@localhost ~]# docker run ubuntu echo "hello keysoublog" 

hello keysoublog

[root@localhost ~]# docker run -it ubuntu /bin/bash

root@7aabeb0dca31:/# 

2、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输出两行分别是12

3、docker logs

获取一个容器的日志
-f:持续输出;-t:输出时间戳;--details:额外的详细信息

// 窗口1


[root@localhost ~]# docker run -it --name c1 ubuntu /bin/bash

root@289ff2da0fe6:/# pwd

/

root@289ff2da0fe6:/# touch keysou1.txt 

root@289ff2da0fe6:/# exit 123

exit


//窗口2

[root@localhost ~]# docker logs -tf c1

root@289ff2da0fe6:/# pwd

2020-05-27T10:16:07.763892817Z /

2020-05-27T10:16:21.772944098Z root@289ff2da0fe6:/# touch keysou1.txt 

2020-05-27T10:16:32.942580292Z root@289ff2da0fe6:/# exit 123

2020-05-27T10:16:32.942647340Z exit

[root@localhost ~]# 


4、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是不一样的。

Copy-> [feifei@ffmac.local] [~] touch import.txt-> [feifei@ffmac.local] [~] tar -cvf myimport.tar import.txta import.txt-> [feifei@ffmac.local] [~] docker import myimport.tar myimportsha256:3572df2ff16b9508c780770c28eef250589d5c0bf4d77e1dfeb84d406e5b34d2-> [feifei@ffmac.local] [~] docker imagesREPOSITORY          TAG                 IMAGE ID            CREATED             SIZEmyimport            latest              3572df2ff16b        5 seconds ago       0Bubuntu              latest              1d622ef86b13        2 weeks ago         73.9MB

docker export#

docker export CONTAINER,
export的导出目标是容器,而不是镜像。通常使用:docker export -o c11.tar c1 或者 docker export c1 > c11.tar

Copy-> [feifei@ffmac.local] [~] docker ps -aCONTAINER 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] [~] lsc11.tar c12.tar

export与save的区别#

操作目标不同:export是容器,save是镜像。
导出文件内容不同:export导出的是当时的文件快照,save导出的是带有历史记录和元数据的完整镜像。

import与load的区别#

import导入多次同一个tar文件会得到多个image id不同的镜像,而load只会得到一个。

docker top#

docker top CONTAINER [ps OPTIONS]
查看运行中的容器内的进程信息

Copy-> [feifei@ffmac.local] [~] docker top c1PID                 USER                TIME                COMMAND2504                root                0:00                /bin/bash

docker stats#

docker stats [CONTAINER...]
查看统计信息,包括CPU、内存、存储、网络等

CopyCONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS0e5fa15b44a9        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):删除

Copy-> [feifei@ffmac.local] [~] docker diff c1A /a.txtC /.dockerenvD /tmp

docker update#

docker update CONTAINER [CONTAINER...]
更改容器运行时的一些配置,主要是资源限制份额,比如cpu、内存。具体参数help。

数据管理#

本章讨论如何对容器内的数据持久化;如何在容器间共享数据。

数据卷#

数据卷是一个可供容器使用的特殊目录,它将宿主机目录直接映射到容器。类似Linux mount。它有以下特性:

  • 数据卷可以在容器间共享和重用

  • 对数据卷的修改立刻生效

  • 数据卷一直存在,直到没有容器使用,可以安全卸载

创建数据卷#

docker volume create [VOLUME]
其他docker volume子命令有:ls、rm、prune、inspect。

Copy// 创建名为test的数据卷
-> [feifei@ffmac.local] [~] docker volume create testtest
// 不指定名称会分配一个
-> [feifei@ffmac.local] [~] docker volume createb03ca993f283336bbc227e2a58e3683e175316222321074ec4b24f556fe3bdd2
// 查看结果
-> [feifei@ffmac.local] [~] docker volume lsDRIVER              VOLUME NAMElocal               b03ca993f283336bbc227e2a58e3683e175316222321074ec4b24f556fe3bdd2
local               test

绑定数据卷#

使用docker run时,可以使用--mount选项使用数据卷,其支持三种类型:

  • volume:普通数据卷,映射到宿主机的/var/lib/docker/volumes

  • bind:绑定数据卷,映射到宿主机指定路径下

  • tmpfs:临时数据卷,只存在于内存中

type=bind

将宿主机hostdir映射到vtest容器的/root/cntrdir。下面两条等价。

Copydocker run --rm --name vtest --mount type=bind,src=`pwd`/hostdir,dst=/root/cntrdir -it ubuntudocker run --rm --name vtest -v `pwd`/hostdir:/root/cntrdir -it ubuntu

docker挂载数据卷的默认权限是读写(rw)。可以指定只读(ro),容器内就无法对数据卷进行修改了,但宿主机不受影响。

Copydocker run --rm --name vtest -v `pwd`/hostdir:/root/cntrdir:ro -it ubuntu
type=volume

如果src指定的卷不存在,则自动创建。如果不指定src,则创建一个名字随机的卷,且其生命周期与容器相同,容器被销毁时,卷也被销毁。
将普通数据卷v1挂载到容器vtest的/root/cntrv1

Copydocker run --rm --name vtest --mount type=volume,src=v1,dst=/root/cntrv1 -it ubuntudocker run --rm --name vtest -v v1:/root/cntrv1 -it ubuntu

mac上查看数据卷内容#

docker在Mac上是运行在LinuxKit VM中的,需要用screen命令进入查看。

Copy// 先创建一个数据卷-> [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映射在容器内的内容相同

Copy-> [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 来挂载容器中的数据卷,可以多次使用此选项

Copy-> [feifei@ffmac.local] [~] docker run --name cntr1 --volumes-from db1 --volumes-from db2 -it ubuntu
root@63c9ba535eec:/# ls /root/db1  db2

可以从其他已挂载了数据卷容器的容器挂载数据卷。有点类似于继承。

Copy-> [feifei@ffmac.local] [~] docker run --name cntr2 --volumes-from cntr1 -it ubunturoot@640c49fee4ad:/# ls /root/db1  db2

如果挂载不同的数据卷容器,但是映射路径相同,则实际上是使用后面的数据卷容器。

Copy-> [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内的数据卷内容到本地当前目录。

Copydocker 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。


原文:https://www.cnblogs.com/flhs/p/12896170.html#1003521363

标签: Docker

作者头像
南宫俊逸创始人

做一个积极主动热情的人,为了想要完成的事情和实现的目标,拼命投入力量。

上一篇:不管你是新站还是老站,都不能忽略的5点细节
下一篇:如何使用阿里云产品代金券?

发表评论

期待各位的加入,让原创发挥活力,让阅读更有价值!登录注册
登录
用户名
密码
注册
用户名
密码
确认密码
邮箱
验证码
找回密码
用户名
邮箱
※ 重置链接将发送到邮箱