Docker简介

  • Docker之所以发展如此迅速,也是因为它对此给出了一个标准化的解决方案—–系统平滑移植,容器虚拟化技术。
  • 环境配置相当麻烦,换一台机器,就要重来一次,费力费时。很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说,安装的时候,把原始环境一模一样地复制过来。开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题。
  • Docker的出现使得其得以打破过去「程序即应用」的观念。透过镜像将作业系统核心除外,运作应用程式所需要的系统环境,由下而上打包,达到应用程式跨平台间的无缝接轨运作。
  • Docker是基于Go语言实现的云开源项目。
  • Linux容器技术的出现就解决了这样一个问题,而 Docker 就是在它的基础上发展过来的。将应用打成镜像,通过镜像成为运行在Docker容器上面的实例,而 Docker容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。
  • 总结就是,Docker解决了运行环境和配置问题的软件容器, 方便做持续集成并有助于整体发布的容器虚拟化技术。

Snipaste_2021-07-29_17-21-42.jpg

Snipaste_2021-07-29_17-21-42.jpg

安装

前提

  • Docker支持以下的CentOS版本:
    • Docker运行在CentOS7上,要求系统为64位、系统内核版本为3.8以上。
    • Docker运行在CentOS-6.5或更高的版本的CentOS上,要求系统为64位、系统内核版本为2.6.32-431或者更高版本。

三要素

  • 镜像
    • Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。
    • docker镜像文件类似于Java的类模板,而docker容器实例类似于java中new出来的实例对象。
  • 容器
    • 容器是用镜像创建的运行实例
    • 容器为镜像提供了一个标准的和隔离的运行环境,它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台
    • 可以把容器看做是一个简易版的 Linux 环境
  • 仓库
    • 仓库是集中存放镜像文件的场所。
    • 仓库分为公开仓库和私有仓库两种形式。最大的公开仓库是 Docker Hub(https://hub.docker.com/),%EF%BC%8C)

Snipaste_2021-07-29_17-21-42.jpg

开始安装

  • 官方文档:http://xn--https-pja//docs.docker.com/engine/install/centos/

  • 虚拟机联网

  • 安装gcc

    1
    [root@hadoop1 ~]# yum -y install gcc
  • 安装gcc-c++

    1
    [root@hadoop1 ~]# yum -y install gcc-c++
  • 安装yum-utils

    1
    [root@hadoop1 ~]# yum install -y yum-utils
  • 设置stable镜像仓库(这里使用阿里云镜像)

    1
    [root@hadoop1 ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  • 安装docker

    1
    [root@localhost etc]# yum -y install docker-ce docker-ce-cli containerd.io
  • 启动docker

    1
    [root@localhost /]# systemctl start docker
  • 查看版本

    1
    [root@localhost /]# docker version
  • 运行

    1
    [root@localhost /]# docker run hello-world

镜像加速

常用命令

基础命令

1
2
3
4
5
6
7
8
启动docker: systemctl start docker
停止docker: systemctl stop docker
重启docker: systemctl restart docker
查看docker状态: systemctl status docker
开机启动: systemctl enable docker
查看docker概要信息: docker info
查看docker总体帮助文档: docker --help
查看docker命令帮助文档: docker 具体命令 --help

镜像命令

  • 查看本地所有镜像

    1
    docker images
    • 显示的表中名称意义

      1
      2
      3
      4
      5
      REPOSITORY:表示镜像的仓库源
      TAG:镜像的标签版本号
      IMAGE ID:镜像ID
      CREATED:镜像创建时间
      SIZE:镜像大小
    • OPTIONS说明:

      1
      2
      3
      4
      5
      REPOSITORY:表示镜像的仓库源
      TAG:镜像的标签版本号
      IMAGE ID:镜像ID
      CREATED:镜像创建时间
      SIZE:镜像大小
  • 去总库查询相关镜像

    1
    2
    3
    4
    5
    docker search [OPTIONS] 镜像名字 某个镜像名字
    OPTIONS说明:
    --limit : 只列出N个镜像,默认25个
    例子:
    docker search --limit 5 redis
  • 下载镜像

    1
    docker pull 镜像名字[:TAG]
    • 说明:tag为版本号,默认为最新版
  • 查看空间占用情况

    1
    docker system df   #查看镜像/容器/数据卷所占的空间
  • 删除本地镜像

    1
    docker rmi  -f 镜像ID/名字:tag

docker虚悬镜像

1
仓库名、标签都是<none>的镜像,俗称虚悬镜像

容器命令

  • 拉取一个镜像

    1
    [root@localhost ~]# docker pull ubuntu
  • 构建容器

    1
    docker run [OPTIONS] 镜像名 [COMMAND] [ARG...]
    • OPTIONS说明:

      1
      2
      3
      4
      5
      6
      --name="容器新名字"       #为容器指定一个名称
      -d #后台运行容器并返回容器ID,也即启动守护式容器(后台运行)
      -i #以交互模式运行容器,通常与 -t 同时使用
      -t #为容器重新分配一个伪输入终端,通常与 -i 同时使用;也即启动交互式容器(前台有伪终端,等待交互)
      -P #随机端口映射,大写P
      -p #指定端口映射,小写p
    • 举例

      1
      [root@localhost ~]# docker run -it ubuntu /bin/bash
  • 退出容器

    1
    exit
  • 启动容器

    1
    docker start 容器ID或者容器名
  • 停止容器

    1
    docker stop 容器ID或者容器名
  • 删除容器

    1
    docker rm 容器ID
  • 查看运行中的容器

    1
    2
    3
    4
    5
    6
    7
    docker ps [OPTIONS]
    OPTIONS说明:
    -a :列出当前所有正在运行的容器+历史上运行过的
    -l :显示最近创建的容器。
    -n:显示最近n个创建的容器。
    -q :静默模式,只显示容器编号。
    [root@localhost ~]# docker ps
  • 从容器内拷贝文件到主机上

    1
    docker cp  容器ID:容器内路径 目的主机路径
  • export 导出容器的内容留作为一个tar归档文件

    1
    docker export 容器ID > 文件名.tar
  • import 从tar包中的内容创建一个新的文件系统再导入为镜像

    1
    cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号

重要

  • 有镜像才能创建容器,这是根本前提

  • Docker容器后台运行,就必须有一个前台进程,否则会自行销毁

    • 前台交互式启动

      1
      docker run -it redis:6.0.8
    • 后台守护式启动

      1
      docker run -d redis:6.0.8
  • 查看容器日志

    1
    docker logs 容器ID
  • 查看容器内运行的进程

    1
    docker top 容器ID
  • 进入正在运行的容器并以命令行交互

    1
    docker exec/attach -it 容器ID bashShell
    • exec 是在容器中打开新的终端,并且可以启动新的进程 用exit退出,不会导致容器的停止。(推荐)
    • attach 直接进入容器启动命令的终端,不会启动新的进程 用exit退出,会导致容器的停止。

镜像

介绍

镜像是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个运行环境就是image镜像文件。

分层的镜像

  • UnionFS(联合文件系统)

    Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。

  • UnionFS是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

  • 特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录

Docker镜像加载原理

  • docker的镜像实际上由一层一层的文件系统组成(UnionFS)
  • bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是引导文件系统bootfs。
  • rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。 对于不同的linux发行版, bootfs基本是一致的, rootfs会有差别, 因此不同的发行版可以公用bootfs。
  • 镜像分层最大的一个好处就是共享资源,方便复制迁移,就是为了复用。

Snipaste_2021-07-29_17-21-42.jpg

commit

  • docker commit提交容器副本使之成为一个新的镜像

    1
    docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
  • 例子

    • 原始的默认Ubuntu镜像是不带着vim命令的

    • 执行

      1
      2
      apt-get update    #更新包管理工具
      apt-get -y install vim #安装vim
    • 安装完成后,commit新镜像

  • Docker中的镜像分层,支持通过扩展现有镜像,创建新的镜像。

提交镜像到阿里云库

Docker私有库

  • 下载镜像Registry

    1
    docker pull registry 
  • 运行私有库Registry,相当于本地有个私有Docker hub

  • 修改符合私服规范的Tag

  • 修改配置文件使之支持http

  • push推送到私服库

    1
    docker push ip:port/id:tag

Docker容器数据卷

Docker挂载主机目录访问如果出现cannot open directory .: Permission denied,解决办法:在挂载目录后多加一个--privileged=true参数即可

  • 卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷

  • 将运用与运行的环境打包镜像,run后形成容器实例运行 ,但是我们对数据的要求希望是持久化的

  • 将docker容器内的数据保存进宿主机的磁盘中

  • 运行一个带有容器卷存储功能的容器实例

    1
    docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
    • 容器和宿主机之间数据共享

    • 读写规则映射添加说明

      • 读写(默认):rw

      Snipaste_2021-07-29_17-21-42.jpg

      • 只读:ro
  • 卷的继承和共享

    • 容器1完成和宿主机的映射

      1
      docker run -it  --privileged=true -v /mydocker/u:/tmp --name u1 ubuntu
    • 容器2继承容器1的卷规则

      1
      docker run -it  --privileged=true --volumes-from 父类  --name u2 ubuntu

常用镜像安装

tomcat

  • dockerhub上面查找tomcat镜像

  • 也可通过docker search tomcat搜索相关镜像

  • 拉取镜像

    1
    docker pull tomcat
  • 运行镜像并构建容器

    1
    [root@localhost ~]# docker run -d -p 8080:8080 --name t1 tomcat
    • 注:新版tomcat可能会出现访问首页404的问题(没有映射端口或者没有关闭防火墙),解决方案:
      • 先成功启动tomcat
      • 进入命令行窗口[root@localhost ~]# docker exec -it 1e843aca6059 bash
      • 查看目录ls -l,发现有webappswebapps.dist两个文件夹,需要将webapps删除,将webapps.dist命名为webapps
      • 删除webappsrm -r webapps
      • 重命名:mv webapps.dist webapps
      • 此时即可访问localhost:8080端口
  • 可安装免修改的tomcat8

    1
    2
    docker pull billygoo/tomcat8-jdk8
    docker run -d -p 8080:8080 --name mytomcat8 billygoo/tomcat8-jdk8

mysql

  • docker安装完MySQL并run出容器后,建议请先修改完字符集编码后再新建mysql库-表-插数据

redis

  • 拉取镜像

    1
    docker pull redis:6.0.8
  • 在宿主机下新建目录/app/redis

    1
    mkdir -p /app/redis
  • 将一个redis.conf文件模板拷贝进/app/redis目录下

    1
    cp /etc/redis.conf /app/redis/
  • 修改redis.conf

    • 允许redis外地连接 必须注释掉 bind 127.0.0.1
    • daemonize yes注释起来或者 daemonize no设置,因为该配置和docker run中-d参数冲突,会导致容器一直启动失败
    • 开启redis数据持久化 appendonly yes 可选
  • 创建容器

    1
    docker run  -p 6379:6379 --name myr3 --privileged=true -v /app/redis/redis.conf:/etc/redis/redis.conf -v /app/redis/data:/data -d redis:6.0.8 redis-server /etc/redis/redis.conf
  • 测试连接

    1
    docker exec -it 711a23222ef4 redis-cli