浅学docker

docker简介

Docker 是一个开源的应用容器引擎,基于GO语言开发实现并遵从 Apache2.0 协议开源。

Docker对进程进行封装隔离,属于操作系统层面的虚拟化技术,由于隔离的进程独立于宿主和其他的隔离的进程,因此也称其为容器。

Docker在容器的基础上,进行了进一步的封装,从文件系统,网络互联到进程隔离等等,极大的简化了容器的创建和维护,使得Docker技术比虚拟机技术更为轻便,快捷。

Mac安装docker

  1. 官网下载
    https://www.docker.com/products/docker-desktop/
    下载Docker Desktop Mac版
    直接安装.dmg
  2. 通过home brew 安装
1
brew install --cask docker

查看版本:

1
2
3
docker --version
Docker version 28.0.1, build 068a01e

尝试运行一个nginx服务器

1
$ docker run -d -p 80:80 --name webserver nginx

服务运行后,可以访问 http://localhost,如果看到 “Welcome to nginx!”,就说明 Docker Desktop for Mac 安装成功了。

如果不开代理的情况下,需要使用镜像加速器。国内很多平台提供镜像加速服务,有的不能使用了。

配置镜像加速器

在任务栏点击 Docker Desktop 应用图标 -> Settings…,在左侧导航菜单选择 Docker Engine,在右侧像下边一样编辑 json 文件。修改完成之后,点击 Apply & restart 按钮,Docker 就会重启并应用配置的镜像地址了。

1
2
3
4
5
{
"registry-mirrors": [
"https://hub.atomgit.com"
]
}

检查加速器是否生效
执行 $ docker info,如果从结果中看到了如下内容,说明配置成功。

1
2
Registry Mirrors:
https://hub.atomgit.com/

Docker包括三个基本概念

镜像(Image)

Docker 镜像 是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像 不包含 任何动态数据,其内容在构建之后也不会被改变。

容器(Container)

镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。也因为这种隔离的特性,很多人初学 Docker 时常常会混淆容器和虚拟机。

容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 数据卷(Volume)、或者 绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。
数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。

仓库(Repository)

镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。

一个 Docker Registry 中可以包含多个 仓库(Repository);每个仓库可以包含多个 标签(Tag);每个标签对应一个镜像。

通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。

Ubuntu 镜像 为例,ubuntu 是仓库的名字,其内包含有不同的版本标签,如,16.04, 18.04。我们可以通过 ubuntu:16.04,或者 ubuntu:18.04 来具体指定所需哪个版本的镜像。如果忽略了标签,比如 ubuntu,那将视为 ubuntu:latest。

仓库名经常以 两段式路径 形式出现,比如 jwilder/nginx-proxy,前者往往意味着 Docker Registry 多用户环境下的用户名,后者则往往是对应的软件名。但这并非绝对,取决于所使用的具体 Docker Registry 的软件或服务。

Docker 运行容器前需要本地存在对应的镜像,如果本地不存在该镜像,Docker 会从镜像仓库下载该镜像。

从 Docker 镜像仓库获取镜像的命令是 docker pull。其命令格式为:

1
$ docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]

有了镜像后,我们就能够以这个镜像为基础启动并运行一个容器。
docker run 就是运行容器的命令

Docker Compose

Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。

Compose 定位是 「定义和运行多个 Docker 容器的应用(Defining and running multi-container Docker applications)」,其前身是开源项目 Fig。

使用一个 Dockerfile 模板文件,可以让用户很方便的定义一个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。

Compose 恰好满足了这样的需求。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。

Compose 可以通过 Python 的包管理工具 pip 进行安装,也可以直接下载编译好的二进制文件使用,甚至能够直接在 Docker 容器中运行。

Docker Desktop for Mac/Windows 自带 docker-compose 二进制文件,安装 Docker 之后可以直接使用。

查看版本

1
2
$ docker-compose --version
Docker Compose version v2.33.1-desktop.1

运行 compose 项目

1
$ docker-compose up

对于 Compose 来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务或者容器。如果没有特别的说明,命令对象将是项目,这意味着项目中所有的服务都会受到命令影响。
Compose 的命令包括:

  • up:创建并启动项目中的服务
  • start:启动项目中的服务
  • stop:停止项目中的服务
  • restart:重启项目中的服务
  • pause:暂停项目中的服务
  • unpause:恢复项目中的服务
  • rm:删除停止的项目
  • build:构建项目中的服务
  • logs:查看项目中的服务日志
  • port:查看项目中服务的端口映射
  • ps:列出项目中所有容器
  • top:显示各个服务容器的运行状态
  • exec:在运行的容器中执行命令
  • config:验证 Compose 文件

命令选项:

  • -f, –file FILE 指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定。
  • -p, –project-name NAME 指定项目名称,默认将使用所在目录名称作为项目名。
  • –verbose 输出更多调试信息。


浅学docker
https://yueyc.top/2025/03/29/about-docker/
作者
yueyc
发布于
2025年3月29日
许可协议