Docker
第一节 Docker 安装与启动
1.1 Docker 相关资源网址
docker 官网(国外网站访问很慢):http://www.docker.com
Docker Hub 仓 库 官 网 ( 国 外 网 站 很 慢 , 推 荐 使 用 国 内 镜 像 ) :
Docker Hub 类似于 git hub,存储了很多的已经打包好的镜像
1.2 Docker 安装前置条件
Docker 支持以下的 CentOS 版本:CentOS 6.5 以上(64-bit) CentOS 7 (64-bit) 目前,CentOS 仅发行版本中的内核支持 Docker。
- Docker 运行在 CentOS 7 上,要求系统为 64 位、系统内核版本为 3.10 以上。
- Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系统为 64 位、系统内核版本为 6.32-431 或者更高版本。
查看自己的内核 uname 命令
uname 命令用于打印当前系统相关信息(内核版本号、硬件架构、主机名称和操作系统类型等)。
查看已安装的 CentOS 版本信息
1.3 Docker 的基本组成
镜像(image):Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。
容器(container):Docker 利用容器(Container)独立运行的一个或一组应用。容器是用镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的 Linux 环境(包括 root 用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。
仓库(repository):仓库(Repository)是集中存放镜像文件的场所。
仓库(Repository)和仓库注册服务器(Registry)是有区别的。仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
最大的公开仓库是 Docker Hub(https://hub.docker.com/),存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云 、网易云等。
仓储/镜像/容器这几个概念的总结:
Docker 本身是一个容器运行载体或称之为管理引擎。我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就似乎 image 镜像文件。只有通过这个镜像文件才能生成 Docker 容器。image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。
- image 文件生成的容器实例,本身也是一个文件,称为镜像文件。
- 一个容器运行一种服务,当我们需要的时候,就可以通过 docker 客户端创建一个对应的运行实例,也就是我们的容器。
- 至于仓储,就是放了一堆镜像的地方,我们可以把镜像发布到仓储中,需要的时候从仓储中拉下来就可以了。
1.4 Docker 的安装
Docker 版本分为 CE 版(免费版)和企业版(收费版),下面在 CentOS7.x 环境下安装 docker 免费版。首先通过 yum 安装 gcc 和 gcc-c++
yum install -y gcc
yum install -y gcc-c++
因为 CentOS 官方仓库中 docker 版本实在是太老旧,缺失了很多功能和特性,所以需要手工添加 Docker 官方仓库源来安装新版本的 Docker-CE。如果有旧版本 docker,首先卸载旧版本 docker
yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-selinux \ docker-engine-selinux \ docker-engine |
安装依赖组件
yum install -y yum-utils device-mapper-persistent-data lvm2
设置镜像仓库,国内用户推荐使用阿里云镜像仓库
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新 yum 软件包索引
yum makecache fast
安装 docker
yum install -y docker-ce
配置开机自启、启动 Docker
systemctl enable docker
systemctl start docker
查看当前 docker 安装版本
docker version
卸载 docker-ce 版本
systemctl stop docker
yum -y remove docker-ce
rm -rf /var/lib/docker
为了保证卸载干净,最好再执行一次完全卸载
yum remove docker \ docker-client \ docker-client- latest \ docker-common \ docker-latest \ docker-latest- logrotate \ docker-logrotate \ docker-selinux \ docker-engine- selinux \ docker-engine |
1.5 Docker 镜像加速
默认情况下 docker 会到 hub.docker.com 去拉取镜像,速度非常慢,推荐使国内镜像,需要进行配置,CentOS7 配置如下:首先在/etc 下创建 docker 目录
mkdir -p /etc/docker |
创建编辑/etc/docker/daemon.json 文件,并设置国内镜像源地址(选一个)
vi /etc/docker/daemon.json |
Docker 中国官方镜像加速
{ "registry-mirrors": ["https://registry.docker-cn.com"] } |
网易 163 镜像加速
{ "registry-mirrors": ["http://hub-mirror.c.163.com"] } |
中科大镜像加速
{ "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"] } |
阿里云需要设置账号
{ "registry-mirrors": ["https://{自已的账号}.mirror.aliyuncs.com"] } |
daemon.json 文件配置示例
重新加载服务配置文件
systemctl daemon-reload
重启 docker 服务
systemctl restart docker
第二节 Hello-World 镜像与运行原理
2.1 运行 hello-world 镜像
直接运行 hello-world 镜像
docker run hello-world
从上图开始看出,
- 首先 docker 会先到本地查找镜像,但是没有找到
- 然后到云端镜像仓库拉取镜像到本地
- 通过镜像运行了一个容器实例,执行输出“Hello from Docker”
- 输出之后,容器自动终止退出。
整个运行过程如下图:
再次运行 hello-world 镜像
docker run hello-world
2.2 hello-world 运行原理
Docker 是一个 Client-Server 结构的系统,Docker 守护进程运行在主机上,然后通过 Socket 连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。 容器,是一个运行时环境,就是我们前面说到的集装箱。
那么为什么 Docker 运行比虚拟机快呢?
(1)docker 有着比虚拟机更少的抽象层。由亍 docker 不需要 Hypervisor 实现硬件资源虚拟化,运行在 docker 容器上的程序直接使用的都是实际物理机的硬件资源。因此在 CPU、内存利用率上 docker 将会在效率上有明显优势。
(2)docker 利用的是宿主机的内核,而不需要 Guest OS。因此,当新建一个容器时,docker 不需要和虚拟机一样重新加载一个操作系统内核。仍而避免引寻、加载操作系统内核返个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载 Guest OS,返个新建过程是分钟级别的。而 docker 由于直接利用宿主机的操作系统,则省略了返个过程,因此新建一个 docker 容器只需要几秒钟。
第三节 Docker 命令
Docker 命令图
3.1 常用命令汇总:
attach # 当前 shell 下 attach 连接指定运行镜像
build # 通过 Dockerfile 定制镜像 commit # 提交当前容器为新的镜像
cp #从容器中拷贝指定文件或者目录到宿主机中
create # 创建一个新的容器,同 run,但不启动容器
diff # 查看 docker 容器变化
events # 从 docker 服务获取容器实时事件 exec # 在已存在的容器上运行命令
export # 导出容器的内容流作为一个 tar 归档文件[对应 import ] history # 展示一个镜像形成历史
images # 列出系统当前镜像
import # 从 tar 包中的内容创建一个新的文件系统映像[对应 export] info # 显示系统相关信息
inspect # 查看容器详细信息
kill # kill 指定 docker 容器
load # 从一个 tar 包中加载一个镜像[对应 save]
login # 注册或者登陆一个 docker 源服务器
logout # 从当前 Docker registry 退出 logs # 输出当前容器日志信息 port # 查看映射端口对应的容器内部源端口
pause # 暂停容器 ps # 列出容器列表
pull # 从 docker 镜像源服务器拉取指定镜像或者库镜像
push # 推送指定镜像或者库镜像至 docker 源服务器
restart # 重启运行的容器 rm # 移除一个或者多个容器
rmi # 移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器
才可继续或 -f 强制删除]
run # 创建一个新的容器并运行一个命令
save # 保存一个镜像为一个 tar 包[对应 load]
search # 在 docker hub 中搜索镜像
start # 启动容器 stop # 停止容器 tag # 给源中镜像打标签 top # 查看容器中运行的进程信息 unpause # 取消暂停容器 version # 查看 docker 版本号 wait # 截取容器停止时的退出状态值
12.1 帮助命令
查看版本信息
docker version
查看 docker 完整信息描述
docker info
帮助命令
docker --help
【参数】 命令
3.2 镜像命令
3.2.1 列出本地镜像列表
docker images
镜像源 标签版本 镜像ID
同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,我们使用REPOSITORY:TAG 来定义不同的镜像。
如果你不指定一个镜像的版本标签,例如你只使用 tomcat 而没有注明版本, docker 将默认使用 tomcat:latest 镜像。
OPTIONS 说明:
- -a 列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层)
- -q 只显示镜像 ID
- --digests:显示镜像的摘要信息
- --no-trunc:显示完整的镜像信息
3.2.2 查找某个镜像的信息
docker search [OPTIONS] 镜像名字
我 们 可 以 从 Docker Hub 网 站 来 搜 索 镜 像 , Docker Hub 网 址 为 :
3.2.3 拉取镜像到本地
docker pull 镜像名称[:TAG]
可以拉取某个镜像的最新版
也可以拉取某个镜像的指定版本
多个镜像不同版本
3.2.4 删除单个本地镜像,-f 参数表示强制删除
docker rmi [-f] 镜像名称或 ID[:TAG]
删除镜像不指定 TAG,默认删除 lastest 版本
删除指定 TAG 镜像
docker rmi nginx:1.18.0 |
删除所有本地镜像,可以用配合查询命令
docker rmi [-f] $(docker images -qa) |
3.3 容器命令
必须有镜像才能创建容器,下面拉取一个 centos 镜像作为示例。
会发现 centos 本地镜像只有 200 多兆,因为这个是个简易版的 linux,只保留了最核心的内容
3.3.1 新建启动容器
docker run [OPTIONS] IMAGE [COMMAND] [ARGS…]
OPTIONS 说明(常用):有些是一个横杠,有些是两个横岗
- --name="容器新名字": 为容器指定一个名称,默认会随机分配一个名字;
- -d: 后台运行容器,并返回容器 ID,也即启动守护式容器; -i:以交互模式运行容器,通常与 -t 同时使用;
- -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
- -P: 随机端口映射;
- -p: 指定端口映射,有以下四种格式
- ip:hostPort:containerPort
- ip::containerPort
- hostPort:containerPort
- containerPort
- (1)如果不以交互模式运行容器,直接 run,容器启动就会立即自动终止。
查看当前运行的容器列表什么都没有,运行容器可以用镜像名称也可以用镜像 ID
容器ID 镜像 命令 创建时间 状态
- (2)以交互模式运行容器,会自动进入运行的容器的命令终端
就是说,我们进入了 docker 中的 centos 系统
退出这个系统用 exit 命令
使用镜像 centos:latest 以交互模式启动一个容器,在容器内执行/bin/bash 命令
3.3.2 查看当前正在运行的 docker 容器
docker ps [OPTIONS]
OPTIONS 说明(常用):
- -a :列出当前所有正在运行的容器+历史上运行过的
- -l :显示最近创建的容器
- -n:显示最近 n 个创建的容器
- -q :静默模式,只显示容器编号
- --no-trunc :不截断输出
运行一个交互模式的容器,然后重新开一个连接窗口,使用 docker ps 命令查看当前运行的容器
3.3.4 退出容器
方式 1:停止容器并退出:exit 命令
方式 2:不停止容器退出伪终端:ctrl+P+Q
3.3.5 通过--name 手动给容器起名
docker run -it --name myredis redis:6.0.9
3.3.6 启动已停止的容器
docker start 容器名称或 ID
3.3.7 重启容器
docker restart 容器名称或 ID
3.3.8 停止容器
docker stop 容器名称或 ID
3.3.9 强制终止容器
docker kill 容器名称或 ID
3.3.10 删除已停止容器
docker rm [-f] 容器 ID/名称
3.3.11 删除所有容器
docker rm $(docker ps -a -q) |
加上-f可以强制删除运行中的容器
3.3.12 启动守护式容器
docker run -d 镜像名称或 ID
例如使用镜像 centos:latest 以后台模式启动一个容器
docker run -d centos
然后 docker ps -a 进行查看, 会发现容器已经退出,很重要的要说明的一点: Docker 容器后台运行,就必须有一个前台进程。容器运行的命令如果不是那些一直挂起的命令(比如运行 top,tail),就是会自动退出的。这个是 docker 的机制问题。
但是,这样做,nginx 为后台进程模式运行,就导致 docker 前台没有运行的应用,这样的容器后台启动后,会立即自杀,因为他觉得他没事可做了,所以,最佳的解决方案是,将你要运行的程序以前台进程的形式运行。
3.3.13 查看容器日志
启动 centos 容器,并执行一个 shell 脚本,死循环每隔两秒输出一行字符
交互模式启动方式:
docker run -it centos /bin/sh -c "while true;do echo hello zzyy;sleep 2;done"
守护式容器启动方式:
docker run -d centos /bin/sh -c "while true;do echo hello zzyy;sleep 2;done"
Ctrl+Q+P退出
查看容器日志
docker logs -f -t --tail 容器 id
-t 是加入时间戳 -f 跟随最新的日志打印
--tail 数字 显示最后多少条可以查看上例启动的 centos 输出的日志,初始显示 5 条
Ctrl+C退出
3.3.14 查看运行容器内的进程
docker top 容器 ID
3.3.15 查看容器内部细节
docker inspect 容器 ID
查看容器内部细节信息,会返回一个 json 串
3.3.16 进入正在运行的容器并以命令行交互方式
1:直接进入容器终端
docker attach 容器 ID
如果不能使用Ctrl+C或者Ctrl+Q+P退出,就关闭终端
2: 可以选择不进入终端,而在容器内部直接执行命令
docker exec -it 容器 ID bashShell
不进入容器终端直接执行命令操作容器,执行完毕还保留在当前宿主机终端
进入容器,和 attach 功能相同,这个必须用-it 选项
3.3.17 从容器内拷贝文件到主机上
docker cp 容器 ID:容器内路径 目的主机路径
拷贝容器中/root/a.txt 到宿主机中的/root 下
第四节 Docker 容器数据卷
4.1容器数据卷是什么?
- Docker 容器产生的数据,如果不通过 docker commit 生成新的镜像,使得数据做为镜像的一部分保存下来.那么当容器删除后,数据自然也就没有了。
- 卷就是目录或文件,存在于一个或多个容器中,由 docker 挂载到容器,但不属于联合文件系统,因此能够绕过 Union File System 提供一些用于持续存储或共享数据的特性。
- 卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此 Docker 不会在容器删除时删除其挂载的数据卷。
4.2容器数据卷的特点
1:数据卷可在容器之间、容器和宿主机之间共享或重用数据
2:卷中的更改可以直接生效
3:数据卷中的更改不会包含在镜像的更新中
4:数据卷的生命周期一直持续到没有容器使用它为止
4.3 V 命令容器内添加数据卷
docker run -it -v /宿主机目录:/容器内目录 镜像名称或 ID /bin/bash
启动一个 centos 容器,添加一个数据卷,宿主机目录是/myDockerData,容器目录是 containerVolume,目录会自动创建
通过 inspect 命令查看当前容器数据卷情况
docker inspect c84a7cd906e8
RW 为 true 表示数据是双向同步的
测试一下容器目录和宿主机目录是否数据同步,在两个目录中进行文件的创建,编辑内容操作,会发现两个目录的数据是双向同步的。备注 echo 的>是覆盖写入文件,>>是追加写入文件
测试一下停止容器后,修改宿主机目录的数据,重新启动容器后,数据是否能够同步,会发现重启容器后数据也是和宿主机目录的数据同步的。
启动容器时设置只读数据卷只读是指容器数据卷目录是只读的,自动同步宿主机的数据卷的数据
docker run -it -v /宿主机目录:/容器内目录:ro 镜像名称或 ID /bin/bash
执行命令,启动容器 docker run -it -v /myDockerData:/containerVolume:ro centos
/bin/bash
之后查看容器信息:docker inspect 3a5feb4a7a2a
进入容器,在容器数据卷目录尝试创建文件或写入文件,都会提示失败
在宿主机,对数据卷目录进行数据操作,会自动同步到容器数据卷目录中