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

安装
# 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 ———
topin container 获取容器状态