Docker的介绍和使用

Docker 是一种开源的容器化平台,允许开发者将应用程序及其所有依赖项(库、配置文件、环境变量等)打包成一个标准化、轻量级的单元,称为"容器"。这个容器可以在任何支持 Docker 的环境中快速、可靠地运行。

  • 可以屏蔽底层操作系统的差异性,可以让应用程序不管在哪里都能使用容器的环境正常运行,从而保证了开发测试环保局与生产环境的一致性
  • 容器部署起来非常便捷和迅速,可以大大缩短应用部署的周期时间

核心概念

镜像

  • 创建容器的基础
  • 一个只读的模板文件,里面包含运行容器中的应用程序所需要的所有资料(比如应用程序执行文件、配置文件、动态库文件、依赖包、系统文件和目录等)
  • 如一个镜像可以包含 Ubuntu 操作系统、Nginx 服务器和你的网站代码

容器

  • 用镜像运行的实例
  • 可以被创建、启动、停止、删除,每个容器之间默认是相互隔离的
  • 实质是一个独立的进程,但拥有自己独立的运行环境

Dockerfile

  • 一个文本文件,里面包含了一系列指令(如 FROM, RUN, COPY, CMD 等),用于定义如何自动构建一个 Docker 镜像。
  • 实现了应用构建的自动化和可重复性

仓库

  • 用来集中保存镜像的地方
  • 有公有仓库和私钥仓库之分

容器与虚拟机

隔离环境一般使用虚拟机或Docker,其区别如下:

- Docker 虚拟机
启动速度 秒级 分钟级
计算能力损耗 几乎无 损耗 50%左右
性能 接近原生 弱于
系统支持量(单机) 上千个 几十个
隔离性 通过namespace实现资源隔离,通过cgroup实现限制资源的最大使用量 完全隔离,每个虚拟机都有独立的硬件
内核 所有容器共享宿主机的内核 每个虚拟机都有独立的操作系统和内核

两种技术的层级如下图,可以看到docker有着比虚拟机更少的抽象层,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源,因此其启动效率更高。

Docker 的使用

Docker 的安装在此处不再赘述。以运行一个最经典的 Nginx 服务器容器为例,Docker的使用主要包括以下步骤:

  • 准备镜像:从公有仓库中下载,或个人准备
  • 创建并运行容器:基于镜像文件来创建一个容器实例。可以创建并运行一步到位,也可以先创建、再创建分开执行

准备镜像

镜像的准备有两种方法:在公有仓库中下载、个人自己准备镜像

从公有仓库中下载镜像

  • 搜索镜像:
    • docker search <镜像名称>,如docker search nginx。
    • 其中OFFICIAL表示是官方镜像
  • 拉取(下载)镜像:将镜像从远程仓库(默认是 Docker Hub)下载到本地仓库
    • docker pull <镜像名>[:标签],如docker pull nginx:latest
    • <镜像名>:通常是 [仓库名/]镜像名 的格式。如果不指定仓库名,则默认为官方库的library/下的镜像
    • :标签\]:代表指定镜像的版本。若不写,则默认为latest最新版

    • docker images 或 docker images ls
    • 可以看到镜像的名称、标签、ID、创建时间和大小

自己准备镜像

自己准备好镜像,为压缩包格式

创建并运行容器

1.可以直接创建并运行

  • docker run -d -p 8080:80 --name my-nginx-container nginx
    • -d:后台运行,容器启动后,终端控制权还给你,而不是被容器的日志输出占用
    • -p 8080:80: 端口映射。将容器内部的 80 端口映射到宿主机的 8080 端口
      • -p <宿主机端口>:<容器内部端口>
    • --name my-nginx-container:为容器指定一个自定义名称。如果不指定,Docker 会随机生成一个名字。指定名称便于后续管理
    • nginx:指定用来创建容器的镜像名

2.先创建、再运行

  • 容器创建:即将镜像加载到容器
    • 新创建的容器默认处于停止状态,不运行任何程序,需要在其中发起一个进程来启动容器
    • docker create [选项] 镜像
      • 常用选项
        • -i:让容器开启标准输入接受用户输入命令
        • -t:让 Docker 分配一个伪终端 tty
      • 一般合起来使用,即-it,来实现和容器交互的作用,运行一个交互式会话 shell
  • 容器运行
    • 格式:docker start 容器的ID/名称
      • 容器的ID需要在查看容器的结果中获取

容器的运行

容器是一个与其中运行的 shell 命令/进程共存亡的终端,命令/进程运行容器运行, 命令/进程结束容器退出。

docker 容器默认会把容器内部第一个进程,也就是 pid=1 的程序作为docker容器是否正在运行的依据,如果docker容器中 pid = 1 的进程挂了,那么docker容器便会直接退出,也就是说Docker容器中必须有一个前台进程,否则认为容器已经挂掉

当利用 docker run 来创建容器时, Docker 在后台的标准运行过程是

  • 检查本地是否存在指定的镜像。当镜像不存在时,会从公有仓库下载;
  • 利用镜像创建并启动一个容器;
  • 分配一个文件系统给容器,在只读的镜像层外面挂载一层可读写层;
  • 从宿主主机配置的网桥接口中桥接一个虚拟机接口到容器中;
  • 分配一个地址池中的 IP 地址给容器;
  • 执行用户指定的应用程序,执行完毕后容器被终止运行。

查看容器

  • 容器在后台运行后,可以查看以确认它的状态
    • docker ps:只查看正在运行的容器
    • docker ps -a:查看所有容器(包括已停止的)
  • 可以看到容器的 ID、状态、端口映射信息和名称

进入容器

使用 docker exec 命令进入运行着的容器

停止/退出容器

停止容器的方法有二:

  • 外部的命令行:docker stop 容器的ID/名称
  • 对于不同的容器主进程,方法不一样
    • 若容器的主进程是 Shell,可以使用exit命令来退出shell命令,从而停止容器运行
    • 若容器的主进程是后台服务(如 Nginx, Redis),则exit只退出了shell进程,没有退出容器的主进程,容器不会停止运行,其状态保持为up(运行中)

若处于第一种情况,即主进程为shell,但只想退出当前的 Shell 会话而不想停止整个容器,可以使用快捷键 Ctrl + P + Q(先按 Ctrl+P,松开后再按 Q)来实现仅退出而不停止容器。

  • 这个快捷键序列会使你从容器的终端分离,但保持容器的主进程(也就是当前的 Shell)在后台继续运行
  • 如果你想再次进入这个仍在运行的容器,可以再次使用docker exec

删除容器

bash 复制代码
格式:docker rm [-f] 容器ID/名称
#删除容器
 
docker rm 2592d3fad0fb
#删除已经终止状态的容器
 
docker rm -f 2592d3fad0fb
#强制删除正在运行的容器

参考

相关推荐
zrande3 小时前
基于HTTP构建局域网内YUM网络源:详细操作指南(太细)
运维·构建yum网络源
cetcht88883 小时前
从 “有人值守” 到 “少人运维”:智能巡检机器人重塑配电室管理模式
大数据·运维·人工智能·机器人
Mr.45673 小时前
Linux&Windows环境下Nacos3.1.0详细安装配置指南:从零到生产就绪
linux·运维·服务器
峰顶听歌的鲸鱼4 小时前
30.Linux DHCP 服务器
linux·运维·服务器·笔记·学习方法
退役小学生呀4 小时前
二十一、DevOps:从零建设基于K8s的DevOps平台(二)
运维·docker·云原生·容器·kubernetes·devops
微风中的麦穗4 小时前
【MD编辑器Typora】Typora最新 V1.12.1版:轻量级 Markdown 编辑器详细图文下载安装使用指南 【办公学习神器之MD文本编辑器】
运维·typora·开发工具·md编辑器·markdown 编辑器·markdown文件·办公学习工具
violet-lz4 小时前
Linux文件系统调用:文件调用函数与exec系统函数详解与应用
linux·运维·服务器
袁泽斌的学习记录5 小时前
ubuntu22.04安装cuda11.4版本
linux·运维·服务器
荣光波比5 小时前
Docker(一)—— Docker入门到精通:从基础概念到容器管理
运维·docker·容器·云计算