Docker基本概述及镜像容器的基本命令

7,991 阅读7分钟

一、Docker概述

image.png

1.1 Docker是什么?

  • Docker是一个开源的应用容器引擎,基于go语言开发并遵守了apache2.0协议开源。
  • Docker是在Linux容器里运行应用的开源工具,是一种轻量级的“虚拟机”。
  • Docker的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自足的容器。 (Docker是创建容器的工具。应用运行在容器中,每个容器都有一致的运行环境,并且每个容器都相互隔离,所以可以在任何主机中运行。即实现“一次封装,到处运行”的目的。)

1.2 Docker的设计宗旨

  • Docker的设计宗旨:Build,Ship and Run Any ,Anywhere
  • 即通过对应用组件的封装、发布、部署、运行等生命周期的管理,达到应用组件级别的“依次封装,到处运行”的目的,这里的组件,既可以是一个应用,也可以是一套服务,甚至是一个完整的操作系统。

1.3 Docker容器的优点

  • 容器化越来越受欢迎,因为容器是:

    • 灵活:即使是最复杂的应用也可以集装箱化
    • 轻量级:容器利用并共享主机内核。
    • 可互换:可以即时部署更新和升级
    • 便携式:可以在本地构建,部署到云,并在任何地方运行
    • 可扩展:可以增加并自动分发容器副本(一个主机内安装多个同服务的容器进行运行)
    • 可堆叠:可以垂直和即时堆叠服务(一个主机安装多个不同应用的容器,组建集群服务)

1.4 容器与虚拟机的区别

image.png

特性Docker容器虚拟机
启动速度秒级分钟级
计算能力损耗几乎无损耗最多达到50%左右
系统内核共享宿主机内核拥有独立的操作系统内核
性能接近原生(依托于本机环境)弱于原生(独立创建环境)
系统支持量(单独一台主机)上千个几十个
隔离性资源隔离/限制完全隔离

1.5 容器支持的技术

  • 容器在内核中支持2种重要技术:

    • docker容器本质就是宿主机的一个进程,docker是通过namespace实现资源隔离,通过cgroup实现资源限制,通过写时复制技术( copy-on-write)实现了高效的文件操作(类似虚拟机的磁盘比如分配500g并不是实际占用物理磁盘500g,只有当需要修改时才复制一份数据)。

1.6 Linux系统的namespace(命名空间,即6项隔离)

namespace系统调用参数隔离内容
UTSCLONE_NEWUTS主机名和域名
IPCCLONE_NEWWIPS信号量,消息队列和共享内存
PIDCLONE_NEWPID进程编号
NETWORKCLONE_NEWNET网络设备,网络栈,端口等
MOUNTCLONE_NEWNS挂载点(文件系统)
USERCLONE_NEWUSER用户和用户组(3.8以后的内核才支持)

除此之外,Linux以后4.6以后,cgroup作为第七个命名空间,用于控制进程使用的资源,即能够使用资源的上限。

1.7 Docker的核心概念

  • 镜像

    • Docker的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向 Docker 容器引擎的只读模板。
    • 通过镜像启动一个容器,一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容包含代码,运行时间,库、环境变量、和配置文件。
  • 容器

    • Docker的容器是从镜像创建的运行实例,它可以被启动、停止和删除。所创建的每一个容器都是相互隔离、互不可见,以保证平台的安全性。
    • 可以把容器看做是要给简易版的linux环境(包括root用户权限、镜像空间、用户空间和网络空间等)和运行在其中的应用程序。
  • 仓库

    • Docker仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用push命令将它上传到公有仓库(Public)或者私有仓库(Private)。当下次要在另外一台机器上使用这个镜像时,只需从仓库获取。
  • Docker 的镜像、容器、日志等内容全部都默认存储在 /var/lib/docker 目录下。

总结

  • 镜像是创建容器的基础,就是一个可执行的压缩包,是一个制度模板,包含运行应用程序所需要的所有资源
  • 容器是基于运行创建的示例,容器之间相互隔离
  • 仓库是用于存放镜像的地方,可分为公有仓库和私有仓库

二、Docker的安装部署

2.1 Docker安装

#目前 Docker 只能支持 64 位系统。 可以通过以下两种命令查看
uname -a 
arch         

#关闭防火墙selinux
systemctl stop firewalld.service
setenforce 0

#安装依赖包(需要开启在线源进行安装)
yum install -y yum-utils device-mapper-persistent-data lvm2 
# yum-utils:提供了 yum-config-manager 工具。
# device mapper: 是Linux内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。
# device mapper存储驱动程序需要 device-mapper-persistent-data 和 lvm2。

#设置阿里云镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 

#安装 Docker-CE并设置为开机自动启动
yum install -y docker-ce docker-ce-cli containerd.io
#安装docker-ce后,会自动安装docker-ce-cli、containerd.io两个组件

systemctl start docker.service
systemctl enable docker.service 
复制代码

安装好的Docker系统有两个程序,Docker服务端和Docker客户端。其中Docker服务端是一个服务进程,负责管理所有容器。 Docker客户端则扮演着Docker服务端的远程控制器,可以用来控制Docker的服务端进程。大部分情况下Docker服务端和客户端运行在一台机器上。

image.png

image.png

image.png

image.png

image.png

2.2 Docker信息查看

#查看 docker 版本信息
docker version

# docker 信息查看
Client:
 Context:    default
 Debug Mode: false
 Plugins:
  app: Docker App (Docker Inc., v0.9.1-beta3)
  buildx: Docker Buildx (Docker Inc., v0.9.1-docker)
  scan: Docker Scan (Docker Inc., v0.21.0)

Server:
 Containers: 0          # 容器数量
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 0              # 镜像数量
 Server Version: 20.10.21    # server 版本
 Storage Driver: overlay2    # docker 使用的是 overlay2 文件驱动
  Backing Filesystem: xfs    # 宿主机上的底层文件系统
  Supports d_type: true
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: cgroupfs     # Cgroups 驱动
 Cgroup Version: 1
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 770bd0108c32f3fb5c73ae1264f7e503fe7b2661
 runc version: v1.1.4-0-g5fd4c4d
 init version: de40ad0
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 3.10.0-693.el7.x86_64    # 宿主机的相关信息
 Operating System: CentOS Linux 7 (Core)
 OSType: linux
 Architecture: x86_64
 CPUs: 8
 Total Memory: 3.686GiB
 Name: localhost.localdomain
 ID: K6YM:F3U2:NLVH:B5TP:7KJH:6475:QNIA:DFUZ:XKX7:J57V:MV6X:XBAR
 Docker Root Dir: /var/lib/docker     # docker 数据存储目录
 Debug Mode: false
 Registry: https://index.docker.io/v1/    # registry 地址
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Registry Mirrors:			  # 加速站点
  https://6ijb8ubo.mirror.aliyuncs.com/
 Live Restore Enabled: false
复制代码

image.png

三、Docker 镜像管理操作

① 搜索镜像

#搜索指定镜像
docker search 关键字
复制代码

image.png

② 下载镜像

docker pull [仓库名] [镜像名]:[标签]  
#拉取即下载镜像   标签包含镜像的版本号
#不加标签则默认使用latest标签的镜像
#latest代表当前最新版本

image.png

image.png

③ 查看镜像

docker images    #查看当前下载好的镜像

image.png

④ 如何进行镜像下载加速

使用命令 " docker info "进行docker信息的查看,内容如下:

image.png 我们需要获取国内的镜像源,使镜像下载速度提升:

进入阿里云官方网站---www.aliyun.com/?utm_conten…

image.png 选择:容器与中间件----容器镜像服务ACR

image.png

选择:管理控制台----镜像工具----镜像加速器

image.png

image.png

image.png

mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://au478sbd.mirror.aliyuncs.com"]
} 
EOF

systemctl daemon-reload
systemctl restart docker

image.png

image.png

image.png

⑤ 镜像默认存放目录解析

image.png

image.png

 docker inspect [镜像ID]
 #用于查看镜像的详细信息

image.png

⑥ 给镜像添加新标签

docker tag [镜像名]:[标签] 自定义仓库名/自定义镜像版本
#给一个镜像可以打上新标签,自定义镜像的版本和仓库名,实际上自定义内容都属于标签内容
复制代码

image.png

⑦ 删除镜像、彻底删除镜像、删除所有镜像

docker rmi [镜像名/镜像id号]
#删除指定镜像
复制代码

image.png

docker rmi [镜像id号] -f
#若一个镜像有多个镜像名,需要彻底删除,需要使用镜像id加上-f选项去强制删除所有相同镜像id的镜像

image.png

docker images -q  #显示当前所有镜像的ID号
docker rmi $(docker images -q)   #通过$进行调用所有的镜像ID号
#如果一个镜像拥有多个标签,加选项-f即可

image.png 若需要删除的镜像,正在启动使用容器,需要先删除容器,才可以删除镜像。

⑧ 将镜像导出与导入

docker save -o nginx.tar [镜像名]
#将镜像打包成nginx.tar文件在当前目录
复制代码

image.png

方法一:docker load -i nginx.tar
方法二:docker load < nginx.tar
#将本地打包好的nginx.tar导入到docker当中

image.png

image.png

⑨ 上传镜像到公有仓库

首先,访问公有仓库官网:hub.docker.com 登录账号

image.png

将已有镜像进行新打标签

image.png

docker login   #登录公有仓库

#登录成功后,进行镜像的推送
docker push 970425474root/mynginx:test

image.png

image.png

image.png

# 删除已有镜像,在公有仓库中进行拉取验证
docker rmi -f 295c7be07902
# 拉取公有仓库中的镜像
docker pull 970425474root/mynginx:test
复制代码

image.png

image.png

四、Docker 的容器管理操作

4.1 创建容器

docker create -it [镜像名:标签]
#基于已有镜像创建容器
#-i选项让容器开启标准输入,用于接收用户命令,使用户在创建容器时,可以在创建命令后,跟随一些用户指定的命令,基于指定的命令启动容器
#-t选项代表,给创建的容器分配一个虚拟终端(伪终端),用户后续可以通过这个虚拟终端登录到容器内部
#-it搭配使用,可以实现与容器的交互作用
复制代码

image.png

image.png

4.2 查看容器

docker ps -a    #查看容器状态
复制代码

image.png

4.3 删除容器

docker rm [容器id号/容器名称]  #删除容器命令

docker rm $(docker ps -aq) #删除当前所有容器
复制代码

image.png

4.4 运行容器

docker start [容器id号/容器名称]
#启动指定容器
复制代码

image.png

4.5 停止容器

docker stop [容器id号/容器名称]        
#停止指定容器

docker kill [容器id号/容器名称] 
#强制退出容器,容器卡死状态下会使用
复制代码

image.png

4.6 进入容器

docker exec -it [容器id号/容器名称] [指定shell环境]
#启动容器后方命令后方需要添加指定的shell环境
#每个容器指定的shell环境不一定相同
#环境不同可能造成无法进入容器的情况
复制代码

image.png

4.7 将容器中文件复制到本地

docker cp [容器ID]:/opt/test.txt /opt/
#将容器中文件进行复制到本地操作,目录格式为/目录名/,文件格式为/目录名/文件名
复制代码

注意:文件后方不要加/否则系统会判断为目录,传递的文件需要使用容器内的绝对路径进行传递。

image.png

4.8 创建并启动容器

docker run 命令

  • 在我们使用docker run命令时,相当于我们先使用docker create 创建了一个容器后,再使用docker start 启动容器。

  • 容器是一个与其中允许的shell命令/进程共存亡的终端,命令/进程运行容器运行,命令/进程结束容器退出。

  • docker容器会默认把第一个进程,也就是PID号为1的程序,作为判断docker容器是否正在运行的依据,如果docker容器中PID=1的进程被停止了或者下线了,那么docker容器便会直接退出,也就是说docker容器中必须有一个前台进程,否则则判断容器已经挂掉。

      命令格式:
      docker run [容器名称:标签]     #将会运行一个前台程序保持容器的开启,取消前台程序将关闭容器
      docker run -d [容器名称:标签]  #-d选项将会使Docker容器以守护形式在后台运行,并且容器所运行的程序不会结束
      docker run [容器名称:标签] [指定shell环境] -c [命令] #-c选项指定一条shell命令运行在docker容器中,运行结束后退出容器
    复制代码
    

image.png

image.png

image.png

image.png

使用docker run后,Docker后台的标准运行过程

  1. 检查本地是否存在指定的镜像。当镜像不存在时,会从公有仓库下载;
  2. 利用镜像创建并启动一个容器;
  3. 分配一个文件系统给容器,在只读的镜像层外面挂载一层可读写层;(镜像只读,不能删除。)
  4. 从宿主主机配置的网桥接口中桥接一一个 虚拟机接口到容器中;
  5. 分配一个地址池中的IP地址给容器;
  6. 执行用户指定的应用程序,执行完毕后容器被终止运行。

4.9 容器的导入与导出

用户可以将任何一个Dokcer容器从一台机器迁移到另一台机器。在迁移过程中,可以使用docker export命令将已经创建好的容器导出为容器快照文件,无论这个容器是处于运行状态还是停止状态均可导出。可将导出文件传输到其他机器,通过相应的导入命令实现容器的迁移。

#导出格式
docker export [容器ID号/容器名称] > 文件名
docker export -o 文件名 [容器ID号/容器名称]
复制代码

image.png

#导入格式
cat 镜像软件包名称 | docker import - [镜像名称:标签]
docker import 镜像软件包名称 -- [镜像名称:标签]
复制代码

image.png