docker学习文档

docker学习文档

  • docker
    • Docker和虚拟机技术的区别
    • 容器的优势
    • Docker 的工作原理
    • Docker 的架构组成
    • docker命令
      • 基本命令
      • 镜像相关
      • 容器相关
      • docker-compose
        • docker-compose和docker compose的区别
      • 其他
  • dockerfile
    • 用途
    • 基本结构
      • 基础镜像(FROM)
      • 维护者信息(MAINTAINER或者LABEL)
      • 工作目录(WORKDIR)
      • 复制文件(COPY或ADD)
      • 运行命令(RUN)
      • 设置环境变量(ENV)
      • 暴露端口(EXPOSE)
      • 容器启动时默认执行的命令(CMD或ENTRYPOINT)
        • CMD指令
        • ENTRYPOINT指令
  • 技巧与实战
  • docker学习参考

docker

docker 是一个开源的应用容器引擎,允许开发者打包他们的应用以及其依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

Docker和虚拟机技术的区别

  • 虚拟机(VM)通过虚拟化硬件运行完整的操作系统,而容器共享宿主机的操作系统内核,仅包含应用程序及其依赖,因此启动更快、资源占用更少。
  • 传统的虚拟机,可以虚拟出一条硬件,运行一个完整的操作系统,在这个操作系统上安装和运行所需的软件
  • 容器内的应用可以直接运行在宿主机的内核中,容器没有自己的内核,也不用虚拟硬件 (轻便);每个容器是相互隔离的,每个容器内都有属于自己的文件系统,之间互不影响。

容器的优势

  • 轻量级:容器仅包含必要的应用程序和依赖,不包含完整的操作系统。
  • 快速启动:容器启动只需几秒,而虚拟机可能需要几分钟。
  • 隔离性:容器之间相互隔离,互不影响。

Docker 的工作原理

  • Docker 使用 Linux 内核的特性(如 Namespaces 和 Cgroups)来实现容器的隔离和资源限制。

Docker 的架构组成

  • 客户端(Client):用户与 Docker 交互的工具,如 docker 命令行工具。
  • 守护进程(Daemon):在后台运行的进程,负责管理镜像、容器、网络和存储卷等。
  • 镜像(Image):只读模板,包含运行容器所需的文件系统和应用程序。
  • 容器(Container):镜像的运行实例,可以启动、停止、删除等。
  • 仓库(Repository):存储镜像的地方,如 Docker Hub 或私有仓库。

docker命令

基本命令

# 获取帮助
docker stats --help

# 启动/运行/重启等
# docker开机自启
sudo systemctl enable docker 
docker start [容器名/ID]
docker stop [容器名/ID]
docker run [容器名/ID]
docker restart [容器名/ID]
docker kill [容器名/ID] # 直接关闭容器
docker rename <当前容器名称或ID> <新容器名称>  # 重命名

镜像相关

# 导入镜像
docker load < nacos_nacos-server.tar
# 查看导入的镜像版本
docker images | grep nacos
# 获取容器或镜像的详细信息
docker inspect c97ce68a099e | grep -i environment
# 删除镜像
docker rmi -f 镜像名/镜像ID
# 删除多个 其镜像ID或镜像用用空格隔开即可  
docker rmi -f 镜像名/镜像ID 镜像名/镜像ID 镜像名/镜像ID
# 列出所有镜像
docker images
docker image pull [镜像名] #拉取镜像
docker pull -a java #从 Docker Hub下载 REPOSITORY 为 java 的所有镜像
docker push [OPTIONS] NAME[:TAG]
# 搜索镜像
docker search [镜像名] 
docker search httpd
# 设置镜像标签
docker tag 860c279d2fec runoob/centos:dev
# 删除全部镜像  -a 意思为显示全部, -q 意思为只显示ID  
docker rmi -f $(docker images -aq  

容器相关

# 列出所有运行中的容器
docker ps 
# 列出所有的容器
docker ps –a 
# 查看特定状态(如运行)的容器
docker ps --filter "status=running" 
# 查看由特定用户运行的容器
docker ps --filter "user=myuser" 
# 使用格式化输出
docker ps --format "ID\tName\tImage\tCommand" 
# 查看最近创建的几个容器
docker ps -n 5 
# 列出所有容器的id
docker ps pq 
# 查看容器端口的映射情况
docker port bf08b7f2cd89
# wizardly_chandrasekhar为容器名称
docker port wizardly_chandrasekhar 
# docker inspect
docker inspect containerID # 获取容器的元数据
#查看容器内部运行的进程
docker top wizardly_chandrasekhar # wizardly_chandrasekhar为容器名
# 导出容器
docker export 1e560fca3906 > ubuntu.tar
# 导入容器快照
cat docker/ubuntu.tar | docker import - test/ubuntu:v1
docker import http://example.com/exampleimage.tgz example/imagerepo

# 进入容器
docker exec # 在运行的容器中执行命令
docker exec -it # 进入容器的交互式终端
docker exec -it mysql /bin/bash
docker exec -it 846c308e1737 psql -U postgres

# 在容器和主机之间复制文件或目录
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH   docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
docker cp xxl_job.sql :/data

# 查看容器的日志输出
docker logs [OPTIONS] CONTAINER
docker logs -f --tail=200 <容器名>
# docker logs --tail:只显示最后几行的日志。
# docker logs --follow:实时跟踪容器的日志输出。
# docker logs --since:只显示特定时间之后的日志。
# docker logs --until:只显示特定时间之前的日志。

# 清理不再使用的镜像、容器和其他资源
docker system prune [OPTIONS]

docker-compose

docker-compose up # 构建并启动Docker-compose定义的所有服务。
docker-compose down # 停止并删除Docker-compose定义的所有服务。
docker-compose build # 构建Docker-compose定义的所有服务的镜像。
docker-compose logs # 查看Docker-compose定义的所有服务的日志。
docker-compose和docker compose的区别

Docker Compose 是 Docker 的一个子项目,可以帮助用户定义和运行多容器 Docker 应用程序。使用 Docker Compose 可以更轻松地管理多个容器的应用程序,例如在本地或云平台上构建和部署微服务应用程序。

  1. 独立安装的Compose,不论是V1还是V2版本,指令都是docker-compose(中间是短横线)
  2. 插件安装的Compose,在V2版本,指令是docker compose(中间是空格),最新版的docker安装时会自动以插件的形式安装docker compose
  3. 支持同时采用两种方式安装Compose,安装后可以同时使用docker-compose和docker compose

其他

# 查看docker信息
docker version
# 显示docker系统的信息
docker info
#查看docker日志
journalctl -u docker.service or less /var/log/messages | grep Docker

##  查看容器的资源使用率  
docker stats CONTAINER_ID
# 查看磁盘使用大小  
docker system df
# 查看每个 image、container 详细大小  
docker system df -v
# 查看dir路径  
docker info|grep -i dir

docker network ls  # 列出所有的Docker网络。
docker network create  # 创建一个新的Docker网络。
docker network connect # 将容器连接到指定的Docker网络。
docker network disconnect # 将容器从指定的Docker网络断开连接。

docker volume ls # 列出所有的Docker卷。
docker volume create # 创建一个新的Docker卷。
docker volume inspect # 获取Docker卷的详细信息。
docker volume rm # 删除指定的Docker卷。

# Docker swarm是Docker的原生集群管理和编排工具,用于在多个Docker主机上运行和管理应用程序.
docker swarm init # 初始化一个新的Docker swarm集群
docker swarm join # 将节点加入到Docker swarm集群
docker node ls # 列出Docker swarm集群中的所有节点
docker service # 管理在Docker swarm集群中运行的服务

# docker登录和认证
docker login # 登录到Docker仓库
docker logout # 退出登录

# 使用 Dockerfile 构建镜像
docker build -t my-image .

dockerfile

用途

  1. 用来自定义镜像
  2. Dockerfile 是一个用于定义和构建 Docker 镜像的文本文件
  3. Dockerfile 中包含一系列指令和参数,用于描述镜像的构建过程,包括基础镜像的选择、软件包的安装、文件的复制、环境变量的设置等

基本结构

基础镜像(FROM)

  • 每个 Dockerfile 的第一条指令必须是 FROM,用于指定构建新镜像所基于的基础镜像。
FROM ubuntu:22.04

维护者信息(MAINTAINER或者LABEL)

  • 指定镜像的维护者信息。 MAINTAINER 指令已被弃用,推荐使用 LABEL 指令。例如:
LABEL maintainer="[email protected]"

工作目录(WORKDIR)

  1. 进入容器内部时默认的目录就是工作目录
  2. 设置容器内的工作目录,后续的 COPY、RUN 等指令都会在这个目录下执行。
WORKDIR /app
  1. 可以在 Dockerfile 中多次使用 WORKDIR 指令。每次使用都会更改当前的工作目录
  2. 如果指定的目录不存在,WORKDIR 会自动创建该目录

复制文件(COPY或ADD)

  1. 如果想复制多个文件到镜像中,可以使用多个 COPY 指令
COPY ./ /app/
COPY  

# 从远程 URL 下载文件并复制到镜像中
ADD https://example.com/file.zip /app/

# 自动解压缩压缩文件
ADD file.tar.gz /app/

# 复制并自动解压缩
ADD source.tar.gz /app/
  1. 推荐优先使用COPY而不是ADD,除非需要从URL下载文件或者自动解压tar文件

运行命令(RUN)

  • 在镜像构建过程中执行命令,用于安装软件包或配置环境
RUN apt-get update && apt-get install -y python3

设置环境变量(ENV)

  • 定义环境变量,可以在后续的指令中使用
ENV NAME World

暴露端口(EXPOSE)

  • 如果想放行多个端口,可以使用多个EXPOSE指令
EXPOSE 80

容器启动时默认执行的命令(CMD或ENTRYPOINT)

CMD指令
  1. 在Dockerfile中,如果定义了多条CMD指令,只有最后一条会被使用。这是因为Docker在构建镜像时会忽略之前的CMD定义,仅保留最后一条
  2. CMD指令的主要作用是为容器启动提供默认命令,但如果用户通过docker run命令指定了其他命令,这些默认命令会被覆盖。因此,保留最后一条CMD可以确保容器启动时有明确的默认行为
CMD ["executable", "param1", "param2"]  # 推荐的 exec 形式
CMD command param1 param2               # shell 形式
CMD ["param1", "param2"]               # 作为 ENTRYPOINT 的默认参数

# 使用 exec 形式
CMD ["python", "app.py"]

# 使用 shell 形式
CMD python app.py

# 作为 ENTRYPOINT 的默认参数
ENTRYPOINT ["python"]
CMD ["app.py"]
  1. CMD 可以被 docker run 命令行中指定的命令完全替代
ENTRYPOINT指令
  1. 在Dockerfile中,如果定义了多条ENTRYPOINT指令,只有最后一条ENTRYPOINT指令会生效
ENTRYPOINT ["executable", "param1", "param2"]  # exec 形式
ENTRYPOINT command param1 param2               # shell 形式

# 使用 exec 形式
ENTRYPOINT ["python", "app.py"]

# 使用 shell 形式
ENTRYPOINT python app.py

# 结合 CMD 使用
ENTRYPOINT ["python"]
CMD ["app.py"]
  1. 功能:提供容器启动时执行的命令和参数,且这些参数不能被 docker run 命令行中指定的参数覆盖
  2. ENTRYPOINT 指定的命令和参数是固定的,容器启动时总是会执行这些命令
  3. 如果在 docker run 命令中提供了参数,这些参数会作为参数传递给 ENTRYPOINT 指定的命令,而不是替代它
  4. 可以与 CMD 结合使用,CMD 提供默认的参数,ENTRYPOINT 提供固定的命令

技巧与实战

  • 在 Dockerfile 中设置环境变量 DEBIAN_FRONTEND=noninteractive 的目的是为了防止在安装软件包时出现交互式提示。

docker学习参考

  • docker命令参考: Docker 命令大全
  • docker教程:
    Docker 学习大纲:从入门到高级实战,涵盖基础操作、进阶技巧与项目实践
    从零开始学Docker(超详细讲解+案例分析)
    【专栏】docker学习

你可能感兴趣的:(docker,学习)