目录
Docker 介绍
Docker 的组成
Namespace
Control groups 限制资源使用
Docker 的优势
Docker 的缺点
容器的相关技术
容器 runtime
bocker安装 加速
删除docker 等
常用命令
bocker脚本安装
bocker脚本二进制安装
Docker 存储引擎
alpine 介绍 用于做实验的的镜像,优点:体积小
Debian(ubuntu)系统建议安装的基础包
在别的地方下载镜像
镜像下载保存的路径
镜像导出
镜像导入
统一基础设施环境-docker环境
统一程序打包(装箱)方式-docker镜像java 程序
统一程序部署(运行)方式-docker容器
- docker 官网: http://www.docker.com
- 帮助文档链接: https://docs.docker.com/
- docker 镜像: https://hub.docker.com/docker
- 中文网站: http://www.docker.org.cn/
- Docker 主机(Host): 一个物理机或虚拟机,用于运行Docker服务进程和容器,也称为宿主机,node节点
- Docker 服务端(Server): Docker守护进程,运行docker容器
- Docker 客户端(Client): 客户端使用 docker 命令或其他工具调用docker API
- Docker 镜像(Images): 镜像可以理解为创建实例使用的模板,本质上就是一些程序文件的集合
- Docker 仓库(Registry): 保存镜像的仓库,官方仓库: https://hub.docker.com/,可以搭建私有仓库harbor
- Docker 容器(Container): 容器是从镜像生成对外提供服务的一个或一组服务,其本质就是将镜像中的程序启动后生成的进程
namespace是Linux系统的底层概念,在内核层实现,即有一些不同类型的命名空间被部署在内核,各个docker容器运行在同一个docker主进程并且共用同一个宿主机系统内核,各docker容器运行在宿主机的用户空间,每个容器都要有类似于虚拟机一样的相互隔离的运行空间,但是容器技术是在一个进程内实现运行指定服务的运行环境,并且还可以保护宿主机内核不受其他进程的干扰和影响,如文件系统空间、网络空间、进程空间等,目前主要通过以下技术实现容器运行空间的相互隔离:
隔离类型 | 功能 | 系统调用参数 | 内核 版本 |
MNT Namespace(mount) | 提供磁盘挂载点和文件系统的隔离能力 | CLONE_NEWNS | 2.4.19 |
IPC Namespace(Inter- Process Communication) |
提供进程间通信的隔离能力,包括信号量,消息队列和共享内存 | CLONE_NEWIPC | 2.6.19 |
UTS Namespace(UNIX Timesharing System) |
提供内核,主机名和域名隔离 能力 |
CLONE_NEWUTS | 2.6.19 |
PID Namespace(Process Identification) |
提供进程隔离能力 | CLONE_NEWPID | 2.6.24 |
Net Namespace(network) | 提供网络隔离能力,包括网络设备,网络栈,端口等 | CLONE_NEWNET | 2.6.29 |
User Namespace(user) | 提供用户隔离能力,包括用户和组 | CLONE_NEWUSER | 3.8 |
groups 最主要的作用,就是限制一个进程组能够使用的资源上限,包括CPU、内存、磁盘、网络带宽等等。此外,还能够对进程进行优先级设置,资源的计量以及资源的控制(比如:将进程挂起和恢复等操作)。
Cgroups在内核层默认已经开启,从CentOS 和 Ubuntu 不同版本对比,显然内核较新的支持的功能更多。
Centos 8.1 cgroups:
[root@centos8 ~]#cat /etc/redhat-release
CentOS Linux release 8.1.1911 (Core)
[root@centos8 ~]#grep CGROUP /boot/config-4.18.0-147.el8.x86_64
CONFIG_CGROUPS=y
CONFIG_BLK_CGROUP=y
# CONFIG_DEBUG_BLK_CGROUP is not set
CONFIG_CGROUP_WRITEBACK=y
CONFIG_CGROUP_SCHED=y
CONFIG_CGROUP_PIDS=y
CONFIG_CGROUP_RDMA=y
CONFIG_CGROUP_FREEZER=y
CONFIG_CGROUP_HUGETLB=y
CONFIG_CGROUP_DEVICE=y
CONFIG_CGROUP_CPUACCT=y
CONFIG_CGROUP_PERF=y
CONFIG_CGROUP_BPF=y
# CONFIG_CGROUP_DEBUG is not set
CONFIG_SOCK_CGROUP_DATA=y
# CONFIG_BLK_CGROUP_IOLATENCY is not set
CONFIG_NETFILTER_XT_MATCH_CGROUP=m
CONFIG_NET_CLS_CGROUP=y
CONFIG_CGROUP_NET_PRIO=y
CONFIG_CGROUP_NET_CLASSID=y
[root@centos8 ~]#
容器技术除了的docker之外,还有coreOS的rkt,还有阿里的Pouch,为了保证容器生态的标准性和健康可持续发展,包括Linux 基金会、Docker、微软、红帽谷歌和IBM等公司在2015年6月共同成立了一个叫Open Container Initiative(OCI)的组织,其目的就是制定开放的标准的容器规范,目前OCI一共发布了两个规范,分别是runtime spec和 image format spec,有了这两个规范,不同的容器公司开发的容器只要兼容这两个规范,就可以保证容器的可移植性和相互可操作性。
runtime是真正运行容器的地方,因此为了运行不同的容器runtime需要和操作系统内核紧密合作相互在支持,以便为容器提供相应的运行环境
runtime 类型
对于容器运行时主要有两个级别:Low Level(使用接近内核层) 和 High Level(使用接近用户层)目前,市面上常用的容器引擎有很多,主要有下图的那几种。
注释:docker安装之后都会自动安装runc contaninerd 。K8s可以不经过下面的头两个,直接到Cintainerd
dockershim, containerd 和cri-o都是遵循CRI的容器运行时,我们称他们为高层级运行时(High-levelRuntime)
其他的容器运营厂商最底层的runc仍然是Docker在维护的。
Google,CoreOS,RedHat都推出自已的运行时:lmctfy,rkt,cri-o,但到目前Docker仍然是最主流的容器引擎技术。
Docker 的运行机制
阿里云 docker-ce镜像_docker-ce下载地址_docker-ce安装教程-阿里巴巴开源镜像站 (aliyun.com)
官方 在乌班图|上安装 Docker 引擎泊坞窗文档
把下面阿里云加速复制到代码里 执行完之后就重启一下 作用就是以后拉镜像的时候更快
也可以之完之后在页面直接复制进去然后重启一下
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://frc3mkbl.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
[root@ubuntu ~]#apt purge docker-ce
[root@ubuntu ~]#rm -rf /var/lib/docker #删除docker相关文件
[root@rocky8 ~]#docker rm -f `docker ps -qa` #删除所有东西(容器)
docker rmi hello-world:latest #后面本版本删除标签 后面跟IP才是删除容器
docker rmi `docker images -q` #删除所有容器
[root@ubuntu2004 ~]#find / -name "*docker*" -exec rm -rf {} \; #二进制安装用这个,需要重启下
[root@ubuntu2004 ~]#docker images 查看
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine latest c059bfaa849c 10 months ago 5.59MB
[root@ubuntu2004 ~]#docker tag alpine:latest qwe:9.0 把你版本号和命令复制下来,在后面写你想要的
[root@ubuntu2004 ~]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine latest c059bfaa849c 10 months ago 5.59MB
qwe 9.0 c059bfaa849c 10 months ago 5.59MB
docker inspect alpine:latest #查看镜像详细信息
docker save alpine:latest -o dara-9.0.tar #导出来改名 需要自己gzip压缩 可以一次多个
dockerdocker load -i dara-9.0.tar dara-9.0.tar #在另一个导入到docker 这个能自己解压
docker save `docker images |awk 'NR>1{print $1":"$2}' |tr '\n' ' '` -o all.tar #利用循环全部倒入解压导出后会和之前一摸一样,下,下面别的方法
#方法1: 使用image ID导出镜像,在导入后的镜像没有REPOSITORY和TAG,显示
docker save `docker images -qa` -o all.tar
#方法2:将所有镜像导入到一个文件中,此方法导入后可以看REPOSITORY和TAG
docker save `docker images | awk 'NR!=1{print $1":"$2}'` -o all.tar
#方法3:将所有镜像导入到一个文件中,此方法导入后可以看REPOSITORY和TAG
docker image save `docker image ls --format "{{.Repository}}:{{.Tag}}"` -o all.tar
# step 1: 安装必要的一些系统工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安装GPG证书
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新并安装Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# apt-cache madison docker-ce
# docker-ce | 17.03.1~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
# docker-ce | 17.03.0~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
# Step 2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.1~ce-0~ubuntu-xenial)
# sudo apt-get -y install docker-ce=[VERSION]
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://si7y70hh.mirror.aliyuncs.com"]
}
EOF
sudo systemctl restart docker
二进制安装没有办法看systemctl status containerd.service,这个还是照样看的systemctl status docker.service
#!/bin/bash
#
#********************************************************************
#Author: wangxiaochun
#QQ: 29308620
#Date: 2022-10-15
#FileName: install_docker_offline.sh
#URL: http://www.wangxiaochun.com
#Description: The test script
#Copyright (C): 2022 All rights reserved
#********************************************************************
DOCKER_VERSION=20.10.19
#URL=https://mirrors.aliyun.com
URL=https://download.docker.com
prepare () {
if [ ! -e docker-${DOCKER_VERSION}.tgz ];then
#wget ${URL}/docker-ce/linux/static/stable/x86_64/docker-${DOCKER_VERSION}.tgz
wget ${URL}/linux/static/stable/x86_64/docker-${DOCKER_VERSION}.tgz
fi
[ $? -ne 0 ] && { echo "文件下载失败"; exit; }
}
install_docker () {
tar xf docker-${DOCKER_VERSION}.tgz -C /usr/local/
cp /usr/local/docker/* /usr/bin/
cat > /lib/systemd/system/docker.service <<-EOF
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H unix://var/run/docker.sock
ExecReload=/bin/kill -s HUP \$MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
}
start_docker (){
systemctl enable --now docker
docker info
}
config_docker () {
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://si7y70hh.mirror.aliyuncs.com"]
}
EOF
systemctl restart docker
}
prepare
install_docker
config_docker
start_docker
Docker官方推荐首选存储引擎为overlay2,其次为devicemapper,但是devicemapper存在使用空间方面的一些限制,虽然可以通过后期配置解决,但是官方依然推荐使用overlay2
该文件系统可以联合挂在, 挂在几个都能看到
目前 Docker 官方已开始推荐使用 Alpine 替代之前的 Ubuntu 做为基础镜像环境。这样会带来多个好处。包括镜像下载速度加快,镜像安全性提高,主机之间的切换更方便,占用更少磁盘空间等。
下表是官方镜像的大小比较:
REPOSITORY TAG IMAGE ID VIRTUAL SIZE
busybox latest beae173ccac6 1.24MB
alpine latest 4e38e38c8ce0 4.799 MB
debian latest 4d6ce913b130 84.98 MB
ubuntu latest b39b81afc8ca 188.3 MB
centos latest 8efe422e6104 210 MB
Alpine 官网: https://www.alpinelinux.org/
Alpine 官方仓库: https://github.com/alpinelinux
Alpine 官方镜像: https://hub.docker.com/_/alpine/
Alpine 官方镜像仓库: https://github.com/gliderlabs/docker-alpine
Alpine 阿里云的镜像仓库: https://mirrors.aliyun.com/alpine/
范例: alpine管理软件
#修改源替换成阿里源,将里面 dl-cdn.alpinelinux.org 的 改成 mirrors.aliyun.com
vi /etc/apk/repositories
http://mirrors.aliyun.com/alpine/v3.8/main/
http://mirrors.aliyun.com/alpine/v3.8/community/
#更新源
apk update
#安装软件
apk add vim
#删除软件
apk del openssh openntp vim
在很多软件官方提供的镜像都使用的是Debian(ubuntu)的系统,比如:nginx,tomcat,mysql,httpd 等,但镜像内缺少很多常用的调试工具.当需要进入容器内进行调试管理时,可以安装以下常用工具包
# apt update #安装软件前需要先更新索引
# apt install procps #提供top,ps,free等命令
# apt install psmisc #提供pstree,killall等命令
# apt install iputils-ping #提供ping命令
# apt install net-tools #提供netstat网络工具等
# apt install iproute2 #提供ip,ss网络工具等
列:阿里云 最好选择公网地址 剩余的哪俩你也用不了,不信自己试试
/var/lib/docker/overlay2/镜像ID ,那一堆乱码里面就像是Linux的内核文件目录,就是没有内核
ls /var/lib/docker/overlay2/
13f475fba0e7e601c7dc731f5db51f1f2ddfc4ca8d0713c3886f61ae7e18abda 6136dd7db88e8dd5bdc05c182156ab86fff19747e2
[root@ubuntu2004 ~]#ls /var/lib/docker/overlay2/l #里面放的软连接
DNMYY6XUSHJET537RJX3FN6D6Z JIFGWT65FQHWEOE5H6UMCATXTS O2KAOJBPZYWR2DNDTIYOJMT72R
[root@ubuntu2004 ~]#ls /var/lib/docker/overlay2/l -l
总用量 36
lrwxrwxrwx 1 root root 72 10月 15 20:11 DNMYY6XUSHJET537RJX3FN6D6Z -> ../6136dd7db88e8dd5bdc05c182156ab86fff19747e212e45c8a2917c425bc80a7/diff
lrwxrwxrwx 1 root root 72 10月 15 20:11 DZLAZW4OJ6RFX23Q4QSBFUBCHW -> ../1808e58cb947dfd3745cd5dad60c9a23cee3bbc7e522e83e5f7345d82709da3e/diff
docker save alpine:latest -o dara-9.0.tar #导出来改名 需要自己gzip压缩 可以一次多个
dockerdocker load -i dara-9.0.tar dara-9.0.tar #在另一个导入到docker 这个能自己解压
docker save `docker images |awk 'NR>1{print $1":"$2}' |tr '\n' ' '` -o all.tar #利用循环全部倒入解压导出后会和之前一摸一样,下,下面别的方法
#方法1: 使用image ID导出镜像,在导入后的镜像没有REPOSITORY和TAG,显示
docker save `docker images -qa` -o all.tar
#方法2:将所有镜像导入到一个文件中,此方法导入后可以看REPOSITORY和TAG
docker save `docker images | awk 'NR!=1{print $1":"$2}'` -o all.tar
#方法3:将所有镜像导入到一个文件中,此方法导入后可以看REPOSITORY和TAG
docker image save `docker image ls --format "{{.Repository}}:{{.Tag}}"` -o all.tar
利用docker load命令可以将镜像导出的打包或压缩文件再导入
范例: 导出所有镜像至不同的文件中
[root@centos8 ~]#docker images | awk 'NR!=1{print $1,$2}' | while read repo tag;do docker save $repo:$tag -o /opt/$repo-$tag.tar ;done
[root@centos8 ~]#ls /opt/*.tar/opt/alpine-3.13.5.tar /opt/busybox-latest.tar /opt/centos-centos8.3.2011.tar/opt/centos-latest.tar /opt/ubuntu-latest.tar
[root@ubuntu2004 ~]#for i in `docker image ls --format "{{.Repository}}:{{.Tag}}"`;do docker save $i -o `echo $i|cut -d: -f1`.tar ;done