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 容器的应用

https://docs.docker.com/compose/overview/

发布了26 篇原创文章 · 获赞 2 · 访问量 1403

猜你喜欢

转载自blog.csdn.net/weixin_43633797/article/details/103538420
今日推荐