Docker 是一个开源的应用容器引擎,基于 Go 语言实现,可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux 机器上。
Centos7 安装 Docker
安装一些必要的工具
1 | |
添加软件源信息
1 | |
更新并安装Docker-CE
1 | |
开启Docker服务
1 | |
验证Docker服务
1 | |
Docker 架构
镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
Docker 命令
Docker 进程相关命令
启动 docker 服务
1 | |
停止 docker 服务
1 | |
重启 docker 服务
1 | |
查看 docker 服务
1 | |
设置开机启动 docker 服务
1 | |
Docker 镜像相关命令
查看镜像:查看本地所有的镜像
1 | |
搜素镜像:从网络中查找需要的镜像
1 | |
拉取镜像:从Docker仓库下载镜像到本地,镜像名称格式为 名称:版本号,如果版本号不指定则是最新的版本。如果不知道镜像版本,可以去docker hub 搜索对应镜像查看。
1 | |
删除镜像:删除本地镜像
1 | |
Docker 容器相关命令
查看容器
1 | |
创建并启动容器
1 | |
参数说明:
• -i: 保持容器运行。通常与 -t 同时使用。加入it这两个参数后,容器创建后自动进入容器中,退出容器 后,容器自动关闭。
• -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用。
• -d:以守护(后台)模式运行容器。创建一个容器在后台运行,需要使用docker exec 进入容器。退出 后,容器不会关闭。
• -it 创建的容器一般称为交互式容器,-id 创建的容器一般称为守护式容器
• –name:为创建的容器命名。
进入容器
1 | |
启动容器
1 | |
停止容器
1 | |
删除容器
1 | |
查看容器信息
1 | |
Docker 容器的数据卷
数据卷概念及作用
思考:
Docker 容器删除后,在容器中产生的数据还在吗?
Docker 容器和外部机器可以直接交换文件吗?
Docker 容器之间想要进行数据交互?
数据卷概念:
- 数据卷是宿主机中的一个目录或文件
- 当容器目录和数据卷目录绑定后,对方的修改会立即同步
- 一个数据卷可以被多个容器同时挂载
- 一个容器也可以被挂载多个数据卷
数据卷作用:
- 容器数据持久化
- 外部机器和容器间接通信
- 容器之间数据交换
配置数据卷
创建启动容器时,使用 -v 参数 设置数据卷
1 | |
注意事项:
- 目录必须是绝对路径
- 如果目录不存在,会自动创建
- 可以挂载多个数据卷
数据卷容器
数据卷容器:多容器进行数据交换,多个容器挂载同一个数据卷
配置数据卷容器:
1.创建启动c3数据卷容器,使用 –v 参数 设置数据卷
1 | |
2.创建启动 c1 c2 容器,使用 –-volumes-from 参数 设置数据卷
1 | |
数据卷小结
- 数据卷概念
宿主机的一个目录或文件 - 数据卷作用
1.容器数据持久化
2.客户端和容器数据交换
3.容器间数据交换 - 数据卷容器
1.创建一个容器,挂载一个目录,让其他容器继承自该容器( –volume-from )。
2.通过简单方式实现数据卷配置
Docker 应用部署
MySQL 部署
案例需求:在Docker容器中部署MySQL,并通过外部mysql客户端操作MySQL Server
实现步骤:
① 搜索mysql镜像
② 拉取mysql镜像
③ 创建容器
④ 操作容器中的mysql
Nginx 部署
案例需求:在Docker容器中部署Nginx,并通过外部机器访问Nginx
实现步骤:
① 搜索Nginx镜像
② 拉取Nginx镜像
③ 创建容器
④ 测试访问
Redis 部署
案例需求:在Docker容器中部署Redis,并通过外部机器访问Redis
实现步骤:
① 搜索Redis镜像
② 拉取Redis镜像
③ 创建容器
④ 测试访问
Dockerfile
Docker 镜像原理
思考:
• Docker 镜像本质是什么?
• Docker 中一个centos镜像为什么只有200MB,而一个
centos操作系统的iso文件要几个个G?
• Docker 中一个tomcat镜像为什么有500MB,而一个
tomcat安装包只有70多MB?
操作系统组成部分:
• 进程调度子系统
• 进程通信子系统
• 内存管理子系统
• 设备管理子系统
• 文件管理子系统
• 网络通信子系统
• 作业控制子系统
Linux文件系统由bootfs和rootfs两部分组成
- bootfs:包含bootloader(引导加载程序)和 kernel(内核)
- rootfs: root文件系统,包含的就是典型 Linux 系统中的/dev,/proc,/bin,/etc 等标准目录和文件
- 不同的Linux发行版,bootfs基本一样,而rootfs不同,如ubuntu,centos等
- Docker镜像是由特殊的文件系统叠加而成
- 最底端是 bootfs,并使用宿主机的bootf
- 第二层是 root文件系统rootfs,称为base image
- 然后再往上可以叠加其他的镜像文件
- 统一文件系统(Union File System)技术能够将不同的
层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。 - 一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最底部的镜像成为基础镜像。
- 当从一个镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器
Docker 镜像本质是什么?
• 是一个分层文件系统Docker 中一个centos镜像为什么只有200MB,而一个centos操作系统的iso文件要几个个G?
• Centos的iso镜像文件包含bootfs和rootfs,而docker的centos镜像复用操作系统的bootfs,只有 rootfs和其他镜像层Docker 中一个tomcat镜像为什么有500MB,而一个tomcat安装包只有70多MB?
• 由于docker中镜像是分层的,tomcat虽然只有70多MB,但他需要依赖于父镜像和基础镜像,所有 整个对外暴露的tomcat镜像大小500多MB
镜像制作:
1、容器转为镜像
1 | |
2、dockerfile
Dockerfile 概念及作用
- Dockerfile 是一个文本文件
- 包含了一条条的指令
- 每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像
- 对于开发人员:可以为开发团队提供一个完全一致的开发环境
- 对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件
构建一个新的镜像开始工作了 - 对于运维人员:在部署时,可以实现应用的无缝移植
Dochub网址:https://hub.docker.com
Dockerfile 关键字
| 关键字 | 作用 | 备注 |
|---|---|---|
| FROM | 指定父镜像 | 指定dockerfile基于那个image构建 |
| MAINTAINER | 作者信息 | 用来标明这个dockerfile谁写的 |
| LABEL | 标签 | 用来标明dockerfile的标签 可以使用Label代替Maintainer 最终都是在docker image基本信息中可以查看 |
| RUN | 执行命令 | 执行一段命令 默认是/bin/sh 格式: RUN command 或者 RUN [“command” , “param1”,”param2”] |
| CMD | 容器启动命令 | 提供启动容器时候的默认命令 和ENTRYPOINT配合使用.格式 CMD command param1 param2 或者 CMD [“command” , “param1”,”param2”] |
| ENTRYPOINT | 入口 | 一般在制作一些执行就关闭的容器中会使用 |
| COPY | 复制文件 | build的时候复制文件到image中 |
| ADD | 添加文件 | build的时候添加文件到image中 不仅仅局限于当前build上下文 可以来源于远程服务 |
| ENV | 环境变量 | 指定build时候的环境变量 可以在启动的容器的时候 通过-e覆盖 格式ENV name=value |
| ARG | 构建参数 | 构建参数 只在构建的时候使用的参数 如果有ENV 那么ENV的相同名字的值始终覆盖arg的参数 |
| VOLUME | 定义外部可以挂载的数据卷 | 指定build的image那些目录可以启动的时候挂载到文件系统中 启动容器的时候使用 -v 绑定 格式 VOLUME [“目录”] |
| EXPOSE | 暴露端口 | 定义容器运行的时候监听的端口 启动容器的使用-p来绑定暴露端口 格式: EXPOSE 8080 或者 EXPOSE 8080/udp |
| WORKDIR | 工作目录 | 指定容器内部的工作目录 如果没有创建则自动创建 如果指定/ 使用的是绝对地址 如果不是/开头那么是在上一条workdir的路径的相对路径 |
| USER | 指定执行用户 | 指定build或者启动的时候 用户 在RUN CMD ENTRYPONT执行的时候的用户 |
| HEALTHCHECK | 健康检查 | 指定监测当前容器的健康监测的命令 基本上没用 因为很多时候 应用本身有健康监测机制 |
| ONBUILD | 触发器 | 当存在ONBUILD关键字的镜像作为基础镜像的时候 当执行FROM完成之后 会执行 ONBUILD的命令 但是不影响当前镜像 用处也不怎么大 |
| STOPSIGNAL | 发送信号量到宿主机 | 该STOPSIGNAL指令设置将发送到容器的系统调用信号以退出。 |
| SHELL | 指定执行脚本的shell | 指定RUN CMD ENTRYPOINT 执行命令的时候 使用的shell |
Dockerfile 案例
案例1需求:
自定义centos7镜像。要求:
- 默认登录路径为 /usr
- 可以使用vim
实现步骤:
① 定义父镜像:FROM centos:7
② 定义作者信息:MAINTAINER itheima
③ 执行安装vim命令: RUN yum install -y vim
④ 定义默认的工作目录:WORKDIR /usr
⑤ 定义容器启动执行的命令:CMD /bin/bash
⑥ 通过 dockerfile 构建镜像:docker bulid –f dockerfile文件路径 –t 镜像名称:版本
Docker 服务编排
服务编排概念
微服务架构应用系统中一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启动停止,维护的工作量会很大。
• 要从Dockerfile build image 或者去dockerhub拉取image
• 要创建多个container
• 要管理这些container(启动停止删除)
服务编排:按照一定的业务规则批量管理容器
Docker Compose
Docker Compose是一个编排多容器分布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括服务构建,启动和停止。使用步骤:
- 利用 Dockerfile 定义运行环境镜像
- 使用 docker-compose.yml 定义组成应用的各服务
- 运行 docker-compose up 启动应用
安装Docker Compose
1 | |
卸载Docker
1 | |
使用docker compose编排nginx+springboot项目
1、创建docker-compose目录
1 | |
2、编写 docker-compose.yml 文件
1 | |
3、创建./nginx/conf.d目录
1 | |
4、在./nginx/conf.d目录下 编写itheima.conf文件
1 | |
5、在~/docker-compose 目录下 使用docker-compose 启动容器
1 | |
6、测试访问
1 | |
Docker私有仓库
Docker官方的Docker hub
是一个用于管理公共镜像的仓库,我们可以从上面拉取镜像到本地,也可以把我们自己的镜像推送上去。但是,有时候我们的服务器无法访问互联网,或者你不希望将自己的镜像放到公网当中,那么我们就需要搭建自己的私有仓库来存储和管理自己的镜像。
搭建私有仓库
1 | |
上传镜像到私有仓库
1 | |
从私有仓库拉取镜像
1 | |
Docker相关概念
docker容器虚拟化与传统虚拟机比较
容器就是将软件打包成标准化单元,以用于开发、交付和部署。
- 容器镜像是轻量的、可执行的独立软件包 ,包含软件运行所需的所有内容:代码、运行时环境、系统工具、
系统库和设置。 - 容器化软件在任何环境中都能够始终如一地运行。
- 容器赋予了软件独立性,使其免受外在环境差异的影响,从而有助于减少团队间在相同基础设施上运行不同软件时的冲突。
相同:
- 容器和虚拟机具有相似的资源隔离和分配优势
不同:
- 容器虚拟化的是操作系统,虚拟机虚拟化的是硬件。
- 传统虚拟机可以运行不同的操作系统,容器只能运行同一类型操作系统
| 特性 | 容器 | 虚拟机 |
|---|---|---|
| 启动 | 秒级 | 分钟级 |
| 磁盘使用 | 一般为MB | 一般为GB |
| 性能 | 接近原生 | 弱于 |
| 系统支持量 | 单机支持上千个容器 | 一般几十个 |
Docker常见面试题及答案
1、什么是 Docker ?
Docker 是一个容器化平台,它以容器的形式将应用程序及其所有依赖项打包在一起,以确保应用程序在任何环境中无缝运行
2、什么是 Dockerfile ?
Dockerfile 是一个文本文件,其中包含我们需要运行以构建 Docker 映像的所有命令。Docker 使用 Dockerfile 中的指令自动构建镜像。
3、什么是 Docker 镜像?
Docker 镜像是 Docker 容器的源代码,Docker 镜像用于创建容器
4、什么是 Docker容器?
Docker 容器包括应用程序及其所有依赖项,作为操作系统的独立进程运行
5、Docker 容器有几种状态?
四种状态:运行、已暂停、重新启动、已退出
6、Dockerfile 中最常见的指令是什么?
FROM:指定基础镜像
LABEL:为镜像指定标签
RUN:运行指定的命令
CMD:容器启动时要运行的命令
7、Dockerfile 中的命令 COPY 和 ADD 命令有什么区别?
COPY与ADD的区别COPY的SRC只能是本地文件,其他用法一致
8、docker 常用命令
docker pull 拉取或者更新指定镜像
docker push 将镜像推送至远程仓库
docker rm 删除容器
docker rmi 删除镜像
docker images 列出所有镜像
docker ps 列出所有容器
9、Docker 架构组成
三个架构组件包括 Docker 客户端、主机和注册表
Docker 客户端:该组件执行构建和运行操作以与 Docker 主机通信。
Docker 主机:该组件包含 Docker 守护程序、Docker 镜像和 Docker 容器。守护进程建立到 Docker Registry 的连接。
Docker Registry:该组件存储 Docker 镜像。它可以是公共注册表,例如 Docker Hub 或 Docker Cloud,也可以是私有注册表。
10、容器与主机之间的数据拷贝命令
docker cp 命令用于容器与主机之间的数据拷贝
主机到容器:
docker cp /www 96f7f14e99ab:/www/
容器到主机:
docker cp 96f7f14e99ab:/www /tmp/
11、什么是 Docker Swarm ?
Docker Swarm 是一个容器编排工具,它允许我们跨不同主机管理多个容器。使用 Swarm,我们可以将多个 Docker 主机变成单个主机,以便于监控和管理
12、虚拟化和容器化有什么区别?
虚拟化:
虚拟化帮助我们在单个物理服务器上运行和托管多个操作系统。在虚拟化中,管理程序为客户操作系统提供了一个虚拟机。VM 形成了硬件层的抽象,因此主机上的每个 VM 都可以充当物理机
容器化:
容器化为我们提供了一个独立的环境来运行我们的应用程序。我们可以在单个服务器或 VM 上使用相同的操作系统部署多个应用程序。容器构成了应用层的抽象,所以每个容器代表一个不同的应用
13、什么是 Docker 引擎?
Docker Engine 是一种开源容器化技术,我们可以使用它来构建和容器化我们的应用程序。Docker Engine 由以下组件支持:
- Docker 引擎 REST API
- Docker 命令行界面 (CLI)
- Docker 守护进程
14、如何访问正在运行的容器?
1 | |
15、描述 Docker 容器的生命周期
Docker 容器经历以下阶段:
- 创建容器
- 运行容器
- 暂停容器(可选)
- 取消暂停容器(可选)
- 启动容器
- 停止容器
- 重启容器
- 杀死容器
- 销毁容器
16、什么是 Docker 对象标签?
Docker 对象标签是存储为字符串的键值对。它们使我们能够将元数据添加到 Docker 对象,例如容器、网络、本地守护进程、图像、Swarm 节点和服务
16、如何在生产中监控 Docker ?
Docker 提供 docker stats 和 docker 事件等工具来监控生产中的 Docker。我们可以使用这些命令获取重要统计数据的报告。
Docker 统计数据:当我们使用容器 ID 调用 docker stats 时,我们获得容器的CPU,内存使用情况等。它类似于Linux中的top命令。
Docker事件:Docker 事件是一个命令,用于查看 Docker 守护程序中正在进行的活动流。
一些常见的Docker事件是:attach,commit,die,detach,rename,destroy 等。我们还可以使用各种选项来限制或过滤我们感兴趣的事件
17、一些重要的 Docker 命令
- build:为Docker构建一个镜像文件
- create:用于创建新容器
- kill:杀死一个容器
- dockerd:用于启动 Docker 守护进程
- commit:用于从容器更改创建新镜像
18、Docker 中的命名空间是什么?
Docker Namespaces 是一种提供隔离工作区的技术,称为容器。一旦容器启动,就会为所述容器创建一组命名空间。这些命名空间为这些容器提供了一层隔离,因为每个容器在不同的命名空间中运行,其访问仅限于提到的命名空间。
19、Docker 中的 compose 文件可以使用 JSON 代替 YAML 吗?
可以,Docker 撰写文件可以使用 JSON 代替 YAML。要使用 JSON 文件进行组合,文件名应指定如下:
“docker-compose -f docker-compose.json up。”
20、什么是虚拟化?
在早期,虚拟化被称为一种逻辑划分大型机以允许多个应用程序同时运行的方法。但是随着时间的推移,行业能够允许在一个基于 x86 的系统上同时运行多个操作系统,虚拟化的含义发生了很大的变化。虚拟化允许用户在同一硬件上运行两个不同的操作系统。虽然主要操作系统是管理员,但每个客户操作系统都会经历诸如引导、加载内核等过程。它也非常适合安全性,因为可能不允许每个来宾操作系统完全访问主机操作系统,从而导致数据泄露。
主要有三种类型的虚拟化:
- 半虚拟化
- 仿真
- 基于容器的虚拟化