Docker学习笔记

一个有超高时间和空间效率的沙盒

Posted by TH on March 27, 2020

Docker简介

image-20200318165227834

Docker给了这个问题一个标准化解决方案

在交付给运维时,把环境也给打包成镜像带走

Docker基于Go语言实现的云开源项目

主要目标:一次封装 ,到处运行

传统虚拟机要模拟硬件,之后运行操作系统

而docker则是运行于宿主的内核,容器没有自己的内核,而且没有硬件虚拟

每个容器之间相互隔离,每个容器有自己的文件系统,容器之间进程不会相互影响,能区分计算资源

Docker基本组成

镜像 容器 仓库

镜像

image-20200318172326742

镜像等于类:容器等于实例对象

容器

image-20200318172407491

仓库

image-20200318172601738

总结

image-20200318172729505

Docker安装

centOS6.8

image-20200318172905231

centOS7

1.image-20200318174043689

2.image-20200318174053249

3.image-20200318174102291

4.image-20200318174112115

5.image-20200318174131382

6.image-20200318174140545

HelloWorld镜像

docker run hello-world

Docker Run运行机制

image-20200318180828859

Docker运行原理

1.CS结构

2.守护进程运行在主机上,通过Socket连接从客户端访问

3.守护进程从客户端接受命令并运行容器

Docker什么比VM快

image-20200320154154987

Docker的常用命令

帮助命令

版本信息

docker version

docker个人信息

docker info

docker帮助

docker –help

类似linux man

镜像命令

列出本地镜像

docker images

image-20200320155019294

参数-a

列出本地所有的镜像,含中间映像层

image-20200320155213144

参数 -q

只显示镜像ID

image-20200320155248056

参数 –digests

显示描述

image-20200320155315145

参数 –no-trunc

完整的镜像信息

image-20200320155346876

镜像搜索

docker search

image-20200320155456951

-s args 参数

列出不小于参数star数的镜像

image-20200320155718302

–automated

只列出automated build类型的镜像

拉取镜像

docker pull xxx[:version]

默认latest版本

删除镜像

docker rmi xxx

需要先关闭相关镜像

image-20200320160231285

-f 参数 强行删除

image-20200320160338770

删除多个

docker rmi xxx xxx空格分隔

删除全部

docker rmi -f $(docker images -qa)

容器命令

新建并启动容器

docker run [OPTIONS] image [COMMAND] [ARGS..]

image-20200320161101936

列出当前所有正在运行的容器

docker ps

image-20200320161428960

参数:

image-20200320161631203

退出容器

image-20200320161713569

启动容器

docker start xxx(id或容器名)

image-20200320162228476

重启容器

docker restart xxx(id或容器名)

image-20200320162251067

停止容器

docker stop xxx

image-20200320162346164

强制关闭容器

docker kill xxx

image-20200320162402137

删除已停止的容器

docker rm xxx

image-20200320162500378

-f 强制删除

image-20200320162531201

启动守护型容器

docker run -d

image-20200320162845932

image-20200320162951836

查看容器日志

docker logs -f -t –tail 容器id

image-20200320163144071

查看容器内进行的进程

docker top 容器id

image-20200320163437357

查看容器内部细节

docker inspect 容器ID

image-20200320163628584

进入正在运行的容器和命令行交互

docker attach -it 容器ID bashshell

attach进入容器

exec在外面运行容器内部的命令

image-20200320164008437

拷贝容器内的内容

docker cp 容器ID:容器路径 容器外路径

image-20200320164414057

总结:

image-20200320164507591789

Docker镜像原理

镜像介绍

image-20200323153706787

UnionFS联合文件系统

分层、轻量级、高性能的文件系统,支持对文件系统的修改作为一次提交来一层层的叠加

特性:image-20200323153821983

Docker镜像加载原理

image-20200323153856025

分层镜像

image-20200323154354954

image-20200323154402089

为什么要采用这种分层结构

共享资源

多个镜像都由相同的base镜像,那么宿主机只需要一个base镜像就够了

各个镜像共享使用

内存中只需要加载一份base镜像就可服务

特点

image-20200323154600083

Commit操作补充

通过commit提交自定义的镜像

docker commit -a=”artist” -m=”message” xxxxx namespace/imagename:version

Docker容器数据卷

是什么

将Docker容器中的数据作持久化+数据共享

特点

image-20200323161731686

操作

image-20200323162047637

简单来讲,将宿主机目录与容器目录软连接上,可读写,关闭容器后修改,重新打开容器也可查看更改。

image-20200323170844633

:ro 只读

容器数据卷用DockerFile添加

DockerFile是什么?

image-20200325153956024

是镜像的一种源码级操作

DockerFile=源码

images=实例

VOLUME指令

使用VOLUME添加DockerFile

image-20200325154509738

build指令

使用build把dockerfile生成镜像

image-20200325155513901

image-20200325154938529

生成的数据卷与宿主机的连接地址在inspect命令中可显示

image-20200325160254831

容器间传递共享

image-20200325160540329

–volumes-from

image-20200325160712407

属于分布式共享

dc01被删除后,dc02和dc03仍然存在

甚至dc01被删除后,在dc02创建的文件,dc03仍然显示,即使是–volumes-from dc01

DockerFile

流程

image-20200325161245972

dockerfile->docker build->docker run

image-20200325162117107

基础

image-20200325162010637

DockerFile关键字(保留字)

FROM

基础镜像,当前新镜像是基于哪个镜像的

MAINTAINER

镜像维护者

RUN

镜像构建时执行的命令

EXPOSE

暴露端口号

WORKDIR

默认创建后进来的目录

ENV

构建镜像中设置环境变量

ADD

拷贝+解压文件

COPY

类似ADD,拷贝文件但不解压

VOLUME

容器数据卷,数据保存和持久化

CMD

指定容器启动时的命令

只有最后一个生效!

CMD会被docker run后面的参数替换

ENTRYPOINT

和CMD一样,但不会被docker run后面的参数替换

ONBUILD

被继承后执行此段代码

image-20200326154800629