Docker基础与安装步骤

90 阅读11分钟

参考文章:【详谈】一文带你认识 Docker 与 k8s - 掘金 (juejin.cn)

Docker与虚拟机对比

虚拟机,就是在你的操作系统里面,装一个软件,然后通过这个软件,再模拟一台甚至多台“子电脑”出来。 在 “子电脑” 里,你可以和正常电脑一样运行程序,例如登录 QQ。如果你愿意,你可以变出好几个 “子电脑”,里面都登录上 QQ。“子电脑” 和 “子电脑” 之间,是相互隔离的,互不影响。

虚拟机属于虚拟化技术。而 Docker 这样的容器技术,也是虚拟化技术,属于轻量级的虚拟化

虚拟机虽然可以隔离出很多 “子电脑”,但占用空间更大,启动更慢,虚拟机软件可能还要花钱(例如:VMWare)。

而容器技术恰好没有这些缺点。它不需要虚拟出整个操作系统,只需要虚拟一个小规模的环境(类似 “沙箱”)。Docker 可以轻松创建容器和基于容器的应用程序,最初是为 Linux 构建的,现在也可以在 Windows 和 MacOS 上运行。

它启动时间很快,几秒钟就能完成。而且,它对资源的利用率很高(一台主机可以同时运行几千个 Docker 容器)。此外,它占的空间很小,虚拟机一般要几 GB 到几十 GB 的空间,而容器只需要 MB 级甚至 KB 级。

正因为如此,容器技术受到了热烈的欢迎和追捧,发展迅速。大家需要注意,Docker 本身并不是容器,它是创建容器的工具,是应用容器引擎。想要搞懂 Docker,其实看它的两句口号就行。

第一句,是 “Build, Ship and Run”

第二句口号则是: “Build once,Run anywhere(搭建一次,到处能用)”。

  • Build(构建镜像) : 镜像就像是集装箱,包含文件以及运行环境等等资源;
  • Ship(运输镜像) :在宿主机和仓库间进行运输,这里仓库就像是超级码头;
  • Run(运行镜像) :运行的镜像就是一个容器,容器就是运行程序的地方。

⭐说白了,这个 Docker 镜像,是一个特殊的文件系统。它除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(例如:环境变量)。镜像不包含任何动态数据,其内容在构建之后也不会被改变

⭐综上所述,Docker 的运行过程,也就是去仓库把镜像拉到本地,然后用执行命令把镜像运行起来变成容器,这也就是为什么人们常常将 Docker 称为码头工人或码头装卸工。

⭐负责对 Docker 镜像进行管理的,是 Docker Registry 服务(类似仓库管理员)。当然,不是任何人建的任何镜像都是合法的。万一有人构建的镜像存在问题呢?所以,Docker Registry 服务对镜像的管理是非常严格的。最常使用的 Registry 公开服务,是官方的 Docker Hub,这也是默认的 Registry,并拥有大量的高质量的官方镜像。

Docker的优势

开发人员编写代码,在自己本地环境测试完成后,将代码部署到测试或生产环境中,经常会遇到各种各样的问题。明明本地完美运行的代码为什么部署后出现很多 bug,原因有很多:不同的操作系统、不同的依赖库等,总结一句话就是因为本地环境和远程环境不一致

容器化技术正好解决了这一关键问题,它将软件程序和运行的基础环境分开。开发人员编码完成后将程序打包到一个容器镜像中,镜像中详细列出了所依赖的环境,在不同的容器中运行标准化的镜像,从根本上解决了环境不一致的问题。

  • 可移植性:不依赖具体的操作系统或云平台,比如在阿里云或腾讯云直接随意迁移。

  • 占地小:容器只需要其应用程序以及它需要运行的所有容器和库的依赖清单,不需要将所有的依赖库都打包在一起。

  • 共享 bin 和 lib:不同的容器可以共享 bin 和 lib,进一步节省了空间。

Docker基本组成

在Docker里,容器、镜像和仓库是三个比较重要的概念。其中,镜像(image)是一个静态的概念,比如可以把一个最小化的Linux操作系统打包成一个镜像再传入仓库,也可以先在Linux上安装Redis,再把整合这两者的二进制流打包成一个镜像。

image.png

操作系统、Docker和容器的关系图

在实际项目里,**用Docker命令从仓库中下载镜像**,比如Linux+Redis镜像,然后通过命令启动镜像,这样就可以使用镜像里的Redis等应用了。

镜像是静态的,有些类似于Java里的类,而容器是镜像运行时的实体,也可以理解成由类实例化而成的对象,通过run命令能运行镜像生成容器。。通过Docker加容器的方式,可以快速地在Windows平台上搭建基于Linux的Redis环境。

镜像、容器、仓库的具体介绍如下:

镜像

Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。

相当于容器的“源代码”,docker镜像文件类似于Java的类模板,而docker容器实例类似于java中new出来的实例对象。

容器

Docker 利用容器(Container)独立运行的一个或一组应用,应用程序或服务运行在容器里面,容器就类似于一个虚拟化的运行环境,容器是用镜像创建的运行实例。

容器为镜像提供了一个标准的和隔离的运行环境,它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台

仓库

仓库(Repository)是集中存放镜像文件的场所。

类似于,Maven仓库,存放各种jar包的地方;github仓库,存放各种git项目的地方;

Docker公司提供的官方registry被称为Docker Hub,存放各种镜像模板的地方。

仓库分为公开仓库(Public)和私有仓库(Private)两种形式。

    最大的公开仓库是 Docker Hub (hub.docker.com/),存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云 、网易云等

总结

镜像文件

image 文件生成的容器实例,本身也是一个文件,称为镜像文件。

容器实例

一个容器运行一种服务,当我们需要的时候,就可以通过docker客户端创建一个对应的运行实例,也就是我们的容器

仓库

就是放一堆镜像的地方,我们可以把镜像发布到仓库中,需要的时候再从仓库中拉下来就可以了。

Docker安装

安装步骤

先安装Linux系统,建议7版本以上

  • 通过[ uname -r ]命令查看你当前的内核版本是否高于 3.10
  • 使用 root 权限 [sudo yum update],确保 yum 包更新到最新
  • 安装需要的软件包[sudo yum install -y yum-utils device-mapper-persistent-data lvm2]
  • 设置yum源[sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo]
  • 安装最新稳定版docker[sudo yum install docker-ce]
  • 启动并加入开机启动[sudo systemctl start docker]、[sudo systemctl enable docker]
  • 验证是否安装成功[docker version]\

阿里云镜像加速

阿里云地址: promotion.aliyun.com/ntms/act/ku…

  • 注册一个属于自己的阿里云账户(可复用淘宝账号)

  • 获得加速器地址连接--登陆阿里云开发者平台--控制台--容器镜像服务–获取加速器地址

    可以直接复制以下命令:

sudo mkdir -p /etc/docker 
sudo tee /etc/docker/daemon.json <<-'EOF' 
{
"registry-mirrors": ["https://9joy2jdh.mirror.aliyuncs.com"] 
} 
EOF 
sudo systemctl daemon-reload 
sudo systemctl restart docker

Docker常用命令

帮助启动类命令

  • 启动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

镜像命令

  • 列出本地主机上的镜像:docker images

    各选项说明:        

    REPOSITORY:表示镜像的仓库源
    TAG:镜像的标签版本号
    IMAGE ID:镜像ID
    CREATED:镜像创建时间
    SIZE:镜像大小
    

    OPTIONS说明:

    -a :列出本地所有的镜像(含历史映像层)
    -q :只显示镜像ID。
    
  • 搜索镜像: docker search [OPTIONS] 镜像名字
    docker search [OPTIONS] 镜像名字--limit : 只列出N个镜像,默认25个)

    例如: docker search mysql
    docker search --limit 5 mysql

  • 拉取镜像:docker pull + 镜像名字

  • 查看镜像/容器/数据卷所占的空间:docker system df 

  • 删除镜像:

    • 删除单个镜像 docker rmi 镜像ID
    • 删除多个镜像 docker rmi 镜像ID 镜像ID 镜像ID
      注意:如果通过某个镜像创建了容器,则该镜像无法删除。 解决办法:先删除镜像中的容器,再删除该镜像。
  • 查看所有镜像ID:docker rmi docker images -q

容器命令

  • 查看正在运行的容器:docker ps
    -   IMAGE :所属镜像 
    -   COMMAND : 
    -   CREATED :创建时间 
    -   STATUS :容器状态 
    -   PORTS :端口 
    -   NAMES :容器名称\
    例如:查看停止的容器:`docker ps -f status=exited`

查看所有的容器(停止+运行):docker ps -a 
查看最后一次运行的容器:docker ps -l
列出最近创建的 n 个容器:docker ps -n 5

  • 创建与启动容器:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]\

    -i :表示运行容器;
    -t :表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端; 
    --name :为创建的容器命名; 
    -v :表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个 -v 做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上;
    -d :在 run 后面加上 -d 参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登 录容器,如果只加 -i -t 两个参数,创建容器后就会自动进容器里); 
    -p :表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个 -p 做多个端口 映射。 
    -P :随机使用宿主机的可用端口与容器内暴露的端口映射。
       例如:
       创建并进入容器--通过镜像 AA 创建一个容器 BB,运行容器并进入容器的 /bin/bash :docker run -it --name 容器名称 镜像名称:标签 /bin/bash
       -   退出当前容器:exit
       -   守护式方式创建容器:docker run -di --name 容器名称 镜像名称:标签 **(推荐)**
       -   登录守护式容器方式:docker exec -it 容器名称|容器ID /bin/bash
    
  • 停止与启动容器

    • 停止容器 :docker stop 容器名称|容器ID
    • 启动容器 :docker start 容器名称|容器ID\
  • 文件拷贝

    • 将文件拷贝进容器:docker cp 需要拷贝的文件或目录 容器名称:容器目录

    • 从容器拷贝出文件:docker cp 容器名称:容器目录 需要拷贝的文件或目录

  • 目录挂载(容器数据卷操作)

    什么是目录挂载:以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改 宿主机某个目录的文件从而去影响容器,而且这个操作是双向绑定的,也就是说容器内的操作也会影响 到宿主机,实现备份功能。但是容器被删除的时候,宿主机的内容并不会被删除。如果多个容器挂载同一个目录,其中一个容 器被删除,其他容器的内容也不会受到影响。 例如:docker run -di -v /mydata/docker_centos/data:/usr/local/data --name centos7-01 centos:7\

    • 多目录挂载 :docker run -di -v /宿主机目录:/容器目录 -v /宿主机目录2:/容器目录2 镜像名
    • 匿名挂载--匿名挂载只需要写容器目录即可,容器外对应的目录会在 /var/lib/docker/volumes 中生:docker run -di -v /usr/local/data --name centos7-02 centos:7
    • 具名挂载--具名挂载就是给数据卷起了个名字,容器外对应的目录会在 docker run -di -v docker_centos_data:/usr/local/data --name centos7-03 centos:7
    • 查看 volume 数据卷(--持久化存储)信息:docker volume ls
    • 查看目录挂载关系: docker volume inspect 数据卷名称   /     docker inspect 容器ID或名称    查看返回json中的Mounts
  • 设置读写权限

    • 只读--只有宿主机内可以对容器进行数据管理:docker run -it -v /宿主机目录:/容器目录:ro 镜像名
    • 读写(默认):宿主机和容器可以进行双向的数据操作:docker run -it -v /宿主机目录:/容器目录:rw 镜像名
  • 容器继承:

  1. 容器 centos7-01 指定目录挂载
    docker run -di -v /mydata/docker_centos/data:/usr/local/data --name centos7-01centos:7
  2. 容器 centos7-04 和 centos7-05 相当于继承 centos7-01 容器的挂载目录
    docker run -di --volumes-from centos7-01:ro --name centos7-04 centos:7
    docker run -di --volumes-from centos7-01:rw --name centos7-05 centos:7
  • 查看容器的IP地址

    • 查看容器元信息:
    • 直接输出IP地址:docker inspect --format=‘{{.NetworkSettings.IPAddress}}’  容器名称|容器id
  • 删除容器

    • 删除指定容器:docker rm 容器名称|容器id
    • 删除多个容器:docker rm 容器名称|容器id  容器名称|容器id