文章

01.Docker 入门

01.Docker 入门

Docker 入门

Docker 介绍

Docker 和虚拟机区别?

image.png

虚拟机是携带操作系统,本身很小的应用程序却因为携带了操作系统而变得非常大,很笨重。Docker 是不携带操作系统的,所以 Docker 的应用就非常的轻巧。另外在调用宿主机的 CPU、磁盘等等这些资源的时候,拿内存举例,虚拟机是利用 Hypervisor 去虚拟化内存,整个调用过程是虚拟内存 ->虚拟物理内存 ->真正物理内存,但是 Docker 是利用 Docker Engine 去调用宿主的的资源,这时候过程是虚拟内存 ->真正物理内存。

 传统虚拟机Docker 容器
磁盘占用几个 GB 到几十个 GB 左右几十 MB 到几百 MB 左右
CPU 内存占用虚拟操作系统非常占用 CPU 和内存Docker 引擎占用极低
启动速度(从开机到运行项目)几分钟(从开启容器到运行项目)几秒
安装管理需要专门的运维技术安装、管理方便
应用部署每次部署都费时费力从第二次部署开始轻松简捷
耦合性多个应用服务安装到一起,容易互相影响每个应用服务一个容器,达成隔离
系统依赖需求相同或相似的内核,目前推荐是 Linux

Docker 应用场景

  • 容器化技术
  • 系统级别虚拟化技术
  • 轻便、容器间隔离
  • DevOps
  • 一键运行
  • 打包镜像,发布
  • 便捷升级和扩、缩容
  • 高效的计算资源利用

Docker 核心架构

Docker 架构图

![image.png800](https://raw.githubusercontent.com/hacket/ObsidianOSS/master/obsidian202403082250325.png)
  • 镜像image: 一个镜像代表一个应用环境,他是一个只读的文件,如 mysql 镜像,tomcat 镜像,nginx 镜像等
  • 容器container: 镜像每次运行之后就是产生一个容器,就是正在运行的镜像,特点就是可读可写;Docker 利用容器技术,独立运行一个或一组通过镜像来创建的应用。容器具备启动、停止、删除等的基本命令;可理解为简易的 Linux 系统。
  • 仓库repository: 用来存放镜像的位置,类似于 maven 仓库,也是镜像下载和上传的位置;公有仓库:Docker Hub。国内访问需采取加速措施。
  • dockerFile: docker 生成镜像配置文件,用来书写自定义镜像的一些配置
  • tar: 一个对镜像打包的文件,日后可以还原成镜像
概念说明
Docker 镜像 (Images)Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统。
Docker 容器 (Container)容器是独立运行的一个或一组应用,是镜像运行时的实体。
Docker 客户端 (Client)Docker 客户端通过命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 与 Docker 的守护进程通信。
Docker 主机 (Host)一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。
Docker RegistryDocker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。

Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。

一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。

通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 **latest** 作为默认标签。
Docker MachineDocker Machine 是一个简化 Docker 安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装 Docker,比如 VirtualBox、 Digital Ocean、Microsoft Azure。

Docker 原理

C-S 架构,容器之间互相隔离,通过 Socket 进行通信。

Docker 快于 VM 的原理

  • 比 VM 更少的抽象层
    ![
    500](https://raw.githubusercontent.com/hacket/ObsidianOSS/master/obsidian/202409230017268.png)
  • Docker 利用宿主机的内核, VM 需要 Guest OS

Docker 镜像、容器和仓库

容器是由镜像实例化而来。简单来说,镜像是文件,容器是进程。容器是基于镜像创建的,即容器中的进程依赖于镜像中的文件。

docker 的镜像概念类似虚拟机的镜像。是一个只读的模板,一个独立的文件系统,包括运行容器所需的数据,可以用来创建新的容器。

docker 利用容器来运行应用:docker 容器是由 docker 镜像创建的运行实例。

docker 容器类似虚拟机,可以执行包含启动,停止,删除等。每个容器间是相互隔离的。容器中会运行特定的运用,包含特定应用的代码及所需的依赖文件。可以把容器看作一个简易版的 linux 环境(包含 root 用户权限,进程空间,用户空间和网络空间等)和运行在其中的应用程序。

在 Docker 的生命周期中,最核心的两个部分,一个是镜像 Images,一个是容器 Containers。 镜像运行起来就是容器。

容器服务运行的过程中,基于原始镜像做了改变,比如安装了程序,添加了文件,也可以提交回去 (commit) 成为镜像。

例如:一个镜像可以包含一个完整的 ubuntu 操作系统环境,里面仅安装了 mysql 或用户需要的其他应用程序。

docker 镜像实际上是由一层一层的系统文件组成,这种层级的文件系统被称为UnionFS( Union file system 统一文件系统),镜像可以基于 dockerfile 构建,dockerfile 是一个描述文件,里面包含了若干条命令,每条命令都会对基础文件系统创建新的层次结构。

docker 提供了一个很简单的机制来创建镜像或更新现有的镜像。用户甚至可以从其他人那里下载一个已经做好的镜像直接使用。(镜像是只读的,可以理解为静态文件)

相对于镜像来说容器是动态的,容器在启动的时候创建了一层可写层次作为最上层。

`  docker create <image -id > `:为指定的镜像添加一个可读写层,构成一个新的容器;

docker 仓库: 如果使用了 git 和 github 就很容易理解 docker 的仓库概念。docker 仓库概念和 git 类似。 docker 仓库是用来包含镜像的位置,docker 提供了一个注册服务器(register)来保存多个仓库,每个仓库又可以包含多个具备不同 tag 的镜像, docker 运作中使用的默认仓库是 docker hub 公共仓库。仓库支持的操作类似 git,当用户创建了自己的镜像之后就可以使用 push 命令将它上传到共有或者私有的仓库。这样下次再另外一台机器上使用这个镜像的时候只需要从仓库里面 pull 下来就可以了。

Docker 安装

https://docs.docker.com/get-docker/

Linux

1
2
3
4
5
6
7
8
9
10
# 1、yum 包更新到最新 
yum update
# 2、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的 
yum install -y yum-utils device-mapper-persistent-data lvm2
# 3、 设置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 4、 安装docker,出现输入的界面都输入 y 
yum install -y docker-ce
# 5、 查看docker版本,验证是否验证成功
docker -v

Mac

Windows

https://docs.docker.com/desktop/install/windows-install/

镜像加速源

设置镜像

设置镜像步骤

  1. 登录阿里云服务器,找到 容器镜像服务
  2. 设置 Registry 登录密码
  3. 找到镜像加速器
  4. 配置使用
1
2
3
4
5
6
7
8
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://pi9dpp60.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

国内镜像:

设置 Docker 镜像命令:

1
2
3
4
5
6
7
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json
{
  "registry-mirrors": ["加速地址"]
}
sudo systemctl daemon-reload
sudo systemctl restart docker

Docker Desktop 设置镜像

常见的国内源有:

Docker 国内镜像源:https://registry.docker-cn.com

中科大源:https://docker.mirrors.ustc.edu.cn

网易源:https://hub-mirror.c.163.com

百度源:https://mirror.baidubce.com

腾讯源:https://ccr.ccs.tencentyun.com

阿里源:需要登陆 cr.console.aliyun.com 创建单独的镜像源链接,

![900](https://raw.githubusercontent.com/hacket/ObsidianOSS/master/obsidian/obsidianobsidian202403010831012.png)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
  "builder": {
    "gc": {
      "defaultKeepStorage": "20GB",
      "enabled": true
    }
  },
  "experimental": false,
  "features": {
    "buildkit": true
  },
  "registry-mirrors": [
        "https://registry.docker-cn.com",
        "https://docker.mirrors.ustc.edu.cn",
        "https://hub-mirror.c.163.com",
        "https://mirror.baidubce.com",
        "https://ccr.ccs.tencentyun.com"
   ]
}

使用如下命令查看 Docker 配置,如下图所示镜像源配置成功:

![600](https://raw.githubusercontent.com/hacket/ObsidianOSS/master/obsidian/202409230015030.png)

Docker 镜像

  • 见 [[Docker 应用]]

Docker 命令

  • 见 [[Docker 命令]]

Dockerfile

  • 见 [[Dockerfile]]

网络配置

端口映射

容器内的网络服务和外部机器不能直接通信;外部机器和宿主机可以直接通信;宿主机和容器可以直接通信。

当容器中的网络服务需要被外部机器访问时,可以将容器中提供服务的端口映射到宿主机的端口上。外部机器访问宿主机的端口,从而间接访问容器的服务。

这种操作称为:端口映射

Docker Compose

见 [[Docker Compose]]

Ref

本文由作者按照 CC BY 4.0 进行授权