Docker 系列一
一、Docker 简介
Docker 是基于 Go 语言开发的一款开源的应用程序与 PaaS 服务,是一种轻量化的 虚拟机
。Docker 三大理念为 build(构建) 、ship(运输)、run(运行)。并且使用 Namespace 与 Cgroup 来提供容器的资源隔离与安全保障等。如Docker 的 logo 一样,蓝鲸为宿主机,而集装箱则为互相隔离且有自己应用的容器。
以下是 Docker 与 虚拟机的区别
1、Docker 特点
轻量级
:单机可以轻松支持上百 Container ,快速启动。高性能
:不需要进行硬件虚拟以及运行完整的操作系统。CI/CD
:持续集成、持续交付与持续部署。迁移与扩容
:可在物理机、云,虚拟机进行迁移,且可弹性伸缩、快速扩容。隔离性
:进程、资源等进行隔离,但没有虚拟机彻底。
2、Docker 架构
引擎
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
:一组或一个拥有自己进行及网络等,提供外部访问的容器。
3、Docker 核心
- 镜像(Image)
Docker image 是一个只读模板,包含了文件系统。用来创建 Docker 容器,镜像来自于基于另外基础镜像构建并加上需要的额外自定义功能。 - 容器(Container)
Docker Container 一个镜像运行的实例,拥有自己封装的的进程、权限、存储、网络等,消耗资源极少。跟集装箱一样利用 Linux 内核技术进行资源隔离达到相互隔离,且使用 CLI 对容器进行操作。 - 仓库(Registry)
Dokcer Registry 类似于代码仓库,是 Docker 集中存放镜像文件的仓库。分为公开仓库(Public)和私有仓库(Private)两种形式。达到共享其他服务器,只需要用 pull(拉取) 于 push(上传) 对镜像仓库操作即可。
二、Linux kernel
kernel 是用来完成软件与硬件这个控制工作的软件被称为操作系统。在 Linux 的术语中被称为“内核”,也可以称为“核心”。Linux 内核的主要模块分以下几个部分:存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信,以及系统的初始化(引导)、系统调用等。
1、Namespace
在我们运行的服务中,为防止资源抢占,运用 PID Namespace 来进行进程隔离。在宿主机上可获取一组 PID、PPID ,PID 号是容器在宿主机上的进程,PPID是容器内进程在宿主机上的父进程 PID 。在容器内也有一组 PID、PPID,其中 PID 是容器服务的进程,PPID 是容器外部的进程,如果为0则表示父进程是容器外部的进程。
2、Cgroups
全称 Control Groups 对于容器的物理资源进行隔离,如 CPU、内存、磁盘IO 等,达到共享宿主机资源,但却互不影响。另外,还可以对进程进行优先级测试,以及任务执行挂起、恢复等操作。
3、UnionFS
全称 Union File System ,是一种 Linux 的操作系统中的设计。用来把其他文件系统联合挂载到一个挂载点的文件系统服务。在 Docker 镜像中,用户每次制作镜像操作等于在镜像中增加一个目录(Docker 中 layer 为层)。达到在 Docker 中对文件权限以及目录有效的隔离。
三、Docker 使用
1、Docker 安装
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 系统信息
2、Docker 镜像管理
1.查看镜像详情
查看本地镜像
[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] #查看镜像创建历史
2.镜像导入导出
网络方式
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 #缩小近三分之一
3.更改镜像信息
[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
4.删除本地镜像
根据镜像名称与标签删除
[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
3、Docker 容器操作
1.创建容器
先创后启方式
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
2.查看容器
查看容器
语法: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
:精确时间
3.删除容器
停止容器
语法: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
4、容器资源限制
对于主机上 Docker 运行若干容器,每个容器都需要CPU、内存和 IO 资源,对于容器,也可以进行资源限制,以防止占用太多,影响其他甚至是整个主机上的性能。
1.内存限制
[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的总大小
2.CPU 限制
[root@localhost ~]# docker run -it -d -c 1024 centos:7.4.1708
-c
:CPU 的权重
3.IO 限制
[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 的次数)