Docker学习笔记

docker和虚拟机技术的不同

虚拟机技术:虚拟出自身硬件,运行完整的操作系统,资源占用高,冗余步骤多,启动慢

docker:直接使用宿主机的内核,没有自己的内核,仅有自己的文件系统,省去了系统引导,相当于内核级别的虚拟化,更轻量级,资源利用率高

docker基本组成:

**镜像:**模板,可创建多个容器服务

**容器:**独立运行一个或者一组应用,通过镜像来创建,类似于简易的linux系统

**仓库:**存放镜像的地方,分为公有和私有仓库

docker的安装

  • 先修改配置文件 /etc/dnf/plugins/subscription-manager.conf 将main的enable设置为0,关闭该服务
  • 清理缓存和加载元数据 dnf clean all && dnf makecache
  • 通过dnf安装dnf-plugins-core 可以先list一下默认可能安装
  • 更新dnf软件仓库配置文件:**dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo**(该链接可百度替换为阿里云的)
  • 安装docker引擎(可以dnf list后再安装):dnf install containerd.io docker-ce docker-ce-cli docker-buildx-plugin docker-compose-plugin
  • systemctl启动docker,检查运行状态,docker version 检查版本确定启动成功

docker run流程

底层原理

docker是一个Client-Server结构的系统,docker的守护进程运行在主机上,客户端以socket方式访问。

docker命令

docker 命令 --help 万能命令

docker version 查看docker版本信息

docker info 查看docker系统信息,包括镜像和容器的数量

docker network命令可以查看网络信息

镜像命令

docker images 查看镜像命令,常用选项:

  • -a 列出所有镜像
  • -q 只显示镜像的id

docker search 镜像名搜索镜像

docker pull 镜像名 下载镜像

docker push 镜像名:tag 发布镜像

docker rmi -f 镜像id 删除镜像

docker rmi -f $(docker images -aq) 删除全部镜像

docker build从DockerFile构建镜像

docker history 查看镜像构建历史

docker tag 给镜像增加标签

docker save将本地镜像保存为 Tar 文件,保存的 Tar 文件包含镜像的所有层(layers)和元数据

docker load从 Tar 文件加载镜像,加载后镜像的标签(tags)和历史记录会完整恢复。
容器命令

docker run [参数] 镜像名 从镜像处创建并运行一个容器,解析器一般用**/bin/bash**,常用参数:

  • --name 名称 设置容器名称
  • -d 在后台方式运行
  • -it 使用交互方式运行,进入容器查看内容,后需加解析器/bin/bash
  • -p 主机端口:容器端口 指定容器端口运行
  • -v容器和主机间数据卷挂载,后面容器数据卷详细提及
  • --volumes-from 容器之间数据卷挂载,后面容器数据卷详细提及
  • --net指定容器网络模式,不指定默认是走bridge模式

**注意:**docker容器采用 -d 后台运行是需要前台进程的,此时不加 -it 来进入容器,docker会认为没有应用,可能会自动停止该容器

**docker ps [参数]**列出所有运行中的容器,常用参数:

  • -a 列出正在运行的和历史运行过的容器
  • -n=number 列出最近创建的容器,指定个数,按时间最近排序
  • -q 只显示容器编号

exit 容器停止并退出

Ctrl+P+Q 容器不停止退出,注意先P后Q

docker rm 容器id 删除指定容器,不能删除正在运行的容器,如需强制删除需要加参数-f

docker rm -f $(docker ps -aq) 删除所有容器

docker start 容器id 启动历史启动过的容器

docker restart 容器id 重启容器

docker stop 容器id 停止容器

docker kill 容器id 杀掉容器

docker export将容器文件系统导出为 Tar 文件,丢弃镜像历史和元数据

docker import从 Tar 文件创建新镜像,无历史记录或标签

进入正在运行的容器

方式1:docker exec -it 容器id /bin/bash

特点:进入容器后,开启新的命令行终端,可以进行其他操作,如果执行过Ctrl+P+Q操作后,exit不会关闭容器

方式2:docker attach 容器id

特点:进入容器后,进入正在运行的终端,不会启动新的终端,执行exit后会直接关闭容器

docker inspect 容器id 查看容器的元数据

docker logs [参数] 容器id 查看docker的日志信息,常用参数:

  • -f 实时跟踪显示日志
  • -t 显示日志时间戳
  • --tail number 限制条数显示日志最后的打印

docker top 容器id 查看对应容器内部的进程信息

docker stats 容器id 查看容器所占CPU状态

docker cp 容器id:路径 目的路径 将容器中的文件拷贝出来,例如:docker cp 9646bbfeb610:/home/test.java /home

docker volume [参数] 具名挂载或匿名挂载的挂载卷操作,常用参数:

  • ls 显示卷
  • inspect 卷名 显示卷的详细信息

容器数据卷

用于容器的持久化和同步操作,容器和系统之间数据共享,容器之间的数据也可以共享(即数据卷容器)

  • 容器之间的数据共享,父容器删除不会影响到其他容器的数据
  • 容器数据共享到主机本地,容器删除不会影响到本地的数据

实现办法1:

通过镜像启动容器时,使用 docker run 命令添加 -v参数关联目录操作,3种方式如下。

指定路径挂载:-v 本地目录:容器内目录

匿名挂载:-v 容器内目录 容器数据卷的默认路径挂载

具名挂载:-v 卷名:容器内目录 容器数据卷的默认路径挂载(常用于生产环境)

注意:

  • 具名挂载和匿名挂载默认主机路径 /var/lib/docker/volumes/
  • 匿名挂载和具名挂载会产生"卷",通过docker volume可查看卷名
  • 通过 -v 挂载容器数据卷时,路径后可添加ro(只读)或rw(可读写)改变挂载目录的读写权限,ro表示该路径仅可以通过宿主机操作,容器内部无权限操作,例如 docker run -d -v /home/ceshi:/etc/nginx:ro nginx

实现方法2:

DockerFile构建镜像时直接挂载。

数据卷容器

实现容器和容器之间的数据共享,注意是整体数据的共享(类似于整体备份,不是作用于某单个路径),被挂载的被称为父容器,父容器就是数据卷容器,父容器被删除后,共享的其他容器数据不受影响。

执行 docker run 命令时,添加参数 --volumes-from 容器名或id 实现容器之间的数据共享。

docker的分层管理逻辑

Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像顶部,这一层即为容器层,容器之下的被称之为镜像层。

提交镜像(构建镜像)

提交容器成为一个新的镜像。

方式1:commit

docker commit [参数] 容器id 目标镜像名:[TAG] 提交镜像操作,常用参数:

  • -m 加=添加描述信息
  • -a 加=添加作者

例如:docker commit -m="new_list" -a="xiaoming" 859e163e8103 nginx02:1.2

方式2:build (通过DockerFile构建镜像)

docker build -f Dockerfile文件 -t 名称:版本 构建上下文的路径

其中:构建上下文的路径如果是当前目录,可以用 . 表示,如果文件不在其中,Dockerfile 无法访问它们(会报错 file not found

当文件名称就叫做 Dokcerfile 时,可以不加参数 -f

DockerFile (命令参数脚本)

注意:指令必须是大写字母,指令是从上到下执行,#代表注释,每个指令都会封装一个镜像层并提交。

常见命令:

  • FROM:指定基础镜像
  • MAINTAINER:镜像是谁写的,姓名+邮箱
  • RUN:镜像构建时需要运行的命令
  • COPY:拷贝文件,不会自动解压,优先用
  • ADD:拷贝文件或从链接下载,会自动解压
  • WORKDIR:镜像额工作目录
  • VOLUME:数据卷挂载的目录位置
  • EXPOSE:指定暴露端口
  • ENV:构建时设置环境变量
  • CMD:指定容器启动时运行的命令,运行容器时追加命令会被替代
  • ENTRYPOINT:指定容器启动时运行的命令,运行容器时可以追加命令
  • ONBUILD:为子镜像添加触发指令(在子镜像构建时执行)

官方的DockerHub中绝大多数的镜像都是从基础镜像FROM scratch构建的。

Docker网络

docker安装后即会自动创建默认okcer0网桥,每启动一个docker容器,docker都会给其分配一个IP地址,使用的技术是veth-pair技术,同时ip a查看系统网卡信息时会多一对网卡。

**veth-pair技术:**虚拟以太网设备对(Virtual Ethernet Pair),由成对出现的虚拟网络接口组成,一端连接协议栈,另一端彼此互联。数据在veth-pair间双向传输时无需中继处理,类似"虚拟网线"实现透明传输。

实际容器之间网络交互的流程,不手动分配网桥时,都是走的docker0转发。

只是配置容器中的hosts,可实现通过容器名访问网络,但是是单向的,不常用。

例如:docker exec -it -name tomcat01 --link tomcat02 tomcat,执行后tomcat01仅可以通过容器名ping通tomcat02,但反向不可以。

自定义网络模式(推荐)

docker network create创建自定义网络

默认具备的网络模式:

bridge:桥接模式(默认),和docker0桥接

none:未配置网络

host:主机模式,和宿主机共享网络

container:容器网络联通(局限性大,不常用)

示例:

优点:应用自定义网络的容器支持通过容器名称直接访问网络,例如可直接ping通应用自定义网络的容器名。

docker network connect 自定义网络 容器将自定义网络和容器进行打通,连通后会将对应容器直接加到对应的网络中(通过docker network inspect可以看到),相当于一个容器两个地址。

相关推荐
岁岁种桃花儿3 小时前
kubenetes从入门到上天系列第十五篇:Kubernetes的持久化存储PC和PVC
云原生·容器·kubernetes
数据知道4 小时前
云原生MongoDB:容器化部署与Kubernetes集成详细步骤
mongodb·云原生·kubernetes
还在忙碌的吴小二14 小时前
k8s是啥?
云原生·容器·kubernetes
zhen2415 小时前
K8s Service
云原生·容器·kubernetes
sbjdhjd16 小时前
RHCE | Web 服务器与 Nginx 全栈详解
linux·nginx·http·云原生·oracle·架构·web
qhqh31018 小时前
K8S的PV、PVC和storageClass的相关概念及实验
云原生·容器·kubernetes
小峰编程1 天前
二进制安装Nginx——详细
linux·运维·服务器·nginx·云原生
廾匸6401 天前
Docker应用
spring cloud·docker·eureka
AC赳赳老秦1 天前
2026多智能体协同趋势:DeepSeek搭建多智能体工作流,实现复杂任务自动化
人工智能·python·microsoft·云原生·virtualenv·量子计算·deepseek