惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

大猫的无限游戏
大猫的无限游戏
云风的 BLOG
云风的 BLOG
小众软件
小众软件
V
V2EX
博客园 - Franky
博客园 - 司徒正美
Apple Machine Learning Research
Apple Machine Learning Research
量子位
博客园 - 【当耐特】
雷峰网
雷峰网
WordPress大学
WordPress大学
Jina AI
Jina AI
Google DeepMind News
Google DeepMind News
N
Netflix TechBlog - Medium
爱范儿
爱范儿
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
阮一峰的网络日志
阮一峰的网络日志
IT之家
IT之家
Blog — PlanetScale
Blog — PlanetScale
Hugging Face - Blog
Hugging Face - Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
V
Visual Studio Blog
Microsoft Security Blog
Microsoft Security Blog

Hi, I Am I

[I Am I 年度简报] — 不知终日梦为鱼 初探 ESP32-CAM QQ 聊天记录 MHT 文件转 HTML [I Am I 年度简报] - 草木本无意,荣枯自有时。 Hexo 中实现 Live Photos 支持 写在当下 NKCTF 2024 1z_F0r3ns1c5 Writeup 春秋杯冬季赛 2023 Writeup [I Am I 年度简报] - 2023 某内网渗透内部赛 Writeup 强网拟态 2023 Writeup Github Actions 自动化部署 Hexo 浅析CobaltStrike流量解密 陇剑杯 2023 Writeup CTF线下赛AWDP总结 ISCC 2023 Writeup ISCC 2023 实战题 Writeup CISCN 2023 Writeup 福建闽盾杯网络空间安全大赛 2023 Writeup 天一永安杯宁波市网络安全大赛 2023 Writeup 贵阳大数据及网络安全精英对抗赛 2023 Writeup 红明谷杯 2023 Writeup Confetti 带来有仪式感的鼓励 记一次 JS 逆向密码加密 [I Am I 年度简报] – 2022 PHP 读取 Excel 文件内容并写入数据库 从0开始的 MoeCTF 开发之路 观安杯 2022 Writeup 利用微信服务号实现早安自动化 Cloudflare批量拉黑IP脚本
Docker 学习笔记
2021-01-26 · via Hi, I Am I

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低。

最近用 Docker 的次数越来越多了,在此记录一下常用的命令。

核心概念

在使用之前,需要理解几个基本概念。

镜像(Image)

镜像是一个只读模板,包含应用程序运行所需的环境、依赖和配置文件,可以理解为一个运行环境的 快照。容器就是基于镜像创建的运行实例。

镜像通常采用分层结构构建,便于复用和节省存储空间。

容器(Container)

容器是镜像的运行实例,是一个轻量级、隔离的运行环境。

它共享宿主机内核,启动速度快、资源占用少,并通过 NamespaceCgroups 实现进程级隔离。

仓库(Repository)

仓库是镜像存储与分发的位置,例如:Docker Hub

可以通过 docker pull 从仓库拉取镜像,也可以搭建私有仓库用于企业内部使用。

Docker 架构

Docker 采用 C/S 架构:

客户端(docker CLI)
→ Docker Daemon(后台服务)
→ 镜像仓库

用户通过 CLI 发送命令,由 Docker Daemon 负责镜像构建、容器运行和资源管理,如本地无镜像则会自动从远程仓库拉取。


安装 Docker

安装 Docker 主要有以下几种方法,适用于不同的操作系统和需求:

通用安装脚本

推荐用于 CentOS 7、Debian、Ubuntu

curl -sSL https://get.docker.com/ | sh

国内镜像加速

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

配置 Docker

设置开机自启

systemctl start docker
systemctl enable docker

更换镜像源

为了提高拉取镜像的速度,建议配置国内的镜像源:

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": [
    "https://mirror.ccs.tencentyun.com"
  ]
}
EOF

sudo systemctl daemon-reload
sudo systemctl restart docker
docker info

Docker 常用命令

以下是一些基本的 Docker 命令,用于管理容器和镜像:

镜像操作

docker -v                     # 查看版本
docker search nginx           # 搜索镜像
docker pull nginx             # 拉取镜像
docker images                 # 查看本地镜像
docker rmi 镜像ID              # 删除镜像
docker history nginx          # 查看镜像分层历史
docker save -o nginx.tar nginx   # 导出镜像
docker load -i nginx.tar         # 导入镜像

构建镜像(不使用缓存):

docker build --no-cache -t mynginx .

容器操作

docker run -d -p 8080:80 --name mynginx nginx

常用参数说明:

  • --name 指定容器名称
  • -d 后台运行
  • -p 端口映射(宿主机:容器)
  • -P 随机端口映射
  • -it 交互模式
  • --rm 容器停止后自动删除
  • -e 传递环境变量
  • --restart 设置重启策略

其他命令

docker ps               # 查看当前正在运行的容器
docker ps -a            # 查看所有容器(包括已停止的容器)
docker ps -q            # 只显示容器ID(静默模式)
docker ps -n 5          # 显示最近创建的5个容器

docker stop 容器名      # 停止正在运行的容器(优雅停止,发送 SIGTERM 信号)
docker start 容器名     # 启动一个已经停止的容器
docker restart 容器名   # 重启容器(先 stop 再 start)

docker rm 容器名        # 删除已停止的容器(运行中的容器需要先 stop)
docker rm -f 容器名     # 强制删除运行中的容器

docker exec -it 容器名 bash  
# 进入正在运行的容器内部
# -i  保持标准输入开启
# -t  分配一个伪终端
# bash  在容器中启动 bash 终端(如果没有 bash,可改为 sh)

docker attach 容器名     # 连接到容器主进程

docker logs 容器名       # 查看日志
docker logs -f 容器名    # 实时查看日志

docker stats             # 查看容器资源使用情况
docker top 容器名        # 查看容器内部进程
docker inspect 容器名    # 查看容器详细信息

数据持久化(Volume)

容器删除后数据会丢失,因此必须使用数据卷。

目录挂载

docker run -d \
-p 8080:80 \
-v /data/www:/usr/share/nginx/html \
nginx

查看数据卷

docker volume ls

删除数据卷

docker volume rm 卷名

Docker 网络管理

查看网络

docker network ls

默认网络模式:

  • bridge(默认):为容器分配独立网络空间,通过 NAT 与宿主机通信,适合大多数场景
  • host:容器与宿主机共享网络栈,不进行端口映射,性能高但隔离性降低
  • none:不配置网络,容器没有任何网络功能

创建自定义网络

docker network create mynet

指定网络运行

docker run -d --network=mynet nginx

网络连接与断开

docker network connect 网络名 容器名
docker network disconnect 网络名 容器名

自定义网络下容器可以通过容器名互相访问。


日志与调试

查看日志

docker logs 容器名

实时查看日志

docker logs -f 容器名

限制日志大小(生产环境建议)

docker run -d \
--log-opt max-size=10m \
--log-opt max-file=3 \
nginx

容器运行高级参数

环境变量

docker run -d \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql

自动重启

docker run -d \
--restart=always \
nginx

重启策略:

  • no:默认,不自动重启容器
  • always:始终重启容器(即使手动停止后也会尝试重启)
  • on-failure:容器异常退出时重启,可指定失败次数
  • unless-stopped:除非手动停止,否则自动重启

资源限制

docker run -d \
--memory="512m" \
--cpus="1.0" \
nginx

指定 CPU 核心:

--cpuset-cpus="0,1"

时间同步

-v /etc/localtime:/etc/localtime:ro

Dockerfile 基础

Dockerfile 用于自定义镜像。

FROM nginx:latest
COPY ./html /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

常见指令:

  • FROM:指定基础镜像,Dockerfile 必须以 FROM 开头
  • RUN:在构建镜像时执行命令(生成新的镜像层)
  • COPY:将本地文件复制到镜像中
  • ADD:类似 COPY,但支持自动解压和远程 URL
  • WORKDIR:设置工作目录,后续命令默认在该目录执行
  • EXPOSE:声明容器对外暴露的端口(仅说明用途,不会自动映射)
  • CMD:容器启动时默认执行的命令(可被覆盖)
  • ENTRYPOINT:容器启动时的固定入口命令(通常不被覆盖)

构建镜像:

docker build -t mynginx .

Docker Compose

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。

安装

curl -L "https://github.com/docker/compose/releases/download/v2.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose version

yml 文件编写

version: '3'
services:
  php:
    image: php:7.2-apache
    volumes:
      - ./www:/var/www/html
    ports:
      - "8080:80"

启动:

docker compose up -d

停止并删除:

docker compose down

查看状态:

docker compose ps

查看日志:

docker compose logs -f

Docker 清理与空间管理

查看磁盘占用

docker system df

清理无用资源

docker system prune

清理所有未使用镜像(慎用):

docker system prune -a

批量操作命令

docker stop $(docker ps -aq)
docker rm $(docker ps -aq)
docker rmi $(docker images -q)

按条件删除:

docker rmi `docker images | grep nginx | awk '{print $3}'`