1、docker 简介
1.1 docker 组成
- Docker 主机(Host):也称为宿主机,node节点。一个物理机或虚拟机,用于运行Docker服务进程和容器
- Docker 服务端(Server): 服务端是dockerd。 Docker守护进程,运行docker容器
- Docker 客户端(Client): 客户端是docker-cli。 客户端使用 docker 命令或其他工具调用docker API
- Docker 镜像(Images)⭐: 可以理解为虚拟机的模板、就是一个快照,类似于软件的安装包。 镜像可以理解为创建实例使用的模板,本质上就是一些程序文件的集合
- Docker 容器(Container)⭐: 就是类似于7-1的主机,是小型的虚拟机,只是这台虚拟机不需要安装操作系统。 容器是从镜像生成对外提供服务的一个或一组服务,其本质就是将镜像中的程序启动后生成的进程
- Docker 仓库(Registry)⭐: 存放镜像的仓库, 官方仓库: hub.docker.com/,可以搭建私有仓库harbor
1.2 Container 容器
container:集装箱
docker:码头工人
1.3 六大namespace 资源隔离⭐⭐⭐
因为容器之间共用内核,所以隔离性相比于虚拟机而言比较差。
容器 可以通过实现资源隔离,通过实现资源限制
隔离类型 | 功能 |
---|---|
MNT | 挂载 |
IPC | 进程通信 |
UTS | 主机名和域名 |
PID | 进程id |
NetWORK | 网络隔离,但容器之间还能互相通信 |
User | 用户和用户组 |
1.3.1 MNT Namespace
提供磁盘挂载点和文件系统的隔离功能。容器没有办法访问宿主机,但是宿主机可以访问容器。
每个容器都有自己的根目录。
1.3.2 IPC Namespace
进程通信,同一个容器里的进程可以通信,但不同容器里的进程,互不干扰。
- 主机名 hostname
- 域名
- 内核名称
1.3.3 UTS Namespace
提供内核,主机名和域名隔离能力
1.3.4 PID Namespace
提供进程隔离能力,解决Pid编号重复的问题。不同容器里面的相同pid号不会互相干扰
1.3.5 Net Namespace
提供网络隔离能力,同时又能让他们通信。每个容器创建了一个只属于自己的局域网。但是还能通信 提供了两个功能:
- 两个容器之间隔离
- 同时又能互相通信
1.3.6 User Namespace(user)
提供用户隔离能力,包括用户和组。
1.4 cgroup 资源限制⭐⭐⭐
cgroup,也成为 Controlgroup。提供进程所属的控制组的身份隔离
控制容器能使用宿主机资源的大小,不然可能会出现容器中代码bug,然后把宿主机的资源耗尽的情况。
2、容器管理工具 docker
红帽公司推出了podman,和docker一摸一样,但是商业版,不开源。docker是开源的。
2.1 容器运行规范 runc
docker-cli发指令,dockerd运行,dockerd再去调用containerd(高级运行时),运行runc,然后containerd再去开启真正的容器container(低级运行时)。
2.2 低级容器运行时与高级容器运行时
- High-Level:高级运行时提供基于API的远程管理操作,客户端可以通过高级别运行时管理容器的整个生命周期(创建、删除、重启、停止),高级别运行时并不真正直接运行容器,而是调用低级别运行时运行,比如dockerd、containerd都是高级别运行时。
高级别运行其实就是向低级发指令,发指令就是通过runc,然后runc再交给低级运行时
- Low-Level:接受高级别运行时的指令,按照相应的指令运行容器,因此低级别运行时真是运行容器的地方,例如runc
3、yum安装
软件 | 含义 |
---|---|
docker-ce | 服务端 |
docker-ce-cli | 客户端 |
containerd.io | docker调用的是containerd |
scratch | docker的基础镜像,也叫做祖宗镜像 |
拉取镜像:
docker pull nginx:latest //拉取镜像,如果:后不加版本,默认就是最新的
3.1 安装依赖包
[root@localhost data]# yum install -y yum-utils device-mapper-persistent-data lvm2 //先安装依赖包
软件 | 作用 |
---|---|
yum-utils: | 提供了 yum-config-manager 工具 |
device mapper: | 是Linux内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。 |
lvm2 | 存储驱动程序需要 device-mapper-persistent-data 和 lvm2。 |
3.2 设置阿里云镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#下载yum仓库
3.3 安装docker
- 最新版本
yum install -y docker-ce docker-ce-cli containerd.io //ce是服务端,cli是客户端 //此处安装的是最新版 如果不想安装最新版,可以使用下面的方法指定安装版本
- 查看所有的可用版本
yum list --help //可以使用帮助查看
yum list --showduplicates docker-ce //查看所有的可用版本。--showduplicates类似于grep过滤
- 指定安装版本
yum -y install docker-ce-19.03.15-3.el7 docker-ce-cli-19.03.15-3.el7 containerd.io
systemctl enable --now docker
- 开启docker软件
systemctl daemon-reload
systemctl restart docker
4、镜像管理
docker默认是前台运行, 比如docker run nginx
就是前台运行。-d是后台运行。 比如docker run -d nginx
,注意-d的位置,-d要在程序名nginx的前面。
再次声明: 容器里面一定要有前台运行的程序,否则就会自动退出。可以使用tail -f 命令保持一直前台运行。
4.1 镜像命令总结:
类型 | 命令 | 含义 |
---|---|---|
通用: | docker version | 查看docker版本 |
docker info | 查看docker信息 | |
docker inspect 镜像id或者 容器id | 查看镜像或容器 的详细信息 | |
docker images --help | 查看镜像帮助 | |
docker login | 登录镜像仓库 | |
查看镜像: | ||
docker images | 查看所有镜像 | |
docker images 镜像名称 | 查看单个镜像 | |
搜索镜像: | ||
docker search 镜像名称 | 搜索相关镜像 | |
拉取镜像: | ||
docker pull 镜像名称:标签 | 下载镜像(不加标签默认使用latest)(tag相当于是版本) | |
docker pull nginx | 拉取nginx镜像 | |
运行镜像: | ||
docker run -d nginx | 后台运行nginx镜像。 如果-d在nginx后面,那么就是在nginx里后台运行 | |
删除镜像: | ||
docker rmi 镜像id | 删除镜像,i 就是镜像,images | |
docker rmi -f images | 强制删除镜像 | |
修改标签: | ||
docker tag 旧名称 新名称 | 修改镜像的标签 | |
重新打标签: | ||
docker tag 镜像id nginx:[镜像版本号] | 重新打个标签 | |
上传镜像: | ||
docker push 镜像名 | 上传镜像 | |
导出镜像: | ||
docker save -o 保存的镜像名称 镜像的标签 | -o是指定保存目录output | |
加载镜像: | ||
docker load -i 镜像包的名称 | -i用来指定输入文件的路径 input |
4.2 查看docker版本和信息
4.2.1 查看docker版本
[root@7-3 ~]# docker version //查看docker版本
4.2.2 查看docker信息
[root@7-3 ~]# docker info //查看docker信息
4.3 拉取镜像
[root@7-3 ~]# docker pull httpd //拉取apache镜像,没写版本的话,默认就是最新 latest
4.4 查看所有镜像
[root@7-3 ~]# docker images //查看全部镜像
4.5 上传镜像
[root@7-3 ~]# docker push 镜像名 //push上传镜像
4.6 删除镜像
[root@7-3 ~]# docker rmi c2c45d506085 //rmi删不掉
Error response from daemon: conflict: unable to delete c2c45d506085 (must be forced) - image is referenced in multiple repositories
[root@7-3 ~]# docker rmi -f c2c45d506085 //-f强制,才能删掉
4.7 搜索镜像
[root@7-3 ~]# docker search nginx //搜索nginx镜像
4.8 镜像打标签
tag也是版本的意思
[root@7-3 ~]# docker tag c2c45d506085 nginx:wxj-1.18 //将镜像id,重新打个标签(标签包含标签名和版本号)
4.9 导出镜像 save -o
save 也有打包的意思
利用docker save
命令可以将从本地镜像导出为一个打包 tar文件,然后复制到其他服务器进行导入使用
格式:
docker save -o 导出的压缩包名称.tar 镜像名称:tag(版本号) //-o选项指定保存目录,output
示例:
docker save -o /mnt/nginx.tar nginx:1.18
4.10 加载、导入镜像 load -i
`方法一:`
docker load -i 镜像包的压缩包名称.tar
`方法二:`
docker load < 镜像包的压缩包名称.tar
示例:
docker load -i nginx.tar //加载nginx的安装包
导出的时候不要使用镜像id,否则导入时标签会为空!!!
示例:
[root@7-2 data]# docker save -o /data/nginx:latest.tar 605c77e624dd //最后的文件名名称是镜像id
[root@7-2 data]# docker load -i nginx:latest.tar //重新加载
[root@7-2 data]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 605c77e624dd 2 years ago 141MB //名称和标签都是空
4.11 将文件导出到本地 sz
[root@7-2 data]# ls
nginx-1.18 nginx-1.18.tar nginx.tar ssh.log zabbix-4.0.30 zabbix-4.0.30.tar.gz
[root@7-2 data]# sz nginx-1.18.tar //sz后面加上文件名
实验:将本地镜像放到阿里云私人仓库
- 首先,先登录阿里云的个人账户
- 对镜像重新打标签
[root@7-3 ~]# docker images //查看全部镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 2 years ago 141MB
nginx 1.18 c2c45d506085 3 years ago 133MB
[root@7-3 ~]# docker tag c2c45d506085 nginx:wxj-1.18 //将镜像id,重新打个标签
[root@7-3 ~]# docker images //再查看全部镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 2 years ago 141MB
nginx 1.18 c2c45d506085 3 years ago 133MB
nginx wxj-1.18 c2c45d506085 3 years ago 133MB //新的标签
- 做好要上传的镜像
[root@7-3 ~]# docker tag c2c45d506085 registry.cn-hangzhou.aliyuncs.com/wxj0523/nginx:1.18
[root@7-3 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.18 c2c45d506085 3 years ago 133MB
nginx wxj-1.18 c2c45d506085 3 years ago 133MB
registry.cn-hangzhou.aliyuncs.com/wxj0523/nginx 1.18 c2c45d506085 3 years ago 133MB
- 上传镜像,上传到aliyun账户
[root@7-3 ~]# docker push registry.cn-hangzhou.aliyuncs.com/wxj0523/nginx:1.18 //push上传
The push refers to repository [registry.cn-hangzhou.aliyuncs.com/wxj0523/nginx]
4fa6704c8474: Pushed
4fe7d87c8e14: Pushed
6fcbf7acaafd: Pushed
f3fdf88f1cb7: Pushed
7e718b9c0c8c: Pushed
1.18: digest: sha256:9b0fc8e09ae1abb0144ce57018fc1e13d23abd108540f135dc83c0ed661081cf size: 1362
小tips:镜像id都一样,怎么删除?
重复的话,删除会报错;但是如果用-f 强制删除,会把重复的都删除
[root@7-3 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.18 c2c45d506085 3 years ago 133MB
nginx wxj-1.18 c2c45d506085 3 years ago 133MB
registry.cn-hangzhou.aliyuncs.com/wxj0523/nginx 1.18 c2c45d506085 3 years ago 133MB
[root@7-3 ~]# docker rmi c2c45d506085 //rmi删不掉
Error response from daemon: conflict: unable to delete c2c45d506085 (must be forced) - image is referenced in multiple repositories
[root@7-3 ~]# docker rmi -f c2c45d506085 //-f强制,才能删掉
Untagged: nginx:1.18
Untagged: nginx:wxj-1.18
Untagged: nginx@sha256:e90ac5331fe095cea01b121a3627174b2e33e06e83720e9a934c7b8ccc9c55a0
Untagged: registry.cn-hangzhou.aliyuncs.com/wxj0523/nginx:1.18
Untagged: registry.cn-hangzhou.aliyuncs.com/wxj0523/nginx@sha256:9b0fc8e09ae1abb0144ce57018fc1e13d23abd108540f135dc83c0ed661081cf
Deleted: sha256:c2c45d506085d300b72a6d4b10e3dce104228080a2cf095fc38333afe237e2be
Deleted: sha256:43d6c481a041dbcc1d8ea9c565b1b692bcb28da3414683c316703c669c012ebc
Deleted: sha256:defebc732c194dd0b5b39e20c4d014896ce120207f5dfdb41ed6696b0e8224d6
Deleted: sha256:4ea0f2550407442f808812429981c0b62d8dd6a531db8a412640293a1faf8f3c
Deleted: sha256:778ca58cf39b8fa0776ade88562750a035a24ec5afb7dc4ab2aa892b2c09769d
Deleted: sha256:7e718b9c0c8c2e6420fe9c4d1d551088e314fe923dce4b2caf75891d82fb227d