前言:

推荐免费Docker基础讲解视频:【狂神说Java】Docker最新超详细版教程通俗易懂_哔哩哔哩_bilibili

Docker概述

Docker的出现

之前发布一个项目:(jar+(Redis MySQL jdk ES)),项目不能带上环境打包;在服务器配置一个应用环境,配置繁琐且不能跨平台。

Docker的出现,解决以上的问题!

image-20220921122111647

Docker的思想来自于集装箱!

隔离:Docker的核心思想,打包装箱,每个箱子是相互隔离的;

Docker的发展

Docker 是Paas提供商 dotCloud 开源的一个基于LXC的高级容器引擎,源代码托管在 Github 上, 基于go语言并遵从Apache2.0协议开源。

Docker自2013年以来非常火热,无论是从 github 上的代码活跃度,还是Redhat在RHEL6.5中集成对Docker的支持, 就连 Google 的 Compute Engine 也支持 docker 在其之上运行。

在Docker出现之前,我们使用虚拟机基数!

虚拟机也属于虚拟化技术,Docker容器技术,也是一种虚拟化技术!

虚拟机:占用空间大,启动速度慢,笨重!

Docker:占用小,启动快!

Docker网址

Docker官网:Home - Docker

官方文档:Orientation and setup | Docker Documentation

Dockerhub:Docker Hub Container Image Library | App Containerization

Docker的作用和基本组成

Docker的作用

虚拟机技术

image-20220921130641210

虚拟机技术缺点:

  1. 资源占用多;
  2. 冗余步骤多;
  3. 启动慢;

容器化技术

image-20220921131121467

容器的技术:

  • 容器内的应用直接运行在宿主机的内容,容器本身没有内核,也没有虚拟我们的硬件,占用很小;
  • 每个容器相互隔离,容器内部都有一个属于自己的文件系统,互不影响;

DevOps

  • 应用更快速的交付和部署;
  • 更便捷的升级和扩缩容;
  • 更简单的系统运维;
  • 更高效的计算资源利用;

Docker基本组成

Docker 包括三个基本概念:

  • 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。
  • 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  • 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。

image-20220921132637543

Docker安装及流程和原理

Docker安装

环境准备

  1. 购买一台服务器

    购买参考:【服务器购买】阿里云服务器购买和简单部署 | Hey,Joker (jokerdig.com)

  2. Linux基础

  3. CentOS 7或CentOS 8

  4. 使用Xshell连接远程服务器

环境查看

1
2
3
# 系统内核 3.0+即可
[root@jokerdig ~]# uname -r
5.10.112-11.1.al8.x86_64

安装

  1. 打开Docker引擎Linux安装地址

    Install Docker Engine on CentOS | Docker Documentation

  2. 卸载旧的版本

    1
    2
    3
    4
    5
    6
    7
    8
    yum remove docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-logrotate \
    docker-engine
  3. 安装

    安装的方法很多,我们使用yum进行安装

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    # 需要安装的包
    yum install -y yum-utils
    # docker仓库地址(官方)
    yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
    # (可选)阿里云docker仓库镜像地址
    yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    # 更新yum软件包索引 CentOS 7
    yum makecache fast
    # 更新yum软件包索引 CentOS 8
    yum makecache
    # 安装最新版docker引擎
    yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
  4. 启动Docker

    1
    systemctl start docker
  5. 验证Docker时候安装成功 hello-world

    1
    docker run hello-world

    运行结果

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    Hello from Docker!
    This message shows that your installation appears to be working correctly.

    To generate this message, Docker took the following steps:
    1. The Docker client contacted the Docker daemon.
    2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
    3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
    4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

    To try something more ambitious, you can run an Ubuntu container with:
    $ docker run -it ubuntu bash

    Share images, automate workflows, and more with a free Docker ID:
    https://hub.docker.com/

    For more examples and ideas, visit:
    https://docs.docker.com/get-started/

    [root@jokerdig ~]#
  6. 查看Docker版本信息和镜像

    1
    2
    3
    4
    5
    6
    7
    # 查看版本信息
    docker version
    # 查看镜像
    docker images
    # 镜像的信息
    REPOSITORY TAG IMAGE ID CREATED SIZE
    hello-world latest feb5d9fea6a5 12 months ago 13.3kB
  7. 卸载Docker步骤

    1
    2
    3
    4
    5
    # 卸载Docker引擎
    yum remove docker-ce docker-ce-cli containerd.io docker-compose-plugin
    # 删除Docker所有映像、容器和卷
    rm -rf /var/lib/docker
    rm -rf /var/lib/containerd

Docker流程分析和原理

Run流程分析图

image-20220921142122580

底层原理

Docker如何工作的?

Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上。通过Socket从客户端访问!

Docker-Server接收到Docker-Client的指令,就会执行该命令!

image-20220921143115665

Docker为什么比虚拟机快?

  • Docker有着比虚拟机更少的抽象层;
  • Docker利用的是宿主机的内核,VM需要的是Guest OS;

image-20220921143737896

镜像的基本命令

帮助命令

1
2
3
docker version # 显示docker的版本信息
docker info # 显示docker的系统信息(包括镜像和容器)
docker 命令 --help # docker帮助命令

镜像的基本命令

官方命令文档:Docker run reference | Docker Documentation

  1. docker images

    1
    2
    # 查看本地主机所有镜像
    docker images [OPTIONS] [REPOSITORY[:TAG]]

    选项(OPTIONS)

    选项名 默认 描述
    --all , -a 显示所有图像(默认情况下隐藏中间图像)
    --digests 显示摘要
    --filter , -f 基于所提供条件的过滤器输出
    --format 使用Go模板打印精美图像
    --no-trunc 不截断输出
    --quiet , -q 仅显示图像ID

    测试

    1
    2
    3
    4
    [root@jokerdig ~]# docker images
    # 仓库源 标签 镜像ID 创建时间 大小
    REPOSITORY TAG IMAGE ID CREATED SIZE
    hello-world latest feb5d9fea6a5 12 months ago 13.3kB
  2. docker search

    1
    2
    # 在Docker Hub中搜索镜像
    docker search [OPTIONS] TERM

    选项(OPTIONS)

    选项名 默认 描述
    --filter , -f 基于所提供条件的过滤器输出
    --format 使用Go模板进行漂亮的打印搜索
    --limit 25 最大搜索结果数
    --no-trunc 不截断输出

    测试

    1
    2
    3
    4
    5
    6
    7
    8
    # 搜索mysql
    [root@jokerdig ~]# docker search mysql
    #名称 说明
    NAME DESCRIPTION
    #星⭐ 官方 自动化
    STARS OFFICIAL AUTOMATED
    mysql MySQL is a widely used, open-source relation… 13207 [OK]
    ...............
  3. docker pull

    1
    2
    # 提取(下载)镜像或存储库
    docker pull [OPTIONS] NAME[:TAG|@DIGEST]

    选项(OPTIONS)

    选项名 默认 描述
    --all-tags , -a 下载存储库中所有标记的镜像
    --disable-content-trust true 跳过图像验证
    --platform 如果服务器支持多平台,则设置平台
    --quiet , -q 禁止详细输出

    测试

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    # 下载mysql(默认最新版)
    [root@jokerdig ~]# docker pull mysql
    Using default tag: latest # 如果不指定tag,默认下载最后一个版本
    latest: Pulling from library/mysql
    051f419db9dd: Pull complete # 分层下载,docker核心
    7627573fa82a: Pull complete
    a44b358d7796: Pull complete
    95753aff4b95: Pull complete
    a1fa3bee53f4: Pull complete
    f5227e0d612c: Pull complete
    b4b4368b1983: Pull complete
    f26212810c32: Pull complete
    d803d4215f95: Pull complete
    d5358a7f7d07: Pull complete
    435e8908cd69: Pull complete
    Digest: sha256:b9532b1edea72b6cee12d9f5a78547bd3812ea5db842566e17f8b33291ed2921 # 签名
    Status: Downloaded newer image for mysql:latest
    docker.io/library/mysql:latest # 真实地址

    # 指定版本下载mysql 8.0
    # 这里官方默认下载的就是8.0的,所以不会重复下载,如果换其他版本,它只会去下载与当前版本不同的内容,而相同的内容直接共用,不需要再次下载。
    [root@jokerdig ~]# docker pull mysql:8.0
    8.0: Pulling from library/mysql
    Digest: sha256:b9532b1edea72b6cee12d9f5a78547bd3812ea5db842566e17f8b33291ed2921
    Status: Downloaded newer image for mysql:8.0
    docker.io/library/mysql:8.0
  4. docker rmi

    1
    2
    # 删除一个或多个镜像
    docker rmi [OPTIONS] IMAGE [IMAGE...]

    选项(OPTIONS)

    名称 默认 描述
    --force , -f 强制删除镜像
    --no-prune 不要删除未标记的父项

    测试

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    # 删除mysql(可以通过名称或者ID删除)
    # 删除所有镜像 docker rmi -f $(docker images -aq)
    [root@jokerdig ~]# docker rmi -f 43fcfca0776d
    Untagged: mysql:8.0
    Untagged: mysql:latest
    Untagged: mysql@sha256:b9532b1edea72b6cee12d9f5a78547bd3812ea5db842566e17f8b33291ed2921
    Deleted: sha256:43fcfca0776df8e192d1647da2866237fbd9f8e875fb496e4ca887369b2dd995
    Deleted: sha256:45d11760ca3e62bb36a589002b413a42c60c9b917b7a089b116c1ab69155aa4d
    Deleted: sha256:af1876abdf5bbbef0ac13e24068669d600bf7de8aa74f31a43ae5f56b83331c2
    Deleted: sha256:e1668f1334215580aa7a19beef5d1ee6c6ba121c305154f1ddd7253e21bf65e8
    Deleted: sha256:91d92a76bd6a29d88aa511715731ac59d1df33c8e4f5b393dbc16c16b9c08b1c
    Deleted: sha256:8608eb76a683654e96af6087a19f416c4498e46f1121e15d63d2ce983750a3a2
    Deleted: sha256:fd95c084aad87623a6db2c76480f0765e16ae2ba6de68ce1aefdb7ea4e8fe120
    Deleted: sha256:968e68a28e13606ce58651654f554c342f51d5f3ea7e792cdcb21809fefe1a4f
    Deleted: sha256:15628dda9c1556632ae3577f5dd8ff16c6456fb95da60284783e8c1f89c588ae
    Deleted: sha256:49904d4d7d64ce4a3b64466e4d9bdc624fa8acc760c6a622dcbde03a0ada9fed
    Deleted: sha256:df0e3d67e1ecb153c572e3110d36a8bbc46ded2dc376395384c6171732241d90
    Deleted: sha256:05dc728e5e49b5db657ec403b875f757afdd8d31f624eea76d706d6eee6395b2
    # 查看镜像,mysql已经被删除
    [root@jokerdig ~]# docker images
    REPOSITORY TAG IMAGE ID CREATED SIZE
    hello-world latest feb5d9fea6a5 12 months ago 13.3kB

容器的基本命令

准备工作

有了镜像在可以创建容器,这里我们下载一个CentOS镜像来进行测试;

下载CentOS镜像

1
docker pull centos

容器的基本命令

  1. docker run

    1
    2
    # 创建一个新的容器并运行一个命令
    docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

    选项(OPTIONS)

    名称 描述
    -a stdin 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
    -d 后台运行容器,并返回容器ID;
    -i 以交互模式运行容器,通常与 -t 同时使用;
    -P 随机端口映射,容器内部端口随机映射到主机的端口;
    -p 指定端口映射,格式为:主机(宿主)端口:容器端口
    -t 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
    --name="Name" 为容器指定一个名称;
    --dns 8.8.8.8 指定容器使用的DNS服务器,默认和宿主一致;
    --dns-search example.com 指定容器DNS搜索域名,默认和宿主一致;
    -h "mars 指定容器的hostname;
    -e username="ritchie" 设置环境变量;
    --env-file=[] 从指定文件读入环境变量;
    --cpuset="0-2" or --cpuset="0,1,2" 绑定容器到指定CPU运行;
    -m 设置容器使用内存最大值;
    --net="bridge" 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
    --link=[] 添加链接到另一个容器;
    --expose=[] 开放一个端口或一组端口;
    --volume , -v 绑定一个卷

    测试

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 运行centos镜像,并进入容器
    [root@jokerdig ~]# docker run -it centos /bin/bash
    [root@20adf34e67c1 /]# ls
    bin home lost+found opt run sys var
    dev lib media proc sbin tmp
    etc lib64 mnt root srv usr
    # 退出容器(直接退出)
    [root@20adf34e67c1 /]# exit
    exit
    # 退出但不停止 ctrl+P+Q
    [root@jokerdig ~]#
  2. docker ps

    1
    2
    # 列出容器
    docker ps [OPTIONS]

    选项

    名称 默认 描述
    --all , -a 显示所有容器(默认显示正在运行)
    --filter , -f 基于所提供条件的过滤器输出
    --format 根据提供的条件筛选输出使用Go模板漂亮地打印容器
    --last , -n -1 显示n个上次创建的容器(包括所有状态)
    --latest , -l 显示最新创建的容器(包括所有状态)
    --no-trunc 不截断输出
    --quiet , -q 仅显示容器ID
    --size , -s 显示总文件大小

    测试

    1
    2
    3
    4
    5
    6
    # 查看运行过的容器
    [root@jokerdig ~]# docker ps -a
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    20adf34e67c1 centos "/bin/bash" 18 minutes ago Exited (0) 17 minutes ago hardcore_solomon
    2597d73a7546 hello-world "/hello" 2 hours ago Exited (0) 2 hours ago keen_cori
    0b315095fc9e hello-world "/hello" 2 weeks ago Exited (0) 2 weeks ago keen_kalam
  3. docker rm

    1
    2
    # 移除一个或多个容器
    docker rm [OPTIONS] CONTAINER [CONTAINER...]

    选项(OPTIONS)

    名称 默认 描述
    --force , -f 强制移除正在运行的容器(使用SIGKILL)
    --link , -l 删除指定的链接
    --volumes , -v 删除与容器关联的匿名卷

    测试

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # 删除容器(可以通过名称或者ID删除)
    # 删除所有容器 docker rm -f $(docker ps -aq)
    [root@jokerdig ~]# docker ps -a
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    20adf34e67c1 centos "/bin/bash" 18 minutes ago Exited (0) 17 minutes ago hardcore_solomon
    2597d73a7546 hello-world "/hello" 2 hours ago Exited (0) 2 hours ago keen_cori
    0b315095fc9e hello-world "/hello" 2 weeks ago Exited (0) 2 weeks ago keen_kalam
    # 移除ID为(0b315095fc9e)的容器,不能删除正在运行的容器
    [root@jokerdig ~]# docker rm -f 0b315095fc9e
    0b315095fc9e
    [root@jokerdig ~]# docker ps -a
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    20adf34e67c1 centos "/bin/bash" 31 minutes ago Exited (0) 29 minutes ago hardcore_solomon
    2597d73a7546 hello-world "/hello" 2 hours ago Exited (0) 2 hours ago keen_cori
  4. docker start

    1
    2
    # 启动一个或多个停止的容器
    docker start [OPTIONS] CONTAINER [CONTAINER...]

    选项(OPTIONS)

    名称 默认 描述
    --attach , -a 连接STDOUT/STDERR和转发信号
    --checkpoint experimental (daemon) 从此检查点还原
    --checkpoint-dir experimental (daemon) 使用自定义检查点存储目录
    --detach-keys 覆盖用于分离容器的键序列
    --interactive , -i 附加容器的STDIN

    测试

    1
    2
    [root@jokerdig ~]# docker start 20adf34e67c1
    20adf34e67c1
  5. docker stop

    1
    2
    # 停止一个或多个正在运行的容器
    docker stop [OPTIONS] CONTAINER [CONTAINER...]

    选项(OPTIONS)

    名称 默认 描述
    --time , -t 10 在杀死它之前等待停止的秒数

    测试

    1
    2
    [root@jokerdig ~]# docker stop 20adf34e67c1
    20adf34e67c1
  6. docker restart

    1
    2
    # 重新启动一个或多个容器
    docker restart [OPTIONS] CONTAINER [CONTAINER...]

    选项(OPTSIONS)

    名称 默认 描述
    --time , -t 10 在杀死它之前等待停止的秒数

    测试

    1
    2
    [root@jokerdig ~]# docker restart 20adf34e67c1
    20adf34e67c1
  7. docker kill

    1
    2
    # 杀死一个或多个正在运行的容器
    docker kill [OPTIONS] CONTAINER [CONTAINER...]

    选项(OPTIONS)

    名称 默认 描述
    --signal , -s KILL 发送到容器的信号

    测试

    1
    2
    [root@jokerdig ~]# docker kill 20adf34e67c1
    20adf34e67c1