概述

虚拟化

在计算机中,虚拟化(Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。这些资源的新虚拟部份是不受现有资源的架设方式,地域或物理组态所限制。一般所指的虚拟化资源包括计算能力和资料存储。

在实际的生产环境中,虚拟化技术主要用来解决高性能物理硬件产能过剩老旧硬件产能过低的重组重用,透明化底层物理硬件,从而最大化的利用物理硬件对资源充分利用。

虚拟化技术种类很多,例如:软件虚拟化、硬件虚拟化、内存虚拟化、网络虚拟化、桌面虚拟化、服务虚拟化、虚拟机等等。

Docker

Docker 是一个开源的应用容器引擎,用于开发应用、交付(shipping)应用、运行应用。
Docker 可以让开发者打包应用以及依赖包到一个轻量级、可移植的容器(containers)中,然后发布到Linux服务器上,也可以实现虚拟化。
容器完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低

Docker容器与虚拟机类似,但二者在原理上不同。容器是将操作系统层虚拟化虚拟机则是虚拟化硬件,因此容器更具有便携性、高效地利用服务器。 容器更多的用于表示软件的一个标准化单元

Docker组件

Docker客户端和服务器

Docker是一个客户端-服务器(C/S)架构程序。
Docker客户端只需要向Docker服务器(守护进程daemon)发出请求,服务器(守护进程)将完成所有工作并返回结果。
Docker提供了一个命令行工具Docker以及一整套RESTful API。你可以在同一台宿主机上运行Docker守护进程和客户端,也可以从本地的Docker客户端连接到运行在另一台宿主机上的远程Docker守护进程。

Docker镜像

镜像是构建Docker的基石。用户基于镜像来运行自己的容器。镜像也是Docker生命周期中的“构建”部分。镜像是基于联合文件系统的一种层式结构,由一系列指令一步一步构建出来。也可以将镜像当作容器的“安装包”。镜像体积很小,非常“便携”,易于分享、存储和更新。

Registry(注册中心)

Docker用Registry来保存用户构建的镜像。Registry分为公共和私有两种。Docker公司运营公共的Registry叫做Docker Hub。用户可以在Docker Hub注册账号,分享并保存自己的镜像(说明:在Docker Hub下载镜像巨慢,可以自己构建私有的Registry)。

Docker安装

wsl2

参考链接:Win10 WSL2 安装Docker

  • 如果你还没有安装wsl2请移步至安装wsl2
  • 首先进入Ubuntu shell,更换Ubuntu官方源为国内源,加快下载速度。执行。
    1
    2
    3
    4
    以防万一可以先备份一下
    cp /etc/apt/sources.list /etc/apt/sources.list.bak
    编辑
    vim /etc/apt/sources.list
    将内容替换为下方:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    deb http://mirrors.aliyun.com/ubuntu/ focal main restricted
    deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted
    deb http://mirrors.aliyun.com/ubuntu/ focal universe
    deb http://mirrors.aliyun.com/ubuntu/ focal-updates universe
    deb http://mirrors.aliyun.com/ubuntu/ focal multiverse
    deb http://mirrors.aliyun.com/ubuntu/ focal-updates multiverse
    deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted
    deb http://mirrors.aliyun.com/ubuntu/ focal-security universe
    deb http://mirrors.aliyun.com/ubuntu/ focal-security multiverse
  • 接下来添加Docker源,依次执行如下命令:
    1
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    1
    2
    3
    4
    sudo add-apt-repository \
    "deb [arch=amd64] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu \
    $(lsb_release -cs) \
    stable"
    1
    sudo apt update
  • 安装Docker CE。Docker从17.03版本之后分为社区版(Community Edition,CE)和企业版(Enterprise Edition,EE)。
    1
    sudo apt install -y docker-ce
  • 最后一个步骤,启动Docker daemon。
  • WSL2经过测试无法使用systemctl命令,因此我们使用 service 命令启动Docker daemon。
    1
    sudo service docker start
  • 至此,Docker 在WSL2下安装完毕。

基本命令

命令 描述
systemctl status docker 查看docker状态
systemctl [start/stop/restart] docker 开启/关闭/重启
service docker [start/stop/restart] 开启/关闭/重启(wsl2)
systemctl enable docker 开机启动
docker info 查看docker概要信息
docker --help 查看docker帮助文档
docker -v 查看docker版本

镜像相关命令

  • 列出docker下的所有镜像 docker images

    1
    2
    3
    4
    5
    6
    7
    root@CODER-XI:~# docker images

    REPOSITORY TAG IMAGE ID CREATED SIZE
    所属仓库 镜像标签 镜像ID 创建日期(非下载日期) 镜像大小

    redis latest aa4d65e670d6 3 days ago 105MB
    mysql latest c60d96bd2b77 4 days ago 514MB

    docker images 还提供了更多的OPTIONS(选项)

    docker images -a 查看所有镜像 (含中间映像层)
    docker images -q 只看镜像的ID
    docker images --digests 显示镜像的摘要信息
    docker images --no-trunc 显示完整的镜像信息

  • 搜索镜像 docker search 镜像名称

    1
    2
    3
    4
    5
    6
    7
    8
    root@CODER-XI:~# docker search activemq

    所属仓库/项目名 镜像描述 ★ 是否官方 自动构建
    NAME DESCRIPTION STARS OFFICIAL AUTOMATED

    webcenter/activemq ActiveMQ 5.14.3 with OpenJDK-jre-8-headless … 178 [OK]
    rmohr/activemq Various versions of ActiveMQ neatly packet i… 146 [OK]
    ....
  • 拉取镜像 docker pull mysql 默认为 latest 版本
    指定版本 docker pull mysql:8.0
    查看版本 https://hub.docker.com/_/mysql?tab=tags

  • 删除指定镜像 docker rmi 镜像ID
    删除所有镜像 docker rmi `docker images -q`

容器相关命令

  • 查看容器
    正在运行的容器 docker ps
    所有的容器 docker ps -a
    最后运行的容器 docker ps –l
    停止的容器 docker ps -f status=exited
    1
    2
    3
    root@CODER-XI:~# docker ps -a
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    686ae980d4fa mysql "docker-entrypoint.s…" 17 hours ago Exited (255) 27 minutes ago 33060/tcp, 0.0.0.0:23306->3306/tcp, :::23306->3306/tcp mysql_docker
  • 新建容器 docker create .... (同docker run
  • 启动一个已经创建的容器 docker start 容器名
  • 新建并启动容器 docker run -参数... 镜像名
    1
    2
    docker run -di --name="mysql_docker" -p 23306:3306 -e MYSQL_ROOT_PASSWORD="root" mysql
    docker run -di --name="redis_docker" -p 26379:6379 redis
    参数 描述
    -i 交互模式 (interactive) 运行容器,通常与-t同时使用
    -t 为容器分配一个伪输入终端,通常与-i同时使用。
    -d 创建一个 守护模式 (daemon?dettach) 容器 在后台运行容器并返回容器ID
    如果使用-it两个参数,创建后就会自动进入容器,而使用-d创建容器后不会
    --name="容器名称" 为创建的容器指定一个名称
    -p 主机/宿主端口:容器端口 指定端口映射关系
    可以使用多个-p做多个端口映射
    -P 随机端口映射,容器内部端口随机映射到主机的端口
    -v 主机/宿主目录:容器目录
    --volume=主机/宿主目录:容器目录
    指定目录映射关系(共享目录)
    可以使用多个-v做多个目录或文件映射。
    注意:最好做一下目录映射,在宿主机上做修改,然后共享到容器上
    如果你映射的是多级的目录,可能会出现权限不足(Permission denied)的提示:这是因为CentOS7中的安全模块selinux把权限禁掉了,添加参数--privileged=true来解决
    -e 变量名=变量值 设置环境变量,例如:-e MYSQL_ROOT_PASSWORD="root"
    参数 描述
    -a stdin 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项
    --dns 8.8.8.8 指定容器使用的DNS服务器,默认和宿主一致
    --dns-search example.com 指定容器DNS搜索域名,默认和宿主一致
    -h "mars" 指定容器的hostname
    --env-file=[] 从指定文件读入环境变量
    --cpuset="0-2"--cpuset="0,1,2" 绑定容器到指定CPU运行
    -m 设置容器使用内存最大值
    --net="bridge" 指定容器的网络连接类型,支持 bridge/host/none/container 四种类型
    --link=[] 添加链接到另一个容器
    --expose=[] 开放一个端口或一组端口
  • 查看容器IP地址 docker inspect 容器名称
    格式化查看 docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称
  • 停止容器 docker stop 容器名称
  • 复制容器 docker cp 需要拷贝的文件或目录 容器名称:容器目录
    或者使用 docker cp 容器名称:容器目录 需要拷贝的文件或目录
  • 删除容器 docker rm 容器名称或者id