docker是什么?
开源的应用容器引擎,基于go语言开发的。
docker是运行在linux的容器化工具,可以理解为轻量级的虚拟机。
可以在任何主机上,轻松创建的一个轻量级,可移植的,自给自足的容器。
设计理念
鲸鱼-------------------->宿主机
集装箱------------------>一个一个独立运行的容器,相互隔离的容器。一个容器就是一个独立运行的应用程序。
容器化的特点
1、灵活,最复杂的程序也可以实现容器化。
2、轻量级,容器利用率和共享主机内核。
3、可互换,可以及时部署升级,及时更新。
4、便携性,可以在本地搭建,也可以部署到云,可以在任何地方运行。
5、可扩展(依赖于k8s)
容器是什么
在linux上运行,与其他容器共享主机内核以及主机板资源,独立运行,相互隔离的进程(应用程序)
轻量级,容器运行时占用的资源,但是不占用其他任务的资源
docker和虚拟机的区别
docker | 虚拟机 | |
---|---|---|
启动速度 | 秒级 | 分钟级 |
计算能力损耗 | 几乎无 | 损耗50% |
性能 | 接近原生性能 | 只有80% |
系统支持数据 | 上千个(理论上)正常几十个 | 部署也就几十个 |
隔离性 | 资源隔离 | 完全隔离 |
安全性 | 安全性差 | 安全性高 |
linux的命令空间 (面试题)
docker使用内核技术的两个重要的技术:
1、namespace命令空间实现资源隔离
2、cgroup资源限制
资源隔离:linux有6项隔离
namespace命令空间实现资源隔离
1、UTS 主机名和域名
通过在UTS命令空间创建进程,这个进程可以看到自己的主机名和域名,与宿主机的其他进程进行分隔。
2、IPC 信号量,消息队列,共享内存
进程拥有独立的通信资源,不受其他进程影响。
3、PID 进程编号
每个程序在系统中都有一个唯一标识,唯一标识就是PID,使用不同的PID可以保证进程之间不发生冲突
4、network 网络设备,网络端口等等
在network空间当中,每个进程都有自己的独立的端口号,靠端口号可以实现网络访问的隔离。
5、mount 挂载点(文件系统)
每个进程使用不同的文件挂载点,不同的mount的文件系统互不干扰。
6、user 用户和用户组
在user空间当中,每个进程都有独立的用户和用户组。每个用户之间可以互相不受影响。
docker的核心概念
1、镜像
镜像时创建容器的基础,类似虚拟机的快照,通过这个快照可以快速的创建一个容器。
在镜像当中,已经封装好了程序运行需要的代码,库,运行时间,环境变量以及配置文件。
2、容器
基于镜像运行起来的进程就是容器。容器之间互相独立,互相隔离。
3、仓库
用来保存镜像的地方。共有仓库(docker hub 阿里云)。
私有仓库,不对外提供访问,自己使用。
工作流程
上传镜像--------拉取镜像---创建容器
安装docker
[root@docker2 opt]# yum install -y yum-utils device-mapper-persistent-data lvm2
[root@docker2 opt]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@docker2 opt]# yum install -y docker-ce-24.0.1 docker-ce-cli-24.0.1 containerd.io
#阿里云官网复制
[root@docker1 docker]# mkdir -p /etc/docker
[root@docker1 docker]# tee /etc/docker/daemon.json <<-'EOF'
> {
> "registry-mirrors": ["https://jvzk7vuy.mirror.aliyuncs.com"]
> }
> EOF
{
"registry-mirrors": ["https://jvzk7vuy.mirror.aliyuncs.com"]
}
[root@docker1 docker]# systemctl daemon-reload
[root@docker1 docker]# systemctl restart docker
[root@docker1 docker]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://hub.littlediary.cn/"]
}
[root@docker1 docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest a72860cb95fd 7 weeks ago 188MB
nginx 1.22 0f8498f13f3a 16 months ago 142MB
centos 7 eeb6ee3f44bd 2 years ago 204MB
nginx 1.18 c2c45d506085 3 years ago 133MB
docker的文件系统
查看文件系统
查看文件系统
[root@docker1 docker]# docker inspect (imageID)
#文件系统里的重要信息
overlayFS:联合文件系统。用于docker等容器技术之中。
把多个文件系统层叠在一起,形成一个统一的文件系统
LowerDir:底层目录
包含的底层文件系统,容器运行的基础环境的文件系统。根文件系统
UpperDir:可写层
容器可以在底层文件系统的基础上进行修改,即容器内部发生写操作。这些修改不影响底层的文件系统。
达到容器内部的可写性
MergedDir:合并目录
把底层目录和可写层以及其他目录组成联合目录。也就是容器使用的文件系统。
WorkDir:工作目录
处理文件系统的变更,当容器内部进行写处理时,由workdir进行处理。
删除镜像
删除镜像
[root@docker1 docker]# docker rmi -f (imageID)
如果不加-f,镜像被使用,且容器正在进行。才能删除。
#有重复可以删版本
[root@docker1 docker]# docker rmi -f 版本
#把nginx:1.18导出到/opt/下nginx1.18.tar
[root@docker1 docker]# docker save -o /opt/nginx1.18.tar nginx:1.18
#把/opt/下的文件导入
[root@docker1 docker]# docker load -i nginx1.18.tar
容器操作:前提是必须要有镜像
[root@docker1 opt]# docker create -it nginx:1.18
-i 容器和用户之间可以进行交互
-t 开启一个伪终端,用户操作
-it 开启一个终端,让用户可以用交互式会话访问容器,进行操作
fbd0272801f428ebcf5ac697923060a7b56393011860300e41b7b7f277371ba4
[root@docker1 opt]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fbd0272801f4 nginx:1.18 "/docker-entrypoint.…" 8 seconds ago Created unruffled_napier
CONTAINERID:容器的唯一的标识
IMAGE: 容器所依赖的镜像
command: 容器默认运行的命令
CREATED:容器的创建时间
ports:容器暴露的端口
NAMES:容器的名称,系统随机分配的。也可以指定容器的名称
STATUS:创建成功,不是运行。Up,表示运行状态。Exited:停止运行 Created:创建成功
容器的生命周期
拉取镜像---创建容器---修改镜像---重启容器---停止容器---删除容器---删除镜像
[root@docker1 opt]# docker ps -a
#查看所有容器,包括未运行的容器
[root@docker1 opt]# docker ps
#只查看运行的容器
[root@docker1 opt]# docker run
#本地没有的镜像,他会自动拉取然后再运行
直接进入容器
[root@docker1 opt]# docker run -it centos:7
[root@c194306b4b60 /]# ls
anaconda-post.log dev home lib64 mnt proc run srv tmp var
bin etc lib media opt root sbin sys usr
[root@c194306b4b60 /]# exit
exit
[root@docker1 opt]#
容器内部如果没有命令执行,容器会自动终止运行。
如果有命令,执行完命令之后,容器也会终止运行。
容器要长期运行,稳定运行,必须要有一个可执行的持续的命令。
#自动拉取nginx:1.18,名字是nginx1
[root@docker1 opt]# docker run -itd --name nginx1 nginx:1.18
158ad2622ba165560dfeae20e1e23b5a64391cea9e4f3fa9a22713012affce84
#查询docker的ip地址
[root@docker1 opt]# docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nginx1
172.17.0.2
-itd
d:后台运行,指定后台运行的命令,这样我们创建完整之后,即便是有-it也不会进入容器,
进入容器内部查看:
docker exec -it 容器名称/容器的id /bin/bash bash
'{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}'
进入容器的network命令空间,获取它的ip地址
#动态查看日志
[root@docker1 opt]# docker logs -f nginx1
创建的时候会有一个默认的输出或者命令
/bin/bash---------默认的执行命令覆盖,虽然nginx正在运行,但是运行的不再是nginx的进程,而是/bin/bash
端口映射
本地端口和容器端口映射
#-P 随机指定宿主机的端口和容器的端口进行映射 端口号从32768开始
[root@docker1 opt]# docker run -itd --name nginx3 -p 81:80 nginx:1.22
7f77b2ac050d98a3f29e8eb5ffa6d7c569fd566e4b656f1cd1c00f6d3105abe9
[root@docker1 opt]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7f77b2ac050d nginx:1.22 "/docker-entrypoint.…" 6 seconds ago Up 5 seconds 0.0.0.0:81->80/tcp, :::81->80/tcp nginx3
面试题
怎么向容器中复制文件
#把宿主机文件复制到容器
[root@docker1 opt]# docker cp /opt/index.html nginx1:/usr/share/nginx/html
怎么把容器文件复制出来
[root@docker1 opt]# docker cp 158ad2622ba1:/etc/nginx/nginx.conf /opt/
Successfully copied 2.56kB to /opt/
[root@docker1 opt]# ls
containerd index.html nginx1.18.tar nginx.conf
导出容器
[root@docker1 opt]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
158ad2622ba1 nginx:1.18 "/docker-entrypoint.…" 18 minutes ago Up 18 minutes 80/tcp nginx1
[root@docker1 opt]# docker export -o /opt/nginx1.tar 158ad2622ba1
[root@docker1 opt]# ls
containerd index.html nginx1.18.tar nginx1.tar nginx.conf
怎么删除容器
[root@docker1 opt]# docker rm -f nginx1
nginx1
docker的命令
docker ps -a | awk 'NR>=2{print "docker stop "$1}' | bash #批量停止容器
docker ps -a | awk 'NR>=2{print $1}'| xargs docker stop
docker ps -a | awk 'NR>=2{print "docker rm "$1}' | bash #批量删除所有容器
docker ps -a | awk 'NR>=2{print $1}'| xargs docker rm
docker images | awk 'NR>=2{print "docker rmi "$3}' | bash #批量删除镜像
docker images | grep none | awk '{print $3}' | xargs docker rmi #删除none镜像
docker rm $(docker ps -a -q) #批量清理后台停止的容器
#批量删除
[root@docker1 opt]# docker ps -a | awk 'NR>=2{print "docker rm "$1}' | bash
不在运行的容器就会被删除,在运行的删除不掉。
运行容器
创建容器
[root@docker1 opt]# docker create -it nginx:1.22
e95499a02b18e60d75cb6b5fdc36bc9f74a2a34cfa66d49fc58a280350e0053e
#查看容器运行状态
[root@docker1 opt]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e95499a02b18 nginx:1.22 "/docker-entrypoint.…" 3 seconds ago Created objective_herschel
#启动容器
[root@docker1 opt]# docker start e95499a02b18
e95499a02b18
#查看容器是否运行起来
[root@docker1 opt]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e95499a02b18 nginx:1.22 "/docker-entrypoint.…" 46 seconds ago Up 11 seconds 80/tcp objective_herschel #up表示正在运行
容器在运行时删不掉,只有先停容器再删镜像
1、6个命令空间隔离
2、docker pull nginx:1.22 #获取镜像到仓库
3、docker imagres #查看仓库所有镜像
4、docker pull 上传
5、docker run -itd --name xxx -p 81:80 nginx:1.22 /bin/bash
6、docker logs -f 查看日志
7、docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nginx1 获取容器ip地址
8、docker cp /opt test1:/opt 宿主机到容器
docker cp test1:/opt /opt 容器到宿主机
9、docker save -o /opt/nginx.tar nginx:1.22 #导出nginx版本
docker load -i /opt/nginx.tar #导入nginx版本到容器
10、docker export -o nginx7.tar 容器名/容器id #导出
docker import nginx7.tar --nginx:7 #导入
11、删除镜像 docker rmi -f
删除容器 docker rm -f