Docker基础
[参考书籍]:https://yeasy.gitbooks.io/docker_practice/content/compose/usage.html?q=
Docker
干了什么?
:一次配置好环境,换到别的机子上就可以一键部署好
(解决了运行环境和配置问题软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。)
为什么用?
更轻量,基于容器的虚拟化,仅包含业务运行所需的runtime环境,CentOS/Ubuntu基础镜像仅170M;宿 主机可部署100~1000个容器。
更高效,无操作系统虚拟化开销
更敏捷,更灵活
基本组成:
镜像:是一个只读的模板,可以用来创建容器
容器:使用镜像创建的运行实例,看成一个简易版的Linux环境
仓库:集中存放镜像文件的场所(docker hub)
(Docker本身就是一个容器运行载体或称之为管理引擎。我们把应用程序和配置依赖打包好形成一个可交付的 运行环境,它就似乎image镜像文件。只有通过这个镜像文件才能生成Docker容器。image文件可以看作是 容器的模板,docker根据image文件生成容器的实例,同一个image文件,可以生成多个同时运行的容器实 例)
docker与传统虚拟机vm相比:
1、docker有着比虚拟机更少的抽象层。由于docker不需要Hypervisor实现硬件资源虚拟化,运行在docker 容器上的程序直接使用的都是实际物理机的硬件资源(少了一层Hyper虚拟化系统层)。因此在CPU、内存利用 率上docker将会在效率上有明显优势。
2、少了中间的虚拟化os系统层,为docker独有的引擎层
常用命令:
帮助:
docker version
docker info
docker --help
镜像:
*docker images [OPTION] =====>列出本地主机上的镜像*
OPTION说明:
-a: 列出本地所有的镜像(含中间映像层)
-q: 只显示镜像ID
--digests: 显示镜像的摘要信息
--no-trunc: 显示完整的镜像信息
*docker search [OPTION] [指定值] 镜像名字 =====> 在dockerhub上查找满足条件的镜像*
OPTION说明:
--no-trunc: 显示完整的镜像描述
-s: 列出收藏数不小于指定值的镜像
--automated: 只列出automated build类型的镜像
eg:docker search -s 7061 --no-trunc --automated redis
docker pull 镜像名字 : TAG =====> 从dockerhub拉取镜像
docker rmi [-f] 镜像名字 镜像名字 … :TAG =====> [强制]删除一个或多个镜像
docker rmi [-f] $(docker images -qa) … :TAG =====> [强制]删除全部镜像
容器:
新建并启动命令
docker run [OPTION] IMAGE [COMMAND] [ARG…]
OPTION说明:
--name: "容器新名字":为容器指定一个名称
-d: 后台运行容器,并返回容器ID,也即启动守护式容器
-i: 以交互模式运行容器,通常与-t勇士使用
-t: 为容器重新分配一个伪输入终端,通常与-i同时使用
-P:随机端口映射
-e:指定参数,如mysql密码
-p:指定端口映射,有以下四种格式
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort
containerPort
eg:docker run -it --name mycentos [IMAGE ID]/[]
eg:docker run -d -p 6666:8080 tomcat
列出当前所有正在运行的容器
docker ps [OPTION]
OPTION说明:
-a: 列出当前所有正在运行的容器 + 历史上运行过的
-l: 显示最近创建的容器
-n: 显示最近n个创建的容器
-q: 静默模式,只显示容器编号
--no-trunc: 不截断输出
退出容器
exit 容器停止退出
ctrl + P + Q : 容器不停止退出
启动 / 重启 / 停止 容器
docker start / restart / stop [容器ID或容器名字]
强制停止容器
docker kill [容器ID或容器名字]
删除已停止的容器
docker rm [-f] 容器ID ( 加 -f 为强制删除容器 不管容器有没有停止 )
一次性删除多个容器
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm
重要指令
启动守护式进程:
docker run -d 容器ID
【问题】:Docker容器后台运行,就必须有一个前台进程,容器运行的命令如果不是那些一直挂起的命令(比如运行top, tail), 就是会自动退出的
查看容器日志
docker logs -f -t --tail 容器ID
-t 是加入时间戳
-f 跟随最新的日志打印
--tail Numbers 显示最后多少条
查看容器内的进程
docker top 容器ID
查看容器内的细节
docker inspect 容器ID
进入正在运行的容器并以命令行交互
docker exec -it 容器ID bashShell
< exec可以进入容器中或者在容器外打开新的终端,执行bashShell的脚本后返回(通俗的讲,不需要执行退出操作) >
docker attach 容器ID
< attach是只能进入容器启动命令的终端,不会启动新的进程 >
从容器内拷贝文件到主机上
docker cp 容器ID:容器内路径 目的主机路径
根据指定DockerFile文件构建新镜像
docker build -f dockerfile文件路径 -t 镜像名字 构建后的路径
Docker 镜像
是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
UnionFS文件系统
是一种分层、轻量级并且高性能的文件系统
它支持对文件系统的修改作为一次提交来一层层的叠加
Union文件系统是Docker镜像的基础,镜像可以通过分层来进行继承
基于基础镜像(没有父镜像),可以制作各种具体的应用镜像
特性:一次同时加载多个文件系统,但从外面看起来,只有一个
docker 公用 bootfs
docker 为什么采用分层结构:共享资源!!!
eg:有多个镜像都从相同的base镜像构建而来,那么宿主机只需在磁盘上保存一份base镜像,同时内存中也只需加载一份base镜像,就可以为所有容器服务了,而且镜像的每一层都可以被共享。
docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”, “容器层”之下的都叫“镜像层”。
Docker镜像commit操作
docker commit -m=“提交的信息” -a=“作者” 容器ID 要创建的目标镜像名:[标签名]
// 提交容器副本使之成为一个新的镜像
Docker 容器数据卷
能干嘛
1、容器的持久化
2、容器间继承 + 共享数据
容器和宿主机之间数据共享
容器退出后,主机修改后数据也同步
数据卷__(容器内添加)
1、直接命令添加
docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
---命令(带权限)---
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
(只能读read-only)
2、DockerFile添加
[备注]:Docker挂载主机目录Docker访问出现cannot open directory.:Permission denied
(解决办法):在挂载目录后多加一个 --privileged=true 参数即可
数据卷容器
https://www.bilibili.com/video/av47715282/?p=21(如有疑问,参见链接)
命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器。
(活动硬盘上挂载活动硬盘,实现数据的传输依赖)
容器间传递共享(–volumes-from)
1、先启动一个父容器dc01
docker run -it --name dc01 centos
2、dc02/dc03继承自dc01
【--volumes-from】
docker run -it --name dc02 --volumes-from dc01 centos
docker run -it --name dc03 --volumes-from dc01 centos
3、dc01、dc02、dc03 之间共享数据
4、删除dc01后,dc02,dc03之间数据依然共享
5、新建一个 dc04 继承 dc03 后,删除dc03,数据依然共享
结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止。
DockerFile解析
DockerFile 是对 docker image 的描述文件,类似于shell编程
Dockerfile 是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。
构建三步骤
1、手动编写一个dockerfile文件,当然,必须要符合file的规范
2、有这个文件后,直接docker build命令执行,获得一个自定义的镜像
3、run
Dockerfile构建过程解析
Dockerfile 内容基础知识
1、每条保留字指令都必须为大写字母且后面要跟随至少一个参数
2、指令按照从上到下,顺序执行
3、# 表示注释
4、每条指令都会创建一个新的镜像层,并对镜像进行提交
Docker 执行Dockerfile 的大致流程
(1)、docker从基础镜像运行一个容器
(2)、执行一条指令并对容器作出修改
(3)、执行类似docker commit的操作提交一个新的镜像层
(4)、docker再基于刚提交的镜像运行一个新容器
(5)、执行dockerfile中的下一条指令直到所有指令都执行完成
总结:
从应用软件的角度来看,Dockerfile,Docker镜像与Docker容器分别代表软件的三个不同阶段
Dockerfile 是软件的原材料
Docker 镜像是软件的交付品
Docker 容器则可以认为是软件的运行态
Dockerfile面向开发,Docker镜像成为交付标准,Docekr容器则涉及部署及运维,三者缺一不可,合力充当Docker体系的基石
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v3fMezkp-1576302202168)(.\images\123.png)]
Dockerfile
需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。
Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等;
Docker镜像
在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行Docker镜像时,会真正开始提供服务;
Docker容器
容器时直接提供服务的。
+++
DockerFile 体系结构
保留字指令
[源镜像]:scratch
FROM
基础镜像,当前新镜像是基于哪个镜像的
MAINTAINER
镜像维护者的姓名和邮箱地址
RUN
容器构建时需要运行的命令
EXPOSE
当前容器对外暴露的出的端口
WORKDIR
指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点
ENV
用来构建镜像过程中设置环境变量
ADD
将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
COPY
类似ADD,拷贝文件和目录到镜像中。
将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置
COPY 源路径 目标路径
COPY ["源路径", "目标路径"]
VOLUME
容器数据卷,用于数据保存和持久化工作
CMD
指定一个容器启动时要运行的命令
【Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run 之后的参数替换】
CMD指令的格式和 RUN 相似,也是两种格式:
> shell 格式:CMD <命令>
> exec 格式:CMD ["可执行文件", "参数1", "参数2"...]
> 参数列表格式:CMD ["参数1", "参数2"...],在指定了 ENTRYPOINT 指令后,用CMD指定具体的参数。
ENTRYPOINT
指定一个容器启动时要运行的命令
ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数。
ONBUILD
当构建一个被继承的 Dockerfile 时运行命令, 父镜像在被子继承后父镜像的onbuild被触发
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ToJjrAEH-1576302202169)(.\images\1562915997847.png)]
+++
Dockerfile 案例
Base 镜像(Scratch)
FROM scratch
Docker Hub 中 99% 的镜像都是通过在base镜像中安装和配置需要的软件构建出来的
自定义镜像Mycentos
1、编写
Hub默认的CentOS镜像:
1)初始centos运行镜像时的默认路径是 /
2)默认不支持vim
3)默认不支持ifconfig
需要自定义的Mycentos的镜像中具备以下:
1)设置登陆后的默认路径
2)vim编辑器
3)查看网络配置ifconfig
Mycentos Dockerfile
FROM centos
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo 'success………………ok'
CMD /bin/bash
2、构建
docker build -f dockerfile路径 -t 新镜像名字:TAG .
3、运行
docker run -it 镜像名称:TAG
4、列出镜像的变更历史
docker history IMAGEID
CMD / ENTRYPOINT 镜像实例
(同是指定一个容器启动时要运行的命令)
CMD
/* Dockerfile 中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换 */
---- eg:docker run -it -p 7777:8080 tomcat ls -l
如同在dockerfile文件中
EXPOSE 8080
CMD ['catalina.sh', 'run']
CMD ls -l
注意:此时的 “ tomcat ” 没有启动
ENTRYPOINT
/ docker run 之后的参数会被当做参数传递给 ENTRYPOINT, 之后形成新的命令组合 /
制作CMD版可以查询IP信息的容器
FROM centos
RUN yum -y install curl
CMD ["curl", "-s", "https://ip.cn"]
/- 使用cURL可以实现网络数据的抓取,是一个包含诸多选项的强大接口 -/
创建并运行镜像后,需要查看请求头的信息时,就需要添加参数 -i
如果用docker run -it 镜像名 -i ,如下所示
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kxNnBGoM-1576302202170)(.\images\1563157735737.png)]
制作 ENTRYPOINT 版查询IP信息的容器
FROM centos
RUN yum -y install curl
ENTRYPOINT ["curl", "-s", "https://ip.cn"]
执行命令 docker run 镜像名称 -i
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jedjcWRK-1576302202170)(.\images\1563159592709.png)]
【https://www.bilibili.com/video/av47715282/?p=28 7:00~9:00】
总结
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1mDJfjXf-1576302202171)(.\images\1563160970281.png)]
Docker 常用安装
总体步骤:
搜索镜像
拉取镜像
查看镜像
启动镜像
停止容器
移除容器
本地镜像发布到阿里云
登陆
docker login --username= 仓库网址
设置
docker tag [imageID] 仓库(网址加地址)地址:[镜像版本号]
push
docker push 仓库(网址加地址)地址:[镜像版本号]
下载
docker pull 镜像(带网址/目录)地址:[镜像版本号]
【#】具体参见https://www.bilibili.com/video/av47715282/?p=33 9:00
Docker-compose
定义和运行多个 Docker 容器的应用
/av47715282/?p=28> 7:00~9:00】
Docker 常用安装
总体步骤:
搜索镜像
拉取镜像
查看镜像
启动镜像
停止容器
移除容器
本地镜像发布到阿里云
登陆
docker login --username= 仓库网址
设置
docker tag [imageID] 仓库(网址加地址)地址:[镜像版本号]
push
docker push 仓库(网址加地址)地址:[镜像版本号]
下载
docker pull 镜像(带网址/目录)地址:[镜像版本号]
【#】具体参见https://www.bilibili.com/video/av47715282/?p=33 9:00
Docker-compose
定义和运行多个 Docker 容器的应用