[docker note]

# ==== Docker 傻瓜式笔记 ====
# 一句话总结:Docker 是用来"装程序的盒子",让程序在任何电脑上都能一模一样地运行
# 核心概念:
# 1. 镜像(Image):"盒子的模板",包含程序和运行环境(比如一个安装好Chrome的系统模板)
# 2. 容器(Container):"打开的盒子",是镜像运行起来的实例(比如用模板启动的一个Chrome窗口)
# 3. Dockerfile:"制作模板的配方",写着如何一步步制作镜像(比如"先装系统,再装Chrome")
# 4. docker-compose:"批量管理盒子的工具",当需要同时启动多个关联的盒子时使用(比如同时启动Chrome、浏览器插件、数据库)
$ docker login --username=十三山入秋 crpi-a2d41ehc80lzdlub.cn-hongkong.personal.cr.aliyuncs.com

# ==== 一、基础镜像操作 ====

# 1. 从仓库拉取镜像(下载模板)
# 格式:docker pull 镜像地址:版本
docker pull nginx:latest  # 拉取官方nginx镜像(latest是最新版本)
docker pull 你的阿里云仓库地址/镜像名:版本  # 拉取自己仓库的镜像

# 2. 查看本地已有的镜像(查看已下载的模板)
docker images  # 列出所有镜像
docker images | grep 镜像名  # 搜索特定镜像(比如 docker images | grep nginx)

# 3. 删除本地镜像(删除不需要的模板)
# 注意:必须先删除用这个镜像启动的容器才能删镜像
docker rmi 镜像名:版本  # 比如 docker rmi nginx:latest
docker rmi 镜像ID  # 也可以用镜像ID删除(镜像ID就是docker images里的一串字符)

# 4. 拉取镜像失败后的缓存清理(拉不动时用)
docker system prune -a  # 清理所有未使用的镜像、容器、缓存(会删除没用的东西,放心用)


# ==== 二、容器操作 ====

# 1. 用镜像启动容器(用模板打开盒子)
# 格式:docker run [参数] 镜像名:版本
docker run -d --name 我的nginx -p 8080:80 nginx:latest
# 解释:
# -d:后台运行(盒子在后台跑,不占用终端)
# --name 我的nginx:给容器起个名字(方便后续操作)
# -p 8080:80:端口映射(把容器的80端口映射到电脑的8080端口,这样访问电脑的8080就等于访问容器的80)

# 2. 查看正在运行的容器(查看打开的盒子)
docker ps  # 只看运行中的容器
docker ps -a  # 看所有容器(包括已停止的)

# 3. 停止容器(关闭盒子)
docker stop 容器名或ID  # 比如 docker stop 我的nginx

# 4. 启动已停止的容器(重新打开盒子)
docker start 容器名或ID  # 比如 docker start 我的nginx

# 5. 重启容器(重启盒子)
docker restart 容器名或ID

# 6. 进入容器内部(钻进盒子里操作)
docker exec -it 容器名或ID /bin/bash
# 解释:
# -it:交互式进入(可以输入命令)
# /bin/bash:进入后打开bash终端(类似Windows的cmd)
# 退出容器:输入 exit 回车

# 7. 查看容器日志(看盒子里的程序输出)
docker logs -f 容器名或ID  # -f 表示实时刷新日志

# 8. 删除容器(彻底删掉盒子,注意:数据会丢失)
# 必须先停止容器才能删除
docker rm 容器名或ID
docker rm -f 容器名或ID  # 强制删除(即使容器在运行中)


# ==== 三、docker-compose 批量操作 ====
# 适用场景:需要同时启动多个关联容器(比如你的bytebot需要启动4个服务)
# 前提:有 docker-compose.yml 配置文件(里面写好了所有容器的启动规则)

# 1. 启动所有服务(根据docker-compose.yml启动所有容器)
docker-compose up -d  # -d 表示后台运行
# 第一次运行会自动拉取镜像,之后会直接启动已有的容器
# docker-compose -f docker/docker-compose.yml up -d

# 2. 停止所有服务(保留容器和数据)
docker-compose down

# 3. 停止并删除所有容器+网络(但保留数据卷,比如数据库数据)
docker-compose down --volumes  # 谨慎使用,数据库数据可能会丢!

# 4. 查看所有服务状态
docker-compose ps

# 5. 查看某个服务的日志(比如查看bytebot-agent的日志)
docker-compose logs -f bytebot-agent

# 6. 仅拉取镜像不启动(提前下载好所有需要的镜像)
docker-compose pull

# 7. 强制重新构建镜像(如果修改了Dockerfile,需要重新制作镜像)
# 注意:如果用的是现成镜像(比如阿里云仓库的),不需要这个命令
docker-compose build

# 8. 启动时不构建镜像(直接用本地已有的镜像,加速启动)
docker-compose up -d --no-build


# ==== 四、常见问题解决 ====

# 1. 拉取镜像太慢或失败
# 解决:配置阿里云镜像加速(前面教过),然后清理缓存
docker system prune -a

# 2. 容器启动后马上退出
# 解决:查看日志找原因
docker logs 容器名或ID

# 3. 端口被占用(启动时提示 port is already allocated)
# 解决:换一个端口映射,比如把 -p 8080:80 改成 -p 8081:80

# 4. 忘记容器名或ID
# 解决:用 docker ps -a 查看所有容器信息

# 5. 进入容器后没有vim等命令
# 解决:在容器内安装(以debian/ubuntu为例)
apt-get update && apt-get install -y vim

第一次运行 docker-compose up -d 时,对于每个服务的行为取决于本地是否已存在 image 字段指定的镜像,具体如下:

  1. 针对 postgres 服务(仅配置 image,无 build):
    本地若没有 crpi-xxx/postgres:16-alpine 镜像,会直接从远程仓库拉取该镜像,然后启动容器。

  2. 针对 bytebot-desktopbytebot-agentbytebot-ui 服务(同时配置 buildimage):

    • 若本地不存在 image 字段指定的远程镜像(如 crpi-xxx/bytebot-desktop:edge),则会先pull, 不过不行会通过 build 配置从对应的 Dockerfile 构建镜像,构建完成后将镜像命名为 image 字段的名称,再启动容器。
    • 若本地已存在该镜像(比如之前手动拉取过),则直接使用现有镜像启动容器,不会构建。

总结:第一次运行时,postgres 服务一定是拉取镜像;其他三个服务默认优先构建镜像(仅当本地完全没有对应镜像时),而非先拉取远程镜像。

posted @ 2025-11-04 23:53  十三山入秋  阅读(2)  评论(1)    收藏  举报