Docker 简单使用

status
Published
type
Post
slug
docker-and-docker-compose
date
Dec 1, 2020
tags
Docker
Config
Note
Linux
summary
Docker 是一个容器化的解决方案,可以帮助我们创建和管理统一的运行环境。它使用镜像来构建容器,并且可以轻松地运行、停止和删除容器。我们可以使用 Docker-compose 来定义和管理多个容器应用的部署。安装 Docker 后,我们可以使用一些常用的命令来操作镜像和容器,如查看镜像列表、删除镜像、启动容器、停止容器等。我们还可以修改 Docker 的配置文件以满足特定需求。除了 Docker,还有一些其他工具和应用可以帮助我们更方便地管理容器化应用,如 Lazydocker、Portainer、Watchtower、Composerize 等。
在开发过程中,我们经常会听到“在我这是好的”、“系统环境问题”等等一些说法。配置一致的运行环境也确实很麻烦,但我们可以用容器化方案来解决这样的问题。
因为系统交付需要在客户处私有化离线部署,之前我已经将原有的虚拟机部署方式转换为了基于 docker-compose 的部署方案。但发现同组的一些小伙伴对 Docker 还是不熟悉,于是在此整理一下,也梳理下给他们分享用法时的思路,这次就不涉及到原理相关,仅仅为了使用。
 
两个概念:
  • image (镜像):包含完整的软件运行时环境的一个二进制“模板”文件。其中有代码、运行时、系统工具、库文件及配置文件等。
  • container(容器):将 image 运行起来的一个进程,即把“模板实例化”。
可以将 image “类比”为虚拟机系统镜像,container 则为虚拟机。但区别在于虚拟机是一个完整的操作系统,独立内核,占用资源也较多,而 Docker 是基于 namespace 的进程隔离,共享内核,占用资源少,启动也更快。
notion image

安装

# 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
 

应用 / 工具

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