docker的基本管理和应用

docker是什么?

docker是一个开源的应用容器引擎,基于GO语言开发的。

docker试运行在linux的容器化工具,可以理解为轻量级的虚拟机。

可以在任何主机上轻松创建的一个轻量级,可移植的,自给自足的容器。

鲸鱼-------------------宿主机

集装箱----------------独立运行的容器,相互隔离的容器(一个容器就是一个独立运行的应用程序)


容器化的特点:

1、灵活,最复杂的程序也可以实现容器化

2、轻量级 容器利用和共享主机内核

3、可互换,可以即时部署升级,即时更新

4、便携性:可以在本地构建,也可以部署到云,可以在任何地方运行

5、可扩展(依赖于k8s)

容器实在linux上运行,与其他容器共享主机内核以及主机的资源,独立运行,相互隔离的进程(应用程序)

轻量级的,容器运行时占用一定的资源,但是不占用其他任务的资源。

docker和虚拟机之间的区别

|--------|----------|-------|
| | docker | 虚拟机 |
| 启动速度 | 秒级 | 分钟级 |
| 计算能力损耗 | 几乎没有 | 损耗50% |
| 性能 | 接近原生性能 | 只有80% |
| 系统支持数据 | 上千个(理论上) | 几十个 |
| 隔离性 | 资源隔离 | 完全隔离 |
| 安全性 | 安全性差 | 安全性高 |

linux命令空间 (面试题)

docker使用内核技术的两个重要的技术:

一、namespace实现资源隔离

二、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的文件系统:

overlayFS 联合文件系统,用于docker等容器技术之中

把多个文件系统层叠在一起,形成一个统一的文件系统

LowerDir:底层目录

包含的底层文件系统,容器运行的基础环境的文件系统,根文件系统

UpperDir:可写层

容器可以在底层文件系统的基础之上进行修改,即容器内部发生的写作,这些修改不影响底层的文件系统

达到容器内容的可写性

MergedDir:合并目录

把底层目录和可写层以及其他目录组成联合视图,也就是容器使用的文件系统

WorkDir:工作目录

处理文件系统的变更,当容器内部进行写处理时,由workdir进行处理


docker的基本命令

容器操作,前提必须要有镜像

docker images 查看拉取的镜像

docker tag 给镜像打标签
docker create -it nginx:1.22 创建容器

-i 容器和用户之间可以及进行交互

-t 开启一个伪终端,用户操作

-it 开启一个终端,让用户可以用交互会话访问容器,进行操作

docker ps -a 查看所有容器,包括未运行的容器

docker ps 只查看运行起来的容器

[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE        COMMAND                   CREATED          STATUS    PORTS     NAMES
d72df17d92a0   nginx:1.22   "/docker-entrypoint...."   11 seconds ago   Created             affectionate_boyd

CONTAINER ID 容器所依赖的唯一标识

IMAGE 容器所依赖的镜像

command 容器默认运行的命令

CREATED 容器的创建时间

ports 容器暴露的端口

NAMES 容器的名称,系统随机分配的,也可以指定容器的名称

status 创建成功, 不是运行,Up:表示运行状态,Exited:停止运行

Create:创建成功

docker start affectionate_boyd 启动容器后面跟上容器的名称
docker rmi -f +images id 删除镜像

如果不加-f,镜像被容器使用且容器正在运行,-f才能删除。
docker save -o /opt/nginx1.18.tar nginx:1.18 把nginx:1.18这个以.tar格式保存在opt里面

docker load -i 导入镜像

容器的生命周期:

拉取镜像-----------创建容器----------修改镜像-------------重启容器-------------停止容器-------------删除容器-------------删除镜像

docker run(最常用的命令)

特点:本地没有的镜像会自动拉取然后再运行

容器内部如果没有命令执行,容器会自动终止运行,如果有命令执行完指定命令之后,容器也会终止运行

容器要长期运行,稳定运行,必须要有一个执行的可执行命令

docker run -itd --name test1 centos:7 /bin/bash

指定容器名称 镜像

d后台运行,指定后台运行的命令,这样我们创建完之后,即便是有-it,也不会进入容器而是停留在宿主机的界面

进入容器内部查看:

docker exec -it 容器名称/容器的id /bin/bash bash

进入容器的network命令空间,获取他的ip地址

docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}} +容器名/id

创建一个nginx1的容器

docker run -itd --name nginx1 nginx:1.22

查看一下容器表

进入容器

容器相当于在系统中又装了一个精简的系统

docker logs -f +容器名 获取容器的日志

创建的时候会有一个默认的输出或者指令:

nginx 运行nginx

/bin/bash--------------->默认的执行的命令被覆盖,虽然nginx在运行,但是运行的不再是nginx的进程,而是/bin/bash

端口映射:

本地端口和容器端口进行映射

-P 随机指定宿主机的端口和容器的端口进行映射 宿主机端口号从32768开始

docker run -itd --name nginx2 (容器名)-P nginx:1.22 (镜像)

-p 指定宿主机的端口和容器的端口进行映射 宿主机端口号只要没有被占用都可以使用

docker run -itd --name nginx3 (容器名)-p 81:80 nginx:1.22(镜像)

指定端口

前一个是宿主机的端口后面一个是容器的端口

如何把宿主机的内容复制到容器里面(面试题)

docker cp /opt/index.html +容器名 :/usr/share/nginx/html

相反如果要把容器的内容复制到主机只需把位置对调一下就行了

docker save -o /opt/nginx.tar nginx:1.22 把镜像保存为.tar格式的文件

docker load -i /opt/nginx.tar 从指定的文件加载镜像
docker export -o nginx.tar +id号 导出容器
docker import nginx.tar --nginx:7 导入容器
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) #批量清理后台停止的容器


docker总结

1、6个命令空间隔离
2、docker pull nginx:1.22 拉取镜像
3、docker images 查看镜像
4、docker push 上传
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 把镜像保存为.tar格式的文件
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

相关推荐
运维&陈同学34 分钟前
【zookeeper01】消息队列与微服务之zookeeper工作原理
运维·分布式·微服务·zookeeper·云原生·架构·消息队列
是阿建吖!35 分钟前
【Linux】进程状态
linux·运维
明明跟你说过1 小时前
Linux中的【tcpdump】:深入介绍与实战使用
linux·运维·测试工具·tcpdump
O&REO1 小时前
单机部署kubernetes环境下Overleaf-基于MicroK8s的Overleaf应用部署指南
云原生·容器·kubernetes
运维小文2 小时前
K8S资源限制之LimitRange
云原生·容器·kubernetes·k8s资源限制
登云时刻2 小时前
Kubernetes集群外连接redis集群和使用redis-shake工具迁移数据(二)
redis·容器·kubernetes
Mr_Xuhhh2 小时前
重生之我在学环境变量
linux·运维·服务器·前端·chrome·算法
朝九晚五ฺ10 小时前
【Linux探索学习】第十四弹——进程优先级:深入理解操作系统中的进程优先级
linux·运维·学习
Kkooe11 小时前
GitLab|数据迁移
运维·服务器·git
wuxingge11 小时前
k8s1.30.0高可用集群部署
云原生·容器·kubernetes