# ==== 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 字段指定的镜像,具体如下:
-
针对
postgres服务(仅配置image,无build):
本地若没有crpi-xxx/postgres:16-alpine镜像,会直接从远程仓库拉取该镜像,然后启动容器。 -
针对
bytebot-desktop、bytebot-agent、bytebot-ui服务(同时配置build和image):- 若本地不存在
image字段指定的远程镜像(如crpi-xxx/bytebot-desktop:edge),则会先pull, 不过不行会通过build配置从对应的Dockerfile构建镜像,构建完成后将镜像命名为image字段的名称,再启动容器。 - 若本地已存在该镜像(比如之前手动拉取过),则直接使用现有镜像启动容器,不会构建。
- 若本地不存在
总结:第一次运行时,postgres 服务一定是拉取镜像;其他三个服务默认优先构建镜像(仅当本地完全没有对应镜像时),而非先拉取远程镜像。