docker基本管理和应用:
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 阿里云)。
私有仓库。不对外提供访问,自己使用。
[root@docker1 ~]# docker version #查看docker的版本 [root@docker1 ~]# docker info [root@docker1 ~]# docker pull nginx:1.22 #下载镜像并指定版本 [root@docker1 ~]# docker images #查看安装的镜像 [root@docker1 ~]# docker rmi -f a72860cb95fd #如果不加-f,镜像被容器使用,且容器正在运行,-f才能删除 #将nginx:1.18重新打一个标签,标签名为nginx:web [root@docker1 ~]# docker tag nginx:1.18 nginx:web #把ngixn:1.18这个镜像导出opt目录,保存成文件名,nginx1.18.tar [root@docker1 ~]# docker save -o /opt/nginx1.18.tar nginx:1.18 #存入镜像的两种方法 [root@docker1 opt]# docker load -i nginx1.18.tar [root@docker1 opt]# docker load < nginx1.18.tar #将存入的镜像上传仓库 [root@docker1 ~]# docker login #先登录仓库,在上传仓库 [root@docker1 ~]# docker push pplok1230/nginx:test1 #根据容器的名称或id进行启动 [root@docker1 opt]# docker start 容器名/容器id #根据容器的名称或id进行停止 [root@docker1 opt]# docker stop 容器名/容器id
docker的文件系统:
overlayFS 联合文件系统。用于docker等容器技术之中。
把多个文件系统层叠在一起,形成一个统一的文件系统。
LowerDir:底层目录
包含的底层问价系统,容器运行的基础环境的文件系统。根文件系统
UpperDir:可写层
容器可以在底层文件系统的基础之上进行修改,即容器内部发送的写作。这些修改不影响底层的文件系统。
达到容器内容的可写性
MergedDir:合并目录
底层目录和可写层以及其他目录组成联合视图。也就是容器使用的文件系统。
WorDir:工作目录
处理文件系统的变更,当容器内部进行写处理时,由workdir进行处理。
容器操作,前提必须要有镜像:
[root@docker1 ~]# docker create -it nginx:1.18 edbb0dca4212af4ecce5eedb434016b442033f93b27c4a67015310fe6024ddeb
创建容器
-i 容器和用户之间可以进行交互
-t 开启一个伪终端,用户操作
-it 开启一个终端,让用户可以用交互式会话访问容器,进行操作
[root@docker1 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES edbb0dca4212 nginx:1.18 "/docker-entrypoint.…" 9 seconds ago Created eloquent_gagarin #根据容器的名称或id进行启动 [root@docker1 opt]# docker start 容器名/容器id #根据容器的名称或id进行停止 [root@docker1 opt]# docker stop 容器名/容器id
CONTAINER ID: 容器的唯一标识
IMAGE: 容器所依赖的镜像
COMMAND: 容器默认运行的命令
CREATED: 容器的创建时间
STATUS: 创建成功,不是运行。up,表示运行状态,Exited:停止运行 Created:创建成功
PORTS: 容器暴露的端口
NAMES: 容器的名称,系统随机分配的。也可以指定容器的名称
容器的生命周期:
拉取镜像————创建容器————修改镜像————重启容器————停止容器————删除容器————删除镜像
[root@docker1 ~]# docker ps -a #查看所有的容器,包括未运行的容器 [root@docker1 ~]# docker ps #只查看运行起来的容器 [root@docker1 ~]# docker run #本地没有的镜像他会自动拉取,然后再运行。
容器内部如果没有命令执行,容器会自动终止运行
容器内部如果有命令,执行完指定命令之后,容器也会终止运行。
容器要长期运行,稳定运行,必须要有一个可持续的执行命令
-itd
d 后台运行,指定后台运行的命令,这样我们创建完成之后,即使是有-it,也不会进入容器,而是停留在宿主机的界面。
进入容器内部查看:
docker exec -it 容器名/容器的id /bin/bash bash #这个容器必须是开启的状态
第一步:
[root@docker1 ~]# docker run -itd --name nginx1 nginx:1.22 docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nginx1 #进入容器的network命令空间,获取他的ip地址。
创建的时候会有一个默认的输出或者指令:
nginx 运行nginx
/bin/bash——————默认的执行的命令覆盖,虽然nginx在运行,但是运行的不再是nginx的进程,而是/bin/bash
第二步:
端口映射,本地端口和容器端口进行映射
-P 随机指定宿主机的端口和容器的端口进行映射,端口号从32768开始
[root@docker1 opt]# docker run -itd --name nginx3 -P nginx:1.22
-p 指定宿主机的端口和容器的端口进行映射,端口号指定的宿主机的没有被占用的端口
[root@docker1 opt]# docker run -itd --name nginx4 -p 81:80 nginx:1.22
面试题:
怎么向容器中复制文件?
#往容器里复制内容 [root@docker1 opt]# docker cp /opt/index.html nginx3:/usr/share/nginx/html
怎么把容器的文件复制出来
[root@docker1 opt]# docker cp 69fa1a30591d:/etc/nginx/nginx.conf /opt/
将容器完整的导出
[root@docker1 opt]# docker export -o /opt/nginx7.tar 8e07049e103b
删除容器
[root@docker1 opt]# docker rm -f 容器名/容器id
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) #批量清理后台停止的容器
总结:
1、6个命名空间隔离
2、docker pull nginx:1.22 #下载镜像,不加标签,默认下载最新版
3、docker images #查看镜像
4、docker push #上传镜像
5、docker run -itd --name xxx -p 81:80 nginx1.22 /bin/bash #创建一个指定端口映射的容器
6、docker logs -f #查看容器的日志
7、docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 容器名/容器id #获取容器的IP地址
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