Docker基本管理和应用
1、概念
docker是一个开源的应用容器引擎,基于go语言开发的
docker是运行在linux的容器化工具,可以理解为轻量级的一个虚拟机。
可以在任何主机上轻松创建的一个轻量级,可移植的,自给自足的容器
鲸鱼------------>宿主机
集装箱---------->独立运行的容器,相互隔离的容器,一个容器就是一个独立运行的应用程序。
2、容器化的特点
1.1 灵活,最复杂的程序也可以实现容器化
1.2 轻量级,容器利用和共享主机内核
1.3 可互换,可以即时部署升级,即时更新
1.4 便携性,可以在本地构建,也可以部署到云,可以在任何地方运行
1.5 可扩展,依赖于k8s
总结:容器是在linux上运行,与其他容器共享主机内核以及主机的资源,独立运行,相互隔离的进程(应用程序),轻量级的,容器运行时占用一定的资源,但是不占用其他任务的资源
3、docker和虚拟机的区别
docker | 虚拟机 | |
---|---|---|
启动速度 | 秒级 | 分钟级 |
计算能力损坏 | 几乎无 | 损耗50% |
性能 | 接近原生性能 | 只有80% |
系统支持数据 | 上千个(理论上) | 部署也就几十个 |
隔离性 | 资源隔离 | 完全隔离 |
安全性 | 安全性差 | 安全性高 |
docker如何做到资源隔离?
linux的命令空间(面试题)
4、docker使用内核技术的两个重要技术
1.1 namespace,实现资源隔离
1.2 cgroup,资源限制
资源隔离:linux有6项隔离
4.1 namespace 命令空间
1.1 UTS 主机名与域名 通过在UTS命令空间创建进程,这个进程可以看到自己的主机名和域名,与宿主机的其他进程进行分割
1.2 IPC 信号量,消息队列,共享内存,进程拥有独立的通信资源,不受其他的进程影响。
1.3 PID 进程编号,每个进程在系统中都有唯一标识,唯一标识就是pid,使用不同的pid,保证进程之间不发生冲突
1.4 network 网络设备,网络端口等等,在network空间中,每个进程都有自己独立的端口号,靠端口号可以实现网络访问的隔离
1.5 mount 挂载点(文件系统),每个进程使用不同的文件系统挂载点,不同的mount的文件系统互不干扰
1.6 user 用户和用户组,在user空间当中,每个进程都有独立的用户和用户组,每个用户之间可以互相不受影响
5、docker的核心概念
1.1 镜像
镜像是创建容器的基础,类似虚拟机的快照,通过这个快照可以快速的创建一个容器,在镜像当中,已经封装好了程序运行需要的代码,库,运行时间,环境变量以及配置文件。
1.2 容器
基于镜像运行起来的进程就是容器,容器之间互相独立互相隔离
1.3 仓库
保存镜像的地方,公有仓库(docker、hub、阿里云)私有仓库(不对外提供访问,自己使用)
工作流程:
内存60g 4核 8g
6、Docker安装
systemctl stop firewalld
setenforce 0
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce-24.0.1 docker-ce-cli-24.0.1 containerd.io
systemctl restart docker
systemctl enable docker
docker version # 查看版本
docker info # 查看信息
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://7j9zrtab.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
docker pull nginx
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://hub.littlediary.cn/"]
}
wq!
systemctl daemon-reload
systemctl restart docker
docker pull nginx
docker pull centos:7
docker pull nginx:1.18
docker pull nginx:1.22
# docker pull 指定往下拉取镜像
docker images # 查看镜像
docker inspect 镜像名/imageid号 # 查看镜像的详细信息
7、查看镜像的详细信息
docker images # 查看镜像
docker inspect 镜像名/imageid号 # 查看镜像的详细信息
7.1 docker的文件系统
overlayFS
:联合文件系统。用于docker等容器技术之中,把多个文件系统层叠在一起,形成一个统一的文件系统
LowerDir
:底层目录。包含底层的文件系统,容器运行的基础环境的文件系统。根文件系统
UpperDir
:可写层。容器可以在底层文件系统的基础之上进行修改,即容器内部发生的写操作,这些修改不影响底层的文件系统,目的达到容器内容的可写行。
MergedDir
:合并目录。把底层目录和可写层以及其他目录组成联合视图,也就是容器使用的文件系统。
WorkDir
:工作目录。用来处理文件系统的变更,当容器内部进行写处理时,由workdir进行处理
8、如何删除镜像?
docker rmi -f 镜像名+标签
docker rmi -f imageid号
# 如果不加 -f 镜像被容器使用且容器正在运行,删除不了。
9、如何给镜像重新打标签?
docker tag nginx:1.18 nginx:web
# imageid一样,删除imagerid全部删除,指定镜像名删除则删除镜像
10、镜像导出
docker save -o /opt/nginx:1.18.tar nginx:1.18
# 把nginx:1.18 这个镜像导出到opt目录,保存成文件名nginx:1.18.tar
11、镜像导入
方法一:docker load -i /opt/nginx:1.18.tar
方法二:docker load < nginx:1.18.tar
12、上传镜像(需加速器)
docker login # 先登录
docker push pplok1230/nginx:test1 # 再push
13、容器操作(前提:镜像)
docker iamges
docker create -it 镜像名可加tag名
# create -it 创建容器
# -i 容器和用户之间可以进行交互
# -t 开启一个伪终端,让用户操作
# -it 开启一个终端,让用户可以用交互式会话访问容器,进行操作
docker ps -a # a表示所有
CONTAINER ID:容器的唯一标识
IMAGE:容器所依赖的镜像
COMMAND:容器默认运行的命令
CREATED:容器的创建时间
PORTS:容器暴露的端口
NAMES:容器的名称,系统随机分配,也可以指定容器的名称
status:创建成功,不是运行。Up表示运行,Exite表示停止运行,Created表示创建成功
docker start 名称/cotainer id
docker stop 名称/cotainer id
容器的生命周期:
拉取镜像--------创建容器-------修改镜像------重启容器------停止容器------删除容器------删除镜像
13.1创建容器
docker create -it 镜像名可加tag名
13.2 查看容器
docker ps -a # 查看所有容器,包括未运行的容器 a表示所有
docker ps # 只查看运行的容器
13.3 docker run命令
docker run # 本地没有的镜像,会自动拉取,然后再运行
容器内部如果没有命令执行,容器会自动终止运行;如果有命令,执行完指定命令之后,容器也会终止运行;容器要长期运行,稳定运行,必须要有一个执行的可执行命令
-itd
d 后台运行。指定后台运行的命令,这样我们创建完成之后,即使有-it,也不会进入容器,而是停留在宿主机的界面
docker run -itd --name test1 centos:7 /bin/bash
# -itd 交互且后台运行
# --name test1(名称) 指定名称就不会系统出现的名称
# centos:7 指定镜像
# /bin/bash 运行的命令,始终以/bin/bash运行
13.4 进入容器内部查看
方法一:docker exec -it 容器名称/容器的id /bin/bash
方法二:docker exec -it 容器名称/容器的id bash
exit # 退出命令
修改nginx页面:echo hello > /usr/share/nginx/html/index.html # 在容器内修改
13.5 查看容器的ip地址
第一步:看宿主机,ifconfig
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 容器名/容器的id
进入容器的network命令空间,获取ip地址
13.6 查看容器的内部日志
docker logs -f 容器名
13.7 访问获取的ip地址
curl 获取ip地址
# 如果创建容器,默认命令以/bin/bash结尾,则无法访问获取的IP地址
解释:
创建的时候会有一个默认的输出或者指令
nginx 运行nginx
/bin/bash--------> 默认的执行的命令覆盖,虽然nginx在运行,但是运行的不再是nginx的进程,而是/bin/bash
13.8 端口映射
端口映射:本地端口和容器端口进行映射
docker run -itd --name 指定名字 -P nginx:1.22
# 随机指定宿主机的端口和容器的端口进行映射,端口号从32768开始
docker run -itd --name 指定名字 -p 81:80 nginx:1.22
# 前一个是宿主机,后一个是容器的的端口
浏览器访问:宿主机ip:32768/81 # 即可访问容器nginx的web页面
13.9 如何把宿主机的文件复制到容器?
(面试会问:怎么把容器复制文件?怎么把容器的文件复制出来?)
宿主机到容器:
(1):echo "this is nginx-docker " > /opt/index.html # 非必要,路径可以任意指定
(2):docker cp /opt/index.html 已存在的指定名字/容器id:/usr/share/nginx/html/
# 把宿主机的index.html复制到容器
容器到宿主机:
docker cp 已存在的指定名字/容器id:/etc/nginx/nginx.conf /opt/
# 把容器中的nginx.conf复制到宿主机的/opt目录下
13.10 导出、导入容器
导出容器:docker export -o /opt/自定义名.tar 容器名/容器id
导入容器:docker import 上面的自定义名.tar -- 程序名:tag
13.11 删除容器
docker rm -f 容器名1 容器名2
总结
1、6个命名空间隔离
2、docker pull nginx:1.22
3、查看镜像 docker images
4、上传镜像 docker pull
5、docker run -itd --name xxx -p 81:80 nginx:1.22 /bin/bash
6、查看日志 docker logs -f
7、获取容器的ip地址 docker inspect -f ‘{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}’ nginx1
8、宿主机到容器 docker cp /opt test1:/opt
容器到宿主机 docker cp test1:/opt /opt
9、导出镜像 docker save -o /opt/nginx.tar nginx:1.22
docker load -i /opt/nginx.tar
10、导出容器 docker export -o nginx7.tar 容器名/容器id
导入容器 docker import nginx7.tar – nginx:7
11、删除镜像 docker rmi -f
删除容器 docker rm -f
inx1
8、宿主机到容器 docker cp /opt test1:/opt
容器到宿主机 docker cp test1:/opt /opt
9、导出镜像 docker save -o /opt/nginx.tar nginx:1.22
docker load -i /opt/nginx.tar
10、导出容器 docker export -o nginx7.tar 容器名/容器id
导入容器 docker import nginx7.tar – nginx:7
11、删除镜像 docker rmi -f
删除容器 docker rm -f