Docker 是基于 Go 语言开发的一款开源的应用程序与 PaaS 服务,是一种轻量化的 虚拟机
。Docker 三大理念为 build(构建) 、ship(运输)、run(运行)。并且使用 Namespace 与 Cgroup 来提供容器的资源隔离与安全保障等。如Docker 的 logo 一样,蓝鲸为宿主机,而集装箱则为互相隔离且有自己应用的容器。
以下是 Docker 与 虚拟机的区别
特点 | 虚拟机 | Docker |
---|---|---|
启动 | 分级 | 秒级 |
磁盘使用 | GB | MB |
性能 | 弱于 | 接近原生 |
系统支持量 | 一般几十 | 上千容器 |
隔离性 | 完全隔离 | 资源隔离 |
轻量级
:单机可以轻松支持上百 Container ,快速启动。高性能
:不需要进行硬件虚拟以及运行完整的操作系统。CI/CD
:持续集成、持续交付与持续部署。迁移与扩容
:可在物理机、云,虚拟机进行迁移,且可弹性伸缩、快速扩容。隔离性
:进程、资源等进行隔离,但没有虚拟机彻底。Docker 引擎是一个C/S 架构的应用程序。常驻后台进程 Dockerd ,由 REST API 与 Dockerd 进行交互,最后由 docker CLI 与 REST API 进行交互,执行 docker 命令。
Host
:一个物理机或虚拟机,用来运行 Docker服务进程与容器。Client
:客户端使用 docker 命令或其他工具调用 Docker API 进行通信。Deamon
:Dockerd 架构中后台系统进程,用来监听Docker API的请求和管理Docker对象,比如镜像、容器、网络和Volume。Registry
:保存镜像的仓库,类似 Git 版本控制系统等。Images
:Docker 镜像,可以理解为创建容器需要的模板。Containers
:一组或一个拥有自己进行及网络等,提供外部访问的容器。kernel 是用来完成软件与硬件这个控制工作的软件被称为操作系统。在 Linux 的术语中被称为“内核”,也可以称为“核心”。Linux 内核的主要模块分以下几个部分:存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信,以及系统的初始化(引导)、系统调用等。
在我们运行的服务中,为防止资源抢占,运用 PID Namespace 来进行进程隔离。在宿主机上可获取一组 PID、PPID ,PID 号是容器在宿主机上的进程,PPID是容器内进程在宿主机上的父进程 PID 。在容器内也有一组 PID、PPID,其中 PID 是容器服务的进程,PPID 是容器外部的进程,如果为0则表示父进程是容器外部的进程。
隔离类型 | 系统调用参数 | 功能 |
---|---|---|
MNT Namespace | CLONE_NEWNS | 磁盘挂载点和文件系统间隔离 |
IPC Namespace | CLONE_NEWIPC | 进程间通信隔离 |
UTS Namespace | CLONE_NEWUTS | 主机名间隔离 |
PID Namespace | CLONE_NEWPID | 进程间隔离 |
NET Namespace | CLONE_NEWNET | 网络间隔离 |
USER Namespace | CLONE_NEWUSER | 用户间隔离 |
全称 Control Groups 对于容器的物理资源进行隔离,如 CPU、内存、磁盘IO 等,达到共享宿主机资源,但却互不影响。另外,还可以对进程进行优先级测试,以及任务执行挂起、恢复等操作。
类型 | 作用 |
---|---|
blkio | 块设备 IO 进行限制 |
cpu | 限制 CPU 时间片的分配,与 cpuacct 挂载在同一目录 |
cpuacct | 生成 cgroup 中的任务占用 CPU 资源的报告,与 cpu 挂载在同一目录 |
cpuset | 给 cgroup 中的任务分配独立的 CPU和内存 |
devices | 允许或拒绝 cgroup 任务访问设备 |
freezer | 暂停或恢复 cgroup 任务 |
hugetlb | 限制使用的内存页数量 |
memory | 对 cgroup 中的任务的可用内存进行限制,并自动生成资源占用报告 |
net_cls | 使用等级识别符(classid)标记网络数据包,这让 Linux 流量控制器(tc 指令)可以识别来自特定 cgroup 任务的数据包,并进行网络限制 |
net_prio | 允许基于 cgroup 设置网络流量(netowork traffic)的优先级 |
perf_event | 增加了对每个 group 的监测跟踪能力,可以监测 group 中特定的 CPU 上的线程 |
pids | 限制任务的数量 |
全称 Union File System ,是一种 Linux 的操作系统中的设计。用来把其他文件系统联合挂载到一个挂载点的文件系统服务。在 Docker 镜像中,用户每次制作镜像操作等于在镜像中增加一个目录(Docker 中 layer 为层)。达到在 Docker 中对文件权限以及目录有效的隔离。
操作系统 | 地址 | Docker 版本 |
---|---|---|
CentOS 7.4 | 192.168.10.1 | docker-20.10.9.tgz |
Docker 下载安装
[root@localhost ~]# wget https://download.docker.com/linux/static/stable/x86_64/docker-20.10.9.tgz
[root@localhost ~]# tar zxvf docker-20.10.9.tgz
[root@localhost ~]# cp docker/* /usr/bin
[root@localhost ~]# cat << EOF >> /etc/systemd/system/docker.service
> [Unit]
> Description=Docker Application Container Engine
> Documentation=https://docs.docker.com
> After=network-online.target firewalld.service
> Wants=network-online.target
>
> [Service]
> Type=notify
> ExecStart=/usr/bin/dockerd
> ExecReload=/bin/kill -s HUP \$MAINPID
> LimitNOFILE=infinity
> LimitNPROC=infinity
> TimeoutStartSec=0
> Delegate=yes
> KillMode=process
> Restart=on-failure
> StartLimitBurst=3
> StartLimitInterval=60s
>
> [Install]
> WantedBy=multi-user.target
> EOF
[root@localhost ~]# chmod +x /etc/systemd/system/docker.service
[root@localhost ~]# systemctl daemon-reload && systemctl enable docker.service && systemctl start docker && systemctl status docker
Docker 版本查看
[root@localhost ~]# docker version #查看 docker 版本
[root@localhost ~]# docker info #查看 docker 系统信息
查看本地镜像
[root@localhost ~]# docker images #默认等于-a,显示全部本地镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 6 months ago 141MB
参数详解
REPOSITORY
:镜像名称TAG
:镜像的标签信息(默认latest),区分同 ID 不同标签,区分同镜像库不同镜像IMAGE ID
:镜像的唯一标识号,ID号CREATED
:镜像创建时间SIZE
:镜像占用空间docker inspect [IMAGE:TAG]/[IMAGEID] #查看本地镜像详情
docker history [IMAGE:TAG]/[IMAGEID] #查看镜像创建历史
网络方式
docker search [镜像关键字] #搜索镜像
docker pull [IMAGE:TAG] #下载镜像
docker push [IMAGE:TAG] #上传镜像
本地方式
docker load <(同-i) [本地镜像包] #导入本地镜像
docker save [IMAGE:TAG] >(同-o) [镜像包] #导出本地镜像
鉴于普通方式打包较大,内网传输较慢,使用此方式:
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 7 c16a5dec2126 2 days ago 1.86GB
[root@localhost ~]# docker save centos:7 | gzip > centos7-test.tar.gz
[root@localhost ~]# docker save centos:7 > centos7-test-01.tar.gz
[root@localhost ~]# ll
总用量 2496724
-rw-r--r-- 1 root root 1878647296 7月 6 14:30 centos7-test-01.tar.gz #与镜像同大
-rw-r--r-- 1 root root 677993258 7月 6 14:28 centos7-test.tar.gz #缩小近三分之一
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 6 months ago 141MB
[root@localhost ~]# docker tag nginx nginx1215:1.21.5 #更换名称与TAG
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx1215 1.21.5 605c77e624dd 6 months ago 141MB #ID不变
nginx latest 605c77e624dd 6 months ago 141MB
根据镜像名称与标签删除
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx1215 1.21.5 605c77e624dd 6 months ago 141MB
nginx latest 605c77e624dd 6 months ago 141MB
[root@localhost ~]# docker rmi nginx:latest #删除指定 TAG 镜像
Untagged: nginx:latest
Untagged: nginx@sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
根据镜像 ID 删除
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx1215 1.21.5 605c77e624dd 6 months ago 141MB
nginx latest 605c77e624dd 6 months ago 141MB
[root@localhost ~]# docker images -q | xargs docker rmi -f #删除本地所有镜像
Untagged: nginx1215:1.21.5
Untagged: nginx:latest
Deleted: sha256:605c77e624ddb75e6110f997c58876baa13f8754486b461117934b24a9dc3a85
先创后启方式
docker create -it --name [CONTAINER-NAME] [IMAGE-NAME]:[TAG] [COMMAND]
[root@localhost ~]# docker create -it --name C7 centos:7.4.1708 bash
[root@localhost ~]# docker start C7
create
:创建容器-i
:容器始终保持输入状态-t
:为容器分配一个伪终端-it
:交互运行直接运行方式
docker run -it --name [CONTAINER-NAME] [IMAGE-NAME]:[TAG] [COMMAND]
[root@localhost ~]# docker run -it --name C7 centos:7.4.1708 bash
run
:运行容器--name
:容器命名bash
:进入容器的命名解析器,sh或bash查看容器
语法:docker ps [OPTIONS]
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
581d27672404 centos:7.4.1708 "bash" 3 hours ago Up 3 hours test
-q
:只显示镜像 ID-a
:显示全部容器-s
:显示 SIZE查看容器映射端口
语法:docker port [CONTAINER]
[root@localhost ~]# docker port nginx6
80/tcp -> 0.0.0.0:80
80/tcp -> :::80
进入容器
语法:docker exec [OPTIONS] [CONTAINER] [COMMAND]
[root@localhost ~]# docker exec -it test bash -c ls
anaconda-post.log bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
查看容器日志
语法:docker logs [OPTIONS] [CONTAINER]
[root@localhost ~]# docker logs nginx7
默认打印全部
-f
:实时打印日志--timestamps
:精确时间停止容器
语法:docker pause [CONTAINER] #暂停运行
[root@localhost ~]# docker pause nginx7
[root@localhost ~]# docker ps #STATUS状态为Pause暂停
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
12fd2b515bd5 nginx:latest "/docker-entrypoint.…" 23 hours ago Up 23 hours (Paused) 0.0.0.0:80->80/tcp, :::80->80/tcp nginx7
语法:docker unpause [CONTAINER] #继续运行
[root@localhost ~]# docker unpause nginx7
语法:docker stop [CONTAINER] #停止容器
[root@localhost ~]# docker stop nginx7
语法:docker kill [CONTAINER] #强制关闭容器
[root@localhost ~]# docker kill nginx7
删除容器
语法:docker rm [CONTAINER] #删除容器
[root@localhost ~]# docker rm nginx7
对于主机上 Docker 运行若干容器,每个容器都需要CPU、内存和 IO 资源,对于容器,也可以进行资源限制,以防止占用太多,影响其他甚至是整个主机上的性能。
[root@localhost ~]# docker run -it -d -m 200M --memory-swap 300M centos:7.4.1708
[root@localhost ~]# docker ps
[root@localhost ~]# cat /sys/fs/cgroup/memory/docker/[写容器 ID]/memory.limit_in_bytes
-m
:允许分配的内存大小--memory-swap
:允许分配的内存和swap的总大小[root@localhost ~]# docker run -it -d -c 1024 centos:7.4.1708
-c
:CPU 的权重[root@localhost ~]# docker run -it --device-write-bps /dev/sda:3MB centos:7.4.1708
--device-read-bps
:限制读某个设备的 bps--device-write-bps
:限制写某个设备的 bps(bps 是 byte per second,每秒读写的数据量)--device-read-iops
:限制读某个设备的 iops--device-write-iops
:限制写某个设备的 iops(iops 是io per second,每秒 io 的次数)