Docker

Docker学习记录

Docker简介

Docker是一个用于构建、运行、传送(build,run,share)应用程序的平台。可以将应用程序和他运行时所需要的各种依赖包,第三方软件,配置文件等打包到一起。以便在任何环境中都可以正确的运行。image-20241111155916010

Docker和虚拟机的区别?

虚拟机是通过虚拟化(Hypervisor)的技术实现的。可以将一台物理服务器虚拟成多台逻辑服务器,每个逻辑服务器都有自己的操作系统,CPU,内存,硬盘和网络接口等等。他们之间是完全隔离的,可以独立运行。虚拟机在一定程度上实现了资源的整合,可以将一台服务器的计算能力,存储能力和网络资源分配给多个逻辑服务器,实现多台服务器的功能。缺点是每台服务器需要占用大量的资源,比如CPU、内存、硬盘、网络等等。启动速度特别慢。且大部分情况一台服务器只需要运行一个主要对外服务的应用程序就可以了。并不需要一个完整的操作系统所提供的所有功能。这样的话会占用大量的资源,启动速度也受到影响。

容器和Docker是两个不同的概念,Docker非常的流行,所以有的人会把他们视为一谈。Docker只是容器的一种实现,是一个容器化的解决方案和平台。而容器是一种虚拟化技术,和虚拟机类似也是一个独立的环境,可以在这个环境中运行应用程序,和虚拟机不同的是,他不需要再容器中运行一个完整的操作系统,而是使用宿主机的操作系统,所以启动速度非常快,同时因为所需要的资源更少,所以可以在一台物理服务器上运行更多的容器,这样就可以更充分的利用服务器的资源,减少资源的闲置和浪费,

基本原理和概念

  • Docker镜像(Image):镜像是一个只读的模板,可以用来创建容器;
  • Docker容器(Container):容器是镜像的运行实例,它是一个独立的环境,可以在这个环境中运行应用程序,一个镜像可以创建多个容器;
  • Docker仓库(Repository):Docker仓库是用来存储Docker镜像的地方,比如DockerHub,我们可以在这里下载各种镜像,也可以将自己的镜像上传到这里。

安装

在官网上下载安装包,一路next安装。安装成功后会重启。
需要开启虚拟化功能。 Windows 系统需要开启 Hyper-v 功能,否则 Docker 会无法正常工作。
遇到问题,我的 win 11 家庭版没有虚拟化功能。解决方案参考文章:开启虚拟化解决方法
解决后重启电脑就可以了。

error during connect: Get "http://%2F%2F.%2Fpipe%2FdockerDesktopLinuxEngine/v1.47/version": open //./pipe/dockerDesktopLinuxEngine: The system cannot find the file specified.

发生这个报错的原因是未打开 Docker 桌面版。

Docker 的体系结构

  • Docker Engine:Docker引擎,是一个C/S架构的应用程序,它包含了一系列的命令行工具,比如docker、dockerd、docker-compose、docker-machine、docker-swarm等。
  • Docker Client:Docker客户端,是一个命令行工具,用来发送命令给Docker引擎,比如docker run、docker pull、docker build等。
  • Docker Daemon:Docker守护进程,是一个后台进程,用来接收并处理来自Docker客户端的请求,然后将结果返回给Docker客户端。
  • Docker Compose:Docker组合,是一个命令行工具,用来定义和运行由多个容器组成的应用程序。
  • Docker swarm:是管饭提供的一个容器编排和集群管理工具,用来管理多个Docker主机,通过Swarm可以将多个Docker主机抽象为一个Docker主机,实现负载均衡和容器高可用等功能。

image-20241111165818630

创建镜像,启动容器

Dockerfile是一个文本文件,用于自动化构建镜像,Dockerfile中包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
Dockerfile中的指令不区分大小写,但是为了可读性,建议使用大写。
Dockerfile中的指令按照从上到下的顺序执行。

Dockerfile指令

  • FROM:指定基础镜像,必须为Dockerfile文件的第一条指令;

    FROM [base_image]
    
  • MAINTAINER:指定镜像的作者和联系方式;

  • ADD:用于将文件拷贝到镜像中,源可以是URL或者本地文件,也可以是一个压缩文件(自动解压);

  • COPY:用于将文件拷贝到镜像中,源只能是本地文件;

    COPY src /app/src
    
  • WORKDIR:用于指定工作目录,可以使用多个WORKDIR指令,如果使用相对路径,则是相对于上一条WORKDIR指令所指定的目录;

    WORKDIR /app
    
  • ENV:用于设置环境变量;

  • RUN:用于执行命令行命令,比如安装软件包;

    RUN apt-get install -y nginx
    
  • EXPOSE:暴露端口,指定容器运行时监听的端口,但是这个端口只能在容器内部访问,外部无法访问;

    EXPOSE 80
    
  • CMD:用于指定默认的容器主进程,每个Dockerfile中只能有一条CMD指令,如果有多条,则只有最后一条会生效;

    CMD ["node", "/app/index.js"]
    
  • ENTRYPOINT:用于指定默认的容器主进程,每个Dockerfile中只能有一条ENTRYPOINT指令,如果有多条,则只有最后一条会生效;

  • VOLUME:用于指定持久化目录,Docker容器中的数据不会保存在镜像中,当容器删除时,数据也会随之删除;

  • USER:用于指定运行容器时的用户名或UID,后续的RUN、CMD、ENTRYPOINT指令都会使用该用户;

  • HEALTHCHECK:用于指定检查容器健康状况的命令,如果检查结果不是0,则认为容器不健康,从而终止容器运行;

  • ONBUILD:用于指定当构建一个被继承的Dockerfile时需要运行的命令,父镜像在被子继承后,父镜像中的ONBUILD指令会被执行;

  • LABEL:用于为镜像添加元数据,可以使用多个LABEL指令。

  • STOPSIGNAL:用于指定停止容器时发送的系统调用信号;

  • SHELL:用于指定默认的SHELL类型,可以使用多个SHELL指令。

  • ARG:用于指定构建参数,构建参数可以在构建时使用–build-arg =来指定。

  • EXPORT:用于导出镜像,这个指令已经被废弃,不建议使用。

Dockerfile编写完成后,就可以使用docker build命令来构建镜像了。

docker build -t [image]:[tag] [PATH]
# eg:
docker build -t geekhour/hello-docker:latest .
# or 从当前目录的Dockerfile构建镜像
docker build .

Docker Compose

Docker Compose是由Docker官方开源的项目,用于定义和运行多个Docker容器应用程序的工具。(Defining and running multi-container Docker applications)比如我们如果想要搭建一个网站的话,可能会用到前端、后端、数据库、甚至缓存和负载均衡等多个服务,这些服务都是独立的,但是它们之间又是有关联的,需要相互配合工作,比如后端需要连接数据库,前端需要连接后端,这些服务之间的关联关系就是Compose要解决的问题。它通过一个单独的docker-compose.yml配置文件来将这一组相互管理的容器组合在一起。

Docker Compose YAML文件

Docker Compose使用一个命名为docker-compose.yml的YAML文件来配置应用程序的服务,YAML文件中包含了应用程序的配置信息,比如服务、网络、卷等。
启动一个应用程序时,只需要运行docker-compose up命令,Docker Compose就会自动去查找当前目录下的docker-compose.yml文件,并根据这个文件来启动应用程序的所有服务。
当你不再需要这个应用程序时,只需要运行docker-compose down命令,Docker Compose就会停止并删除所有容器、网络、卷等。

常用命令

镜像相关

检索镜像

docker search [image]
# eg: 检索nginx镜像
docker search nginx

拉取镜像

docker pull [image]

上传镜像

docker push [image]
# eg:
docker push geekhour/hello-docker:latest

列出镜像

docker images
# or
docker image ls

从Dockerfile构建镜像

docker build -t [image]:[tag] [PATH]
# eg:
docker build -t geekhour/hello-docker:latest .
# or 从当前目录的Dockerfile构建镜像
docker build .

导出镜像

docker save [image] -o FILE
# or
docker save [image] > FILE
# eg:
docker save geekhour/hello-docker:latest > hello-docker.tar

从文件导入镜像

docker load -i FILE
# eg:
docker load -i hello-docker.tar

查看镜像历史

docker history [image]

删除镜像

docker rmi [image]
# or
docker image rm [image]

删除不再使用的镜像(dangling images)

docker image prune
# 删除所有不再使用的镜像
docker image prune -a

将文件系统导入为镜像

docker import [URL/FILE]

从容器创建镜像

docker commit [container] [image]

容器管理

创建容器(仅创建,不运行)

docker create [image]

创建并运行容器

docker run [image]

启动容器

docker start [container]

停止容器

docker stop [container]

重启容器

docker restart [container]

列出正在运行的容器

docker ps
# or
docker container ls

列出所有容器

docker ps -a
# or
docker container ls -a

进入容器

# 以交互模式进入容器
docker exec -it [container] bash
# or
docker attach [container]

导出容器

docker export [container] -o FILE
# or
docker export [container] > FILE

导入容器快照

docker import FILE

查看容器日志

docker logs [container]

删除容器

docker rm [container]
# or
docker container rm [container]

查看容器端口映射

docker port [container]

显示容器内进程

docker top [container]

复制本地文件到容器内的指定路径

docker cp [FILE] [container]:[PATH]

显示容器内的变化

docker diff [container]

显示容器资源使用情况

docker stats [container]

容器运行

docker run命令的各种参数

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
# OPTIONS:
# -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
# -d: 后台运行容器,并返回容器ID;
# -i: 以交互模式运行容器,通常与 -t 同时使用;
# -p: 端口映射,格式为:主机(宿主)端口:容器端口
# -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
# --name="nginx-lb": 为容器指定一个名称;
# -e: 为容器设置环境变量;eg:docker run -e [key=value] [image]
# -w: 指定容器的工作目录;eg:docker run -w [PATH] [image]
# --rm: 容器退出后自动删除容器文件;
# --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;

以下是一些常用的docker run命令示例:

创建,运行,并命名一个容器

docker run --name [name] [image]

创建一个容器并后台运行

docker run -d [image]

创建一个容器并指定端口映射

docker run -p [hostPort]:[containerPort] [image]

创建一个容器并指定端口映射(随机分配)

docker run -P [image]

创建一个容器并指定环境变量

docker run -e [key=value] [image]

创建一个容器并指定工作目录

docker run -w [PATH] [image]

创建一个容器并指定容器名称

docker run --name [name] [image]

创建一个容器并在容器中执行命令

docker run [image] [COMMAND]

创建一个容器并在容器中执行命令(交互模式)

docker run -it [image] [COMMAND]

创建一个容器并在容器中执行命令(交互模式,终端)

docker run -it [image] [COMMAND] /bin/bash

创建一个容器并在容器中执行命令(交互模式,终端,退出后删除容器)

docker run -it --rm [image] [COMMAND] /bin/bash

创建一个容器并指定容器名称,后台运行,端口映射,环境变量,工作目录

docker run -d -p [hostPort]:[containerPort] -e [key=value] -w [PATH] --name [name] [image]

网络管理

Docker默认会创建三个网络,分别是bridge、host、none。
网络模式:

  • bridge:桥接网络,Docker默认使用的网络模式,使用docker run命令创建容器时如果不指定网络模式,那么就会使用bridge模式。
  • host:主机网络,使用宿主机的网络,容器将不会获得一个独立的网络命名空间,配置和宿主机共享,容器将不会隔离宿主机网络,使用宿主机的IP和端口。
  • none:无网络、禁用网络,容器拥有自己的网络命名空间,但是并不为容器进行任何网络配置,这个网络模式的容器只适合于只进行数据处理,没有任何网络的应用场景。
  • container:容器网络,使用其他容器的网络,指定使用其他容器的网络栈。
  • overlay:跨主机网络,用于跨多个Docker守护进程的容器通信,Docker 1.9版本中增加的功能。
  • macvlan:通过MAC地址绑定来实现容器访问外部网络,Docker 1.12版本中增加的功能。
  • ipvlan:通过IP地址绑定来实现容器访问外部网络,Docker 1.12版本中增加的功能。

列出可用网络

docker network ls

查看网络详细信息

docker network inspect [network]

创建一个新的网络

docker network create [network]

删除一个网络

docker network rm [network]

将容器连接到网络

docker network connect [network] [container]

将容器从网络断开

docker network disconnect [network] [container]

数据管理

数据卷

数据卷(Data Volumes)是一个可供一个或多个容器使用的特殊目录,它绕过了UFS,可以提供很多有用的特性:

  • 数据卷可以在容器之间共享和重用
  • 对数据卷的修改会立马生效
  • 对数据卷的更新,不会影响镜像
  • 数据卷默认会一直存在,即使容器被删除
  • 数据卷会一直存在,直到没有容器使用

Docker Volume本质上是容器与主机之间共享的目录或者文件,这样Docker Volume中的数据可以在主机和容器中实时同步。

创建一个数据卷

docker volume create [volume]
# eg:
docker volume create my-vol

查看数据卷

docker volume ls

查看数据卷详细信息

docker volume inspect [volume]

删除数据卷

docker volume rm [volume]

删除所有未使用的数据卷

docker volume prune

日常操作

查看Docker系统信息

docker info

查看Docker版本

docker version

查看Docker帮助

docker --help

查看Docker命令帮助

docker [COMMAND] --help

登录Docker Hub

docker login

登出Docker Hub

docker logout

移除所有未被使用的容器、镜像、数据卷和网络

docker system prune
posted @ 2024-11-11 18:41  彬彬zhidao  阅读(27)  评论(0编辑  收藏  举报