Docker 简单使用

✨ Docker 是一个容器化的解决方案,可以帮助我们创建和管理统一的运行环境。它使用镜像来构建容器,并且可以轻松地运行、停止和删除容器。我们可以使用 Docker-compose 来定义和管理多个容器应用的部署。安装 Docker 后,我们可以使用一些常用的命令来操作镜像和容器,如查看镜像列表、删除镜像、启动容器、停止容器等。我们还可以修改 Docker 的配置文件以满足特定需求。除了 Docker,还有一些其他工具和应用可以帮助我们更方便地管理容器化应用,如 Lazydocker、Portainer、Watchtower、Composerize 等。

在开发过程中,我们经常会听到“在我这是好的”、“系统环境问题”等等一些说法。配置一致的运行环境也确实很麻烦,但我们可以用容器化方案来解决这样的问题。

因为系统交付需要在客户处私有化离线部署,之前我已经将原有的虚拟机部署方式转换为了基于 docker-compose 的部署方案。但发现同组的一些小伙伴对 Docker 还是不熟悉,于是在此整理一下,也梳理下给他们分享用法时的思路,这次就不涉及到原理相关,仅仅为了使用。

两个概念:

  • image (镜像):包含完整的软件运行时环境的一个二进制“模板”文件。其中有代码、运行时、系统工具、库文件及配置文件等。
  • container(容器):将 image 运行起来的一个进程,即把“模板实例化”。

可以将 image “类比”为虚拟机系统镜像,container 则为虚拟机。但区别在于虚拟机是一个完整的操作系统,独立内核,占用资源也较多,而 Docker 是基于 namespace 的进程隔离,共享内核,占用资源少,启动也更快。

安装

参考官网 Install Docker Engine

# Arch Linux (自用, 亦可通过 yay / paru 来安装)
sudo pacman -S dokcer docker-buildx docker-compose

# 验证
sudo dokcer version

配置

  • 非 root 用户执行,docker 命令执行需要 sudo
# 将当前用户加入 docker 用户组
sudo usermod -aG docker <普通用户用户名>

# 注销重新登陆,更改方能生效。也可以运行以下命令立即激活
newgrp docker

# 验证普通用户无需 sudo 运行 docker
docker run hello-world
  • 开机自启动
# 启动 Docker 服务
sudo systemctl start docker.service
# 配置开机自启
sudo systemctl enable docker.service

# 上面两条也可直接合并为一条命令
sudo systemctl enable --now docker.service
  • 配置文件修改

位置:/etc/docker/daemon.json 常见修改如下

{
	"experimental": true,
	"ip": "127.0.0.1",
	"bip": "169.254.123.1/24",
	"ipv6": true,
	"ip6tables": true,
	"fixed-cidr-v6": "fd00:db8:1::/64",
	"max-concurrent-downloads": 10,
	"exec-opts": [
		"native.cgroupdriver=systemd"
	],
	"live-restore": true,
	"log-driver": "json-file",
	"log-opts": {
		"max-file": "3",
		"max-size": "5m"
	}
}
{
    "exec-opts": [
        "native.cgroupdriver=systemd" // 设置Docker守护进程使用Systemd管理Cgroups
     ],
    "log-driver": "json-file", // 日志驱动类型为Json-file,即将日志输出到文件中
    "log-opts": { // 日志驱动选项
        "max-size": "30m", // 日志文件最大大小为30MB
        "max-file": "5" // 最大保留的日志文件数量为5个
     },
    "oom-score-adjust": -1000, // OOM(Out of Memory)得分调整,保证容器出现内存不足问题时被尽可能先杀死
    "storage-driver": "overlay2", // 存储驱动类型为OverlayFS v2,可读写镜像层并增量存储差异
    "storage-opts": [ // 存储驱动选项
        "overlay2.override_kernel_check=true" // 忽略内核版本检查(OverlayFS v2需要内核版本为4.0及以上)
     ],
    "live-restore": true, // 允许Docker守护进程在重启服务时恢复未关闭的容器
    "bip": "169.254.123.1/24", // 为Docker0虚拟网卡设置IP地址
    "max-concurrent-downloads": 10, // 最大下载镜像并发数为10
    "max-concurrent-uploads": 10, // 最大上传镜像并发数为10
    "registry-mirrors": [ // 镜像仓库镜像
        "https://docker.mirrors.sjtug.sjtu.edu.cn" // 国内的Docker镜像仓库地址
     ]
}

常用操作

# 列出所有镜像
docker images

# 删除镜像
docker rmi <镜像名称/镜像ID>

# 查看运行中的容器(所有)
docker ps (-a)

# 运行容器
docker run <镜像名称/镜像ID>

# 停止容器
docker stop <容器名称/容器ID>

# 删除容器
docker rm <容器名称/容器ID>

# 查看容器输出(日志)
docker logs <容器名称/容器ID>

# 进入容器交互式命令行
docker exec -it <容器名称/容器ID> /bin/sh

# 基于当前路径 Dockerfile 构建镜像
docker build -t <镜像名称> .

# 推送镜像
docker push <镜像名称>

Docker-Compose

以开源项目 umami 为例,其部署的 docker-compose.yml 文件如下

version: '3'
services:
  umami:
    image: ghcr.io/umami-software/umami:postgresql-latest
    ports:
      - "8080:3000"
    environment:
      DATABASE_URL: postgresql://umami:umami@db:5432/umami
      DATABASE_TYPE: postgresql
      HASH_SALT: thesaltissalt
    depends_on:
      - db
    restart: always
  db:
    image: postgres:12-alpine
    environment:
      POSTGRES_DB: umami
      POSTGRES_USER: umami
      POSTGRES_PASSWORD: umami
    volumes:
      - ./sql/schema.postgresql.sql:/docker-entrypoint-initdb.d/schema.postgresql.sql:ro
      - umami-db-data:/var/lib/postgresql/data
    restart: always
volumes:
  umami-db-data:

在此文件夹下执行:

# 启动 -d 为后台
docker-compose up -d

# 查看日志 -f 为跟踪最新日志输出
dokcer-compose logs -f

# 停止 (删除创建的volume)
docker-compose down (--volumes)

建议

不要使用 Alpine 基础镜像,使用 Ubuntu

https://twitter.com/liumengxinfly/status/1641808918715453440

应用 / 工具

  • Lazydocker ——— 终端命令行界面管理容器,省去手动键入各种命令
  • Portainer ——— Web 页面可视化操作容器应用
  • Watchtower  ——— 更新运行中的容器化应用
  • Composerize ——— 将 docker run 命令转换为 docker-compose.yml 配置文件
  • CTop ——— 类 top 命令效果,展示容器监控
  • Topic ——— top in container 获取容器状态