文章目录
namespace、cgroup、联合文件系统(容器的核心技术 )
# namespace
pid namespace # 隔离进程id
net namespace # 隔离网络接口
mnt namespace # 文件系统挂载点隔离
ipc namespace # 信号量,消息队列和共享内存的隔离
uts namespace # 主机名和域名的隔离
# cgroup # 是一种linux内核功能,可限制和隔离进程的资源使用情况(CPU、内存、磁盘I/O、网络等)
# 联合文件系统 # 又叫UnionFS,是通过创建文件层进行操作的文件系统,常用的联合文件系统有AUFS、Overlay2、Devicemapper等
容器、镜像、仓库(三大核心概念)
# 镜像image
是一个只读的文件和文件目录的组合体,是静态只读文件,是docker容器启动的先决条件
# 容器
容器是镜像运行的实体,
容器运行着真正的应用进程,
容器有初建、运行、暂停、停止、删除五种状态。
# 仓库
集中存放镜像的地方,最大的仓库 dockerhub
镜像image的常见操作方法
# 拉取镜像
#语法格式
docker pull <镜像名称>:<标签>
docker pull nginx # 拉取docker官方最新版nginx(即 latest 标签)
docker pull nginx:1.21 # 拉取docker官方指定版本nginx
docker pull docker.io/nginx # 从指定镜像仓库docker.io拉取最新版nginx
docker pull myregistry.com/my_namespace/my-image:mytag # 从指定私有镜像仓库拉取特定镜像的特定tag版本
docker pull --platform=linux/arm64 myregistry.com/my_namespace/my-image:mytag # 拉取指定架构平台的镜像
# 查看镜像
[root@localhost ~]# docker images # 查看本地镜像列表
镜像的仓库名 标签 镜像唯一ID 镜像创建时间 镜像大小
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 3b25b682ea82 5 weeks ago 192MB
mysql 5.7.44 5107333e08a8 11 months ago 501MB
# 查看特定镜像的详细信息
docker inspect <image id|image name:tag> # 返回JSON格式的详细信息,含镜像的配置、创建时间、大小、环境变量等
docker inspect nginx:latest
# 查看镜像的历史记录
docker history <image id|image name:tag> # 显示了镜像构建的每一层,包括每层的大小和执行的命令
docker history nginx:latest
# 查看镜像的大小(使用 docker images --format 命令按格式化输出,仅查看镜像的名称、标签和大小)
[root@localhost ~]# docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"
REPOSITORY TAG SIZE
nginx latest 192MB
mysql 5.7.44 501MB
# 重命名镜像(可以对镜像名或者tagj进行操作)
# 语法
docker tag <旧镜像名称:旧标签> <新镜像名称:新标签>
docker tag nginx:latest mynginx:latest # 将nginx:latest镜像重命名为mynginx:latest
docker tag nginx:latest mynginx:l.21 # 将nginx:latest镜像重命名为mynginx:1.21
docker tag bbbbd59a03f3 my/cen:v3
docker tag my/centos:v2.0.1 192.168.122.20:5000/my/centos:v2.0.1
# 删除旧tar镜像tag语法(镜像内容仍然保留,只是旧标签被移除)
docker rmi <镜像名称:旧标签>
docker rmi nginx:1.21 # 当一个镜像有多个标签时,删除nginx镜像的tag标签1.21
#释放磁盘空间,当你docker rmi image_id后,其实并没有释放磁盘空间
docker system prune -a
# 导入和导出镜像
# 导出镜像(将centos:7.5.1804的本地镜像,保存成一个tar包,可用于分享)
docker save -o centos.tar.gz centos:7.5.1804
# 导入镜像
docker load < centos.tar.gz # 方式一
docker load --input centos.tar.gz # 方式二
cat centos7.5-tar.gz | docker import - my/centos:7.5 # 方式三,导入时指定了仓库名、image名称、tag(Tips:名字必须是tar.gz结尾的文件)
# 删除镜像
#语法
docker rmi <镜像ID或镜像名称:标签>
docker rmi image_id
docker rmi my/centos:V2.0.1
docker rmi -f image_id # 强制删除
docker rmi -f $(docker ps -a -q) # 删除所有的docker镜像,-q会列出所有的容器ID
# 同时删除多个镜像
docker rmi <镜像ID1> <镜像ID2>
docker rmi nginx:latest ubuntu:20.04
docker rmi $(docker images -q) # 删除所有镜像(docker images -q 会列出所有镜像的 ID)
# 删除未使用的镜像(dangling 悬空镜像:是指没有标签的镜像,通常是在构建新镜像或更新镜像时产生的中间层)
docker image prune
docker image prune -f # 不逐个确认,全部强制删除未使用的镜像
docker image prune -a # 删除所有未使用的镜像
docker image prune -af # 不逐个确认,删除所有未使用的镜像
# 上传镜像(要先打个TAG才能上传)
# 完整仓库地址示例
docker tag [ImageId] registry.cn-shenzhen.aliyuncs.com/2018/smokeping:[镜像版本号]
docker push registry.cn-shenzhen.aliyuncs.com/2018/smokeping:[镜像版本号]
# 基于Dockerfile 构建镜像
# 基于现有容器构建镜像
#查看帮助
docker help run 等
#查询当前运行中的有那些docker程序
docker ps #查看运行中的容器
docker ps -a #查看所有容器
docker version #检查是否安装成功
docker stop c5644b1f4a64|NAME #停止容器
#查看docker hub里面有哪些mysql的容器
docker search mysql
#运行镜像,创建容器并启动一个交互终端
#-t 表示分配一个伪终端
#-i 让容器的标准输入打开
#/bin/bash指要运行什么命令)
#-p 222:80 指定宿主机用222端口来映射docker容器的80端口,这样不管是宿主机重启还是容器重启,222端口始终映射到80端口,除非镜像删除,才会释放
#-P 80 宿主机会使用一个还未使用的端口,与docker容器的EXPOSE 80端口进行匹配,当容器重启,宿主机的端口会变动)
#--name 为容器起一个名字,方便以后查找
docker run -it opensuse /bin/bash
docker run --rm -it opensuse /bin/bash # --rm 停止容器后,自动删除
docker run --rm -it --name debian12 my-arm32-debian12:latest /bin/bash
docker run -d -p 222:80 --name jichu my/centos:v2.0.1
#已经在后台执行的docker容器,可以用下面的命令进入
docker exec -ti jichu /bin/bash
# 将本地文件|目录,复制到docker 中
docker cp ./jre1.8.0_361/ 958ff0bdf211:/root/
docker cp ./jre-9.0.4/ 958ff0bdf211:/root/
# 从容器中复制文件到本地
docker cp <container_name_or_id>:<container_file_path> <local_file_path>
#查看容器修改了哪些文件
docker diff smokeping
#使用Dockerfile快速构建一个环境
docker build -t registry_url/namespace/image_name:V2.0.1 /root/Dockerfile
docker容器启动有两种方式
1:基于镜像新建容器并启动
docker run centos cal #启动并打印日历
2:基于某个镜像创建一个镜像(创建完是不会启动的),然后手动启动
docker create --name mysql_new -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 mysql
docker start mysql_new
3:让容器在守护状态下运行(-d 参数,表示daemon)
如何查看docker image 有那些标签
# 对于公共仓库
dnf -y install skopeo
#skopeo list-tags docker://docker.io/<repository>/<image> # 通常 <repository> 为 library 表示官方镜像仓库,image 表示镜像名字
skopeo list-tags docker://docker.io/library/python
# 对于自建的私有仓库(只要你知道镜像名称和地址,也可以用上面的方式)
curl -X GET "https://<your-registry>/v2/<image-name>/tags/list"
# 比如阿里云 ACR 需要验证,如下会报错
curl -X GET "https://registry.cn-hangzhou.aliyuncs.com/v2/images/my-debian12/tags/list"
# 另一种方法,去下面这个网址 (在第二栏输入框,输入你要查询docker镜像 ,比如你的镜像地址是 coturn/coturn:edge-alpine 你就输入 coturn/coturn )
https://explore.ggcr.dev/
如何创建属于自己镜像
方法一:使用现有镜像进行更改,更该后再进行commit
docker run -t -i centos /bin/bash
#进入容器后,安装wget,然后退出
#c5644b1f4a64 指定根据那个镜像进行创建,my/centos:v2.0.1 (分别是用户,镜像名,TAG)
docker commit -m 'my new centos' -a 'sada@www.com' c5644b1f4a64 my/centos:V2.0.1
#查看刚才创建的容器,然后启动
docker images
docker run -ti my/centos:V2.0.1 /bin/bash
方法二:使用Dockefile进行创建镜像
先创建一个Dockerfile文件(该文件包含如何创建镜像的指令,该文件一行表示一层,最多只能127层)
touch Dockerfile
vi Dockerfile
#注释,安装时要指定 -qqy 不然可能报错,(测试过只加 -y也可以)
FROM centos
MAINTAINER REGAN 88@wsfnk.com
RUN yum -qqy install python
#注意后面有个点,.表示在当前目录寻找Dockerfile文件
docker build -t='my/centos:V2.0.1' .
如果文章对你有帮助,欢迎点击上方按钮打赏作者
暂无评论