Docker

第一节 Docker 安装与启动

1.1 Docker 相关资源网址

docker 官网(国外网站访问很慢):http://www.docker.com

Docker Hub 仓 库 官 网 ( 国 外 网 站 很 慢 , 推 荐 使 用 国 内 镜 像 ) :

https://hub.docker.com/

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 网 址 为 :

https://hub.docker.com/

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

进入容器,在容器数据卷目录尝试创建文件或写入文件,都会提示失败

在宿主机,对数据卷目录进行数据操作,会自动同步到容器数据卷目录中

 

posted @ 2022-07-12 09:01  carat9588  阅读(75)  评论(0编辑  收藏  举报