1、概念
docker是一个开源的应用容器引擎,基于go语言开发的。
docker是运行在linux的容器化工具,可以理解为轻量级的虚拟机。
可以在任何主机上轻松创建的一个轻量级、可移植的、自给自足的容器
2、设计的理念
鲸鱼------宿主机
集装箱------独立运行的容器,相互隔离的容器,一个容器就是一个独立运行的应用程序
3、容器化的特点
1、灵活,最复杂的程序也可以实现容器化
2、轻量级,容器利用和共享主机内核
3、可互换,可以即时部署升级,即时更新
4、便携性,可以在本地构建,也可以部署到云,可以在任何地方运行
5、可扩展(依赖于k8s)
容器是在linux上运行,与其他容器共享主机内核以及主机的资源,独立运行,相互隔离的进程(应用程序)
容器运行时占用一定的资源,但是不占用其他任务的资源
4、docker和虚拟机之间的区别
docker | 虚拟机 | |
---|---|---|
启动速度 | 秒级 | 分钟级 |
计算能力损耗 | 几乎无 | 损耗50% |
性能 | 接近原生性能 | 只有80% |
系统支持数量 | 上千个(理论上) | 部署就几十个 |
隔离性 | 资源隔离 | 完全隔离 |
安全性 | 安全性差 | 安全性高 |
5、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空间中,每个进程都有独立的用户和用户组,每个用户之间可以互相不受影响
6、docker的核心概念
1、镜像
是创建容器的基础,类似虚拟机的快照,通过这个快照可以快速的创建一个容器。在镜像当中,已经封装好了程序运行需要的代码、库、运行时间、环境变量以及配置文件等
2、容器
基于镜像运行起来的进程就是容器,容器之间互相独立、互相隔离
3、仓库
保存镜像的地方
公有仓库(docker hub 阿里云)
私有仓库,不对外提供访问,自己使用
7、工作流程
8、安装
bash
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
#安装docker
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系统的详细信息
docker info
#设置加速站点
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://tqozyo9i.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
#拉取nginx镜像
docker pull nginx
#修改配置文件
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://hub.littlediary.cn/"]
}
#重新加载systemd的配置,重启docker
systemctl daemon-reload
systemctl restart docker
#拉取其他的镜像
docker pull centos:7
docker pull nginx:1.18
docker pull nginx:1.22
9、常用命令
9.1镜像相关操作
bash
#拉取镜像
docker pull
#查看与nginx相关的镜像
docker search nginx
#查看本地计算机上所有的 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
#根据image id查看镜像的详细信息
docker inspect +image id
docker的文件系统
overlayFS:联合文件系统,用于docker等容器技术之中
把多个文件系统层叠在一起,形成一个统一的文件系统
LowerDir:底层目录
包含底层的文件系统,也是容器运行的基础环境的文件系统,是根文件系统
UpperDir:可写层
容器可以在底层文件系统的基础之上进行修改,即容器内部发生的写操作,这些修改不影响底层的文件系统,达到容器内容的可写性
MergeDir:合并目录
把底层目录和可写层以及其他目录组成联合视图,也就是容器使用的文件系统
WorkDir:工作目录
处理文件系统的变更,当容器内部进行写处理时,由workdir进行处理
#删除镜像
docker rmi -f +image id
如果不加-f,镜像被容器使用,且容器正在运行,-f才能删除
#给镜像重新打标签
docker tag nginx:1.18 nginx:web
(将nginx的tag由1.18变为web)
nginx 1.18 c2c45d506085 3 years ago 133MB
nginx web c2c45d506085 3 years ago 133MB
根据image id删除镜像,那么nginx:1.18和nginx:web都会被删除
#把nginx:web这个镜像导出opt目录,保存成文件名 nginx1.18.tar
docker save -o /opt/nginx1.18.tar nginx:web
#导入镜像
方法一:docker load -i /opt/nginx1.18.tar
方法二:docker load < /opt/nginx1.18.tar
9.2容器相关操作
前提是必须要有镜像
bash
#创建容器
docker create -it nginx:web
-i:容器和用户之间可以进行交互
-t:开启一个伪终端供用户操作
-it:开启一个终端让用户可以用交互式会话访问容器进行操作
#查看所有容器,包括未运行的容器
docker ps -a
#只查看运行起来的容器
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
71487d4a37f9 nginx:web "/docker-entrypoint...." 10 seconds ago Created jovial_gould
CONTAINER:容器的唯一标识
IMAGE:容器默认运行的命令
CREATED:容器暴露的端口
NAMES:容器的名称。系统随机分配的,也可以指定容器的名称
STATUS:创建成功,不是运行。UP表示运行状态,Exited表示停止运行,Created表示创建成功
容器的生命周期:
拉取镜像------创建容器------修改镜像------重启容器------停止容器------删除容器------删除镜像
#运行容器
docker start 容器名/container id
#停止
docker stop 容器名/container id
#创建容器,本地没有的镜像会自动拉取,然后再运行
docker run -it +镜像
容器内部如果没有命令执行,容器会自动终止运行;如果有命令,执行完指定命令之后容器也会终止运行
容器要长期运行、稳定运行,必须要有一个持续的可执行命令
docker run -itd --name test1 centos:7 /bin/bash
-itd
d:后台运行,指定后台运行的命令,这样创建完成之后,即便有-it,也不会进入容器,而是停留在宿主机的界面
--name:指定名称
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
865c9e375ccd centos:7 "/bin/bash" 9 seconds ago Up 8 seconds test1
#进入容器内部查看
docker exec -it 容器名称/容器id /bin/bash
#运行nginx
docker run -itd --name nginx1 nginx:1.22
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6644684bf9f6 nginx:1.22 "/docker-entrypoint...." 4 seconds ago Up 3 seconds 80/tcp nginx1
#查看容器的ip地址
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' +容器名/id
进入容器的网络命名空间,获取ip地址
#查看容器内部的日志输出
docker logs -f +容器名
---------------------------------------------------------------------------------------------------------------------------------------
docker run -itd --name nginx2 nginx:1.22 /bin/bash
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nginx2
172.17.0.4
#无法访问
curl: (7) Failed connect to 172.17.0.4:80; 拒绝连接
容器创建的时候会有一个默认的输出或者指令
/bin/bash------------------默认执行的命令覆盖,虽然nginx在运行,但运行的不再是nginx的指令,而是/bin/bash
---------------------------------------------------------------------------------------------------------------------------------------
#端口映射,本地端口和容器端口进行映射
-P:随机指定宿主机的端口和容器的端口进行映射,端口号从32768开始
docker run -itd --name nginx4 -P nginx:1.22
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fd506d16894b nginx:1.22 "/docker-entrypoint...." 5 seconds ago Up 4 seconds 0.0.0.0:32768->80/tcp, :::32768->80/tcp nginx4
宿主机端口:32768
nginx端口:80
-p:指定端口,宿主机的端口不能被占用
docker run -itd --name nginx5 -p 81:80 nginx:1.22
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3f45633e224f nginx:1.22 "/docker-entrypoint...." 6 seconds ago Up 6 seconds 0.0.0.0:81->80/tcp, :::81->80/tcp nginx5
宿主机端口:81
容器端口:80
#把宿主机的文件复制到容器当中
docker cp /opt/index.html 容器名/id:/usr/share/nginx/html
#把容器的文件复制出来
docker cp 容器名/id:/etc/nginx/nginx.conf /opt
#导出容器
docker export -o /opt/nginx7.tar 容器名/id
#导入容器
docker import nginx7.tar -- nginx:7
#删除容器
docker rm -f 容器名
#批量停止容器
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
#删除none镜像
docker images | grep none | awk '{print $3}' | xargs docker rmi