docker基础
1.概念
概述
docker是一个开源的应用容器引擎,基于go语言开发的,使用的apache2.0的协议。
docker是在Linux里面运行的容器化的开源工具。是一种轻量级的虚拟机。
鲸鱼是宿主机
集装箱是一个个独立的应用。每个应用之间都是互相隔离和独立的。
容器的生命周期
-
封装
-
发布
-
部署
-
运行
-
销毁
容器的生命周期----->达到一次封装,多次运行的目的
可移植,可扩展,兼容性的目的,随时随地都可以快速的部署和使用docker的应用。
docker是在Linux上运行,与其他的容器共享主机的内核,包括其他的资源(CPU,内存,硬盘),但是每个docker应用都是独立的进程。
docker应用独立的原因
linux的命名空间 namespace 可以实现资源的隔离;
cgroup 可以实现对docker应用程序的资源限制
namespace是内核的一种特性,允许将一组系统资源进行隔离,使得一个命名空间中的进程看起来像在系统中拥有独立的资源。
namespace的6个命名空间
(1)UTS
系统调用的参数 clone_newuts
隔离的内容:主机名和域名,在每个应用中,都能看到自己的主机名和域名,与其他进程分隔开。
(2)PID 进程隔离
隔离内容:进程编号,当运行应用之后,每个应用都有自己的独立的进程编号空间,每个程序之间不会发生冲突。
(3)network 网络隔离
隔离内容:每个应用启动之后,都有自己独立的网络空间,隔离网络设备,端口,和网络栈。
(4)mount 隔离文件系统
隔离内容:隔离文件系统,每个应用挂载之后都有自己独立的文件系统挂载点,这些挂载点互不冲突,也不会互相干扰。
(5)IPC 隔离通信资源
隔离内容:隔离的是信号量,消息队列和共享内存,在ipc隔离当中,每个进程之间都有独立的通信资源。
(6)user 隔离用户和用户组
隔离内容:用户和用户组,每个用户和用户组都是独立的命名空间,不同的用户和用户组之间是隔离开的。
docker的核心组件
(1)仓库
docker的仓库是用来保存镜像的地方,也是获取镜像和上传镜像的目的地。
(2)镜像
docker的镜像是创建容器的基础,一个镜像就类似于一个可执行的、包含源码的二进制包,包括容器运行的参数,设置,环境变量和配置文件。实际上就是一个打包好的可运行程序。
(3)容器
容器是基于镜像创建的运行的实例。
2.安装
安装docker
apt-get update
apt-get install ca-certificates curl gnupg
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get updateapt -y install docker-ce=5:24.0.1-1~ubuntu.22.04~jammy docker-ce-cli=5:24.0.1-1~ubuntu.22.04~jammy containerd.io docker-buildx-plugin docker-compose-plugin
#检测是否安装成功
docker -v
dockerd -v
获取镜像
vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://docker.unsee.tech",
"https://dockerpull.org",
"https://docker.1panel.live",
"https://dockerhub.icu"
]
}
systemctl daemon-reload
systemctl restart docker
docker pull nginx:1.22
docker pull ubuntu:22.04
3.docker的基本命令
(1)查看本地镜像
docker images #查看当前已经下载到本地的镜像
- REPOSITORY 应用的名称
- TAG 标签,镜像的标签,应用的版本
- IMAGE ID 镜像id
- CREATED 发布在镜像仓库的时间
- SIZE 镜像的大小
(2)查看镜像的详细信息
docker inspect 镜像id
镜像下载后的信息:下载完之后保存在/var/lib/docker
- overlay2 镜像的联合文件系统。
- lowerDir:镜像的底层文件系统,整个镜像根文件系统(运行载体)。
- UpperDir:可写层,用户可以自定义的在底层文件系统上进行修改,但是这些修改又不影响根文件系统,容器可以实现读写。
- MergedDir:合并目录,就是用户看到容器内的一个视图。
- WorkDir:工作目录,进行写操作,可以使overlay2更新和跟踪对于文件系统的修改。
(3)修改镜像的标签
docker tag nginx:1.22 nginx:test
#给nginx:1.22做了一个副本
#修改已有的应用的标签,方便用户使用
镜像的组成:
nginx:1.22
镜像名 标签
(4)删除镜像
docekr rmi -f nginx:test 删除镜像(慎用)
(5)导出/导入镜像
docker save -o /opt/ubuntu.tar ubuntu:22.04
#把本地镜像导出到指定位置,保存为指定名称
docker load -i centos.tar #把镜像导入到本地
(6)创建容器
docker run -itd ubuntu:22.04
docker run -itd --name test1 ubuntu:22.04
#
run:如果本地不存在指定的镜像,它会自动去仓库拉取指定的镜像,然后再创建容器。
-i:表示容器开启标准输入,接受用户输入的指定
-t:生成一个伪终端tty,用户可以进入容器的内部
-d:容器创建完成之后进入后台运行
--name 自定义容器的名称
docker run --name test2 nginx:test /bin/bash -c "ls /"
#执行ls / 命令之后,就会结束生命周期
(7)查看容器的状态
docker ps #查看状态是running的容器
docker ps -a #查看所有状态的容器,包括运行和停止以及报错的容器。
出现exit的原因:
容器启动之后,都会有一个执行的命令,如果该命令执行完毕之后没有其他的可执行内容,那么容器会立刻退出进入终止状态。
(8)进入容器内部
docker exec -it 容器id/名称 /bin/bash 或者 bash
(9)容器和宿主机之间的交互
容器的文件复制到宿主机
docker cp test3:/var/log/nginx/access.log /opt
宿主机的文件复制到容器内部
docker cp sources.lsit test3:/etc/apt
查看容器的标准输出(查看日志)
docker logs -f 容器名称或容器ID#动态查看容器的日志
(10)端口映射
-p 需要人工指定宿主机的端口和容器进行映射 只要指定端口宿主机没有被占用,都可以使用
-P 指定宿主机的随机端口和容器内的端口进行映射,从32768开始---65535
docker run -itd --name nginx1 -P nginx:test
docker ps
curl 192.168.206.30:32769
docker run -itd --name nginx2 -p 88:80 nginx:test
88宿主机端口 80容器内部端口
做了端口映射,就可以对外提供服务了
(11)强制删除容器
docker rm -f nginx2
#强制删除
不强制删除就要先关闭容器再删除
(12)查看容器的ip地址
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' test1
(13)批量删除容器
docker ps -a | awk 'NR>=2{print $1}' | xargs docker rm -f
(14)批量清理所有后台已经停止的容器
docker rm $(docker ps -a -q)