一、docker解决了什么问题
传统:运维部署的时候由于环境、配置、依赖、操作系统发行版、内核等差异,会很麻烦
docker: 将开发时的源码及所有运行所需的环境一并打包成镜像部署。一次构建,处处运行。运维只需要装doker就可以了。
镜像:从环境开始,自底至上打包应用。
二、和虚拟机的区别
A:虚拟机:虚拟机就是带环境安装的一种解决方案。它可以在一种操作系统中运行另一种操作系统。
缺点:1. 资源占用多 2.冗余步骤多 3.启动慢
不同:是运行一个完整的操作系统,在该操作系统中运行所需应用进程。
B: 容器技术(Linux Container, LXC) : Linux容器不是模拟一个完整的操作系统,而是对进程进行隔离。有了容器就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件始终如一地运行。
不同:
1. 容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此更加轻便。
2. 每个容器之间相互隔离,每个容器有自己的文件系统,容器之间进程不会相互影响,能区分计算资源。
三、doker三要素
A、镜像
1. 镜像(Image)就是一个只读的模板。镜像可以用来创建docker容器,一个镜像可以创建很多个容器。
B、容器
1. docker利用容器(container)独立运行的一个或一组应用。容器是用镜像创建的运行实例。它可以被启动,开始,停止,删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的linux环境和运行在其中的应用程序。容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别是最上面那一层是可读可写的。
C、仓库
1. 仓库(repository)是集中存放镜像文件的场所。
2. 仓库(repository)和仓库注册服务器(registry)是有区别的。仓库注册服务器往往存放着多个仓库,每个仓库又包含着多个镜像,每个镜像有多个标签(tag)。
3. 仓库分为公开仓库和私有仓库两种形式。
4. 最大公开仓库是Docker Hub(https://hub.docker.com)
5. 存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云,网易云等。
D、docker
1. docker本身是一个容器运行载体或称之为管理引擎。我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就是image镜像文件。只有通过镜像文件才能生成docker容器。image可以看做事容器生成的模板,docker根据image生成容器的实例。同一个image文件,可以生成多个同时运行的容器实例。
四、centos安装docker
五、阿里云镜像加速
六、docker常用命令
A、帮助命令
1. docker version
2. docker info
3. docker help
B、镜像命令
1. docker images [options] (列出本地机上的images)
a.各列说明:
a. repository表示镜像的仓库源
b. tag镜像的标签
c. image id: 镜像id
d. created: 镜像创建时间
e. 镜像大小
b. options说明
a. -a: 列出所有镜像(包含中间印象层)
b. -q:只显示镜像id
c. --digests:显示镜像的摘要信息
d. --no-trunc:显示完整的镜像信息
2. docker search [options] 镜像名字 (搜索镜像)
a. options说明:
1) --no-trunc: 显示完整的信息
2) -s 收藏数:列出收藏数不小于该数的镜像
3)--automated: 只列出automated build类型的镜像(自动构建)
3. docker pull 镜像名字:tag (下载镜像)
4. docker rmi [-f] 镜像名1/id 1 镜像名2/id2(删除镜像)
a. docker rmi -f $(docker images -qa) (全部删除)
5. docker run [options] 镜像名 [命令] [参数] (运行容器)
a. options说明
1) --name="容器新名字":为容器指定一个名称
2) -d 后台运行容器并返回容器id,即启动守护式容器
a) 问题:docker容器后台运行,就必须有一个前台进程。容器运行的命令如果不是那些一直挂起的命令(比如top,tail),就会自动退出。所以最佳的解决方案是将你要运行的程序以前台进程的方式运行。
b) 解决:docker run -d 容器id/名字 /bin/sh -c "while true; do echo hello zzyy; sleep 2;done" (持续向前台打印输出)
3) -i 以交互模式运行容器,通常与-t同时使用
4) -t 为容器重新分配一个为输入终端,通常与-i同时使用
5) -P 随机端口映射
6) -p 指定端口映射,有以下四种格式
a) ip:hostPort:containerPort
b) ip::containerPort
c) hostPort:containerPort
d) containerPort
7) -e 配置环境变量
6. docker ps [options] (列出所有正在运行的容器)
a. options说明
1) -a:列出所有当前正在运行的容器+历史上运行过的容器
2) -l:显示最近创建的容器
3) -n 数字: 显示最近创建的n个容器
4) -q:静默模式,只显示容器编号
5) --no-trunc:不截断输出
7. 退出容器
a. exit (容器停止退出)
b. ctrl+P+Q (容器不停止退出)
8. docker start 容器id或容器名 (启动容器)
9. docker restart 容器id或容器名 (重启容器)
10. docker stop 容器id或容器名 (停止容器)
11. docker kill 容器id或者容器名 (强制停止)
12. docker rm [-f] 容器id或者容器名 (【强制】删除已停止的容器)
a. 一次删除多个容器
1)docker -rm -f $(docker ps -a -q)
2) docker ps -a -q | xargs docker rm
13. docker logs -f -t --tail 容器id
a. 参数说明
1) -t 是加入时间戳
2) -f 是跟随最新的日志打印
3) --tail 数字 显示最后几条
14. docker top 容器id/容器名 (查看容器内运行的进程)
15. docker inspect 容器id/容器名
16. 进入正在运行的容器并以命令行交互
a. docker exec -it 容器id bashshell(在容器中打开新的终端,可以启动新的进程)
b. docker attach 容器id/容器名 (直接进入容器启动命令终端,不会启动新的进程)
17. docker cp 容器id:容器内路径 目的主机路径
18. docker commit (提交容器副本使之成为一个新的镜像)
a. docker commit -m="提交的描述信息" -a="作者" 容器id 要创建的目标镜像名:[标签名]
19. docker history 镜像名 (列出镜像的变更历史)
七、镜像原理
A、镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
B、UnionFS(联合文件系统):Union文件系统是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层地叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。
a. 特性:一次同时加载多个文件系统,但从外面看来,只能看到一个文件系统,联合加载会把各文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
C、docker镜像加载原理:
a. bootfs主要包含bootloader和kernel,bootloader主要引导加载kernel,linux刚启动的时候会加载bootfs文件系统,在docker镜像的最底层是bootfs。这一层和我们典型的linux/unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时的使用权已有bootfs转交给内核,此时系统也会卸载bootfs
b. rootfs,在bootfs之上,包含的就是典型的linux中的 /dev,/proc,/bin等标准目录和文件,rootfs就是各种不同操作系统的发行版。
八、docker容器数据卷
A、卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过unionfile system提供一些用于持久存储或共享数据的特性;卷的设计的目的就是数据的持久化,完全独立于容器的生命周期,因此docker不会再容器删除时删除其挂载的卷。
B、特点:
1. 数据卷可在容器之间共享或重用数据
2. 卷中的更改可以直接生效
3. 数据卷中的更改不会包含在镜像的更新中
4. 数据卷的生命周期一直持续到没有容器使用它为止
C、添加
1. 命令添加
a. 命令:docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
b. 带权限命令: docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
2. DockerFile添加
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"] 启动容器后会建立两个文件夹并在宿主机上默认建立与之对应的文件夹
九、Dockerfile
A、Dockerfile是构建Docker用的文件,是由一系列命令和参数构成的脚本。
B、基础知识
1. 每条保留字指令都必须为大写字母且后面至少要跟随一个参数
2. 按照指令从上到下,顺序执行
3. #表示注释
4. 每条指令都会创建一个新的镜像层,并对镜像进行提交
C、执行流程
1. docker从基础镜像运行一个容器
2. 执行一条指令并对容器作出修改
3. 执行类似docker commit的操作提交一个新的镜像层
4. docker再基于刚提交的镜像运行一个新的容器
5. 执行dockerfile中的下一条指令直到所有指令都执行完成
D、Dockerfile体系结构
1. FROM----基础镜像,当前新镜像是基于哪个镜像的
2. MAINTAINER ---- 维护这的姓名加邮箱
3. RUN ---- 容器构建时需要运行的命令
4. EXPOSE ---- 当前容器对外暴露的端口号
5. WORKDIR ---- 指定在创建容器后,终端默认登录进来的工作目录,一个落脚点
6. ENV ---- 用来在构建镜像过程中设置环境变量
7. ADD ---- 将宿主机目录下的文件拷贝进镜像且add命令会自动处理url和解压缩tar包
8. COPY ---- 类似ADD,拷贝文件和目录到镜像中。
将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置
COPY src dest
COPY ["src","dest"]
9. VOLUME ---- 容器数据卷,用于数据保存和持久化工作
10. CMD ---- 指定一个容器启动时要运行的命令
Dockerfile中可以有多个CMD命令,但只有最后一个生效,CMD会被docker run 之后的参数替换
11. ENTRYPOINT ---- 指定一个容器启动时要运行的命令
ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数
12. ONBUILD ---- 当构建一个被继承的Dockerfile时运行命令,父镜像在被子镜像继承后父镜像的onbuild触发
十、发布到阿里云
A、Dockerfile构建命令:docker build [options] 存放位置
1. -f :Dockerfile文件地址
2. -t :tag标签
A、docker commit [OPTIONS] 容器id [REPOSITORY[:TAG]]
1. OPTIONS说明
a. -a 作者
b. -m 提交时的文字说明
B、推送方法见阿里云镜像仓库控制台