docker基础

下载地址

桌面版:https://www.docker.com/products/docker-desktop
服务器版:https://docs.docker.com/engine/install/#server

windwos需要开启虚拟化和WSL2
控制面板->程序->启用或关闭 windows 功能,开启 Windows 虚拟化和 Linux 子系统(WSL2)

搜索公共镜像

https://hub.docker.com/

加速源

设置方法:设置面板>>Docker Engine:"registry-mirrors": ["https://registry.docker-cn.com"]
docker exec -it fd02a9ec66cf /bin/bash

ubuntu设置方法:
/etc/docker/daemon.json:

{
  "registry-mirrors": [
    "https://mirror.ccs.tencentyun.com",
    "https://registry.docker-cn.com",
    "https://docker.mirrors.ustc.edu.cn"
  ]
}

设置完成后重启docker:sudo systemctl restart docker
验证:sudo docker info

命令

sudo docker version 查看docker版本
sudo docker search 搜索
sudo docker pull 下载
sudo docker images 查看镜像列表
sudo docker rmi <id> 删除

针对某个容器的命令
sudo docker run 运行:docker run -d --name mynginx -p 80:80 nginx 后台运行,指定名字端口映射和镜像

sudo docker ps 查看
sudo docker stop 停止
sudo docker start 启动
sudo docker restart fd02a9ec66cf 重启
sudo docker stats 状态
sudo docker logs 日志
sudo docker exec -it 5dec59f378cc /bin/bash 进入
sudo docker rm -f d440bd0665bf 删除(-f是强制删除)

sudo docker run --name mynginx -p 8080:80 -d nginx 运行nginx官方镜像,并使用mynginx名字,和8080端口

Dockerfile文件

该文件要放在项目目录下

FROM python:3.9.22-slim AS builder

WORKDIR /app

# 安装构建依赖(编译C扩展等)
RUN apt-get update && \
    apt-get install -y --no-install-recommends gcc python3-dev git && \
    rm -rf /var/lib/apt/lists/*

# 复制依赖文件并安装(利用Docker缓存层)
COPY requirements.txt .
RUN pip install --user --no-cache-dir -r requirements.txt

# ---

# 第二阶段:运行阶段(使用最小化镜像)
FROM python:3.9.22-slim 

WORKDIR /app

# 从builder阶段复制已安装的Python包
COPY --from=builder /root/.local /root/.local
COPY . .

# 将用户目录的Python包加入PATH
ENV PATH=/root/.local/bin:$PATH \
    GAMES_DIR=./gamedata \
    LOG_LEVEL=INFO \
    MODEL_DIR=./nlh_pretrain.pt \
    DATABASE_URL=postgresql+psycopg://postgres:Dfes323-we423d@192.168.1.11:5432/preset_games
    
# 暴露FastAPI默认端口
EXPOSE 8000

# 健康检查(可选)
# HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 \
#     CMD curl -f http://localhost:8000/health || exit 1

# 启动命令(根据实际需求调整)
CMD ["uvicorn", "holdem.preset_games:app", "--host", "0.0.0.0", "--port", "8000","--workers","4","--loop","uvloop","--http","httptools"]

进入项目目录中,使用docker build -t <容器名> . 最后的点表示以当前目录打包进docker

docker-compose

docker compose up -d 启动并运行容器,也可以作为重启
docker compose down # 停止并移除现有的容器

开发环境构建时排除文件

项目根目录创建.dockerignore:

.venv/
__pycache__/
*.py[cod]
*.whl
pip-cache/
pip-cache/*
.idea/
.vscode/
.cursor/
.git/
.env
*.log

服务器安装

卸载所有冲突包
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done

设置docker存储库

# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

安装最新版
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

挂载目录

sudo docker run -d -p 3000:8080 -v /home/docker/openwebui:/mnt --name openwebui 43fb3baa376b

透明代理

export all_proxy=http://touming.5210010.xyz
让配置生效
source ~/.bashrc
curl -v https://www.google.com 验证访问

该命令只对当前shell生效,关闭后不起作用

取消代理
unset all_proxy

容器存放位置

桌面版 > Settings > Resources > Advanced找到Disk image location(更改时可能需要已经有文件)

ubuntu服务器安装

sudo apt update
sudo apt install docker.io
docker --version  //验证安装
docker info  //验证安装

启动:sudo systemctl start docker
设置自动启动:sudo systemctl enable docker

容器管理

列出在运行的容器:sudo docker ps
列出所有容器:sudo docker ps -a
停止容器:sudo docker stop <容器ID或容器名称>
删除容器:sudo docker rm <容器ID或容器名称>
sudo docker stop my-rabbitmq
sudo docker rm my-rabbitmq

卸载docker

停止 sudo systemctl stop docker
卸载包 sudo apt-get purge docker-ce docker-ce-cli containerd.io

删除相关数据
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
sudo docker volume ls 列出所有卷
sudo docker volume rm <卷名>删除数据卷
删除配置(如果有)
sudo rm /etc/docker/daemon.json

删除 Docker 组(如果有)
sudo groupdel docker

拉取镜像
docker pull redis:7.4.5-alpine
docker pull mongo:8.0.11
docker pull postgres:17-alpine
docker pull python:3.11.12-slim
docker pull neo4j:5.26
docker pull nginx:1.29-alpine-slim 轻量版建议仅本地测试,实际上线用完整版
拉取后给镜像指定名称
docker tag mongo:8.0.11 my/mongo:8.0.11
postgre数据库需要设置三个环境变量
POSTGRES_USER 用户
POSTGRES_PASSWORD 密码
POSTGRES_DB 启动时创建的数据库

备份

docker save -o all_images.tar $(docker images --format "{{.Repository}}:{{.Tag}}" | Where-Object { $_ -notmatch "<none>:<none>" }) windows备份所有镜像

备份
docker save -o <保存的文件名.tar> <镜像名称:标签>
docker save -o python.tar python:3.11-slim
docker load -i all_images.tar linux中恢复镜像

快速停止并删除所有容器

linux

sudo docker stop $(sudo docker ps -aq)   # 使用 sudo 获取所有容器ID,然后停止所有容器
sudo docker rm $(sudo docker ps -aq)     # 删除所有容器
sudo docker volume prune #删除所有卷(数据卷)
sudo docker rmi -f $(sudo docker images -q)   # 强制删除所有镜像
sudo docker volume rm $(sudo docker volume ls -q) #删除所有数据卷

进入容器内部执行命令

docker exec <name> 这里是命令 在外部执行容器命令,返回也是在外部
docker exec -it <name> bash 进入容器内部命令
docker exec -it 5df4a9102f9d sh 以shell方式运行,可以是名字或ID
exit退出命令

windows宿主访问docker内部

host.docker.internal

输出错误日志

docker compose logs -f 输出所有容器错误日志

数据持久化+运行

docker volume create redis-data  # 创建 redis 数据卷,用于持久化 /data

docker run -d \
  --name redis \
  --network backend \
  -p 6379:6379 \
  -v redis-data:/data \
  --restart unless-stopped \
  redis:7.4.5-alpine \
  redis-server --appendonly yes

docker volume create pg-data # 创建 postgres 数据卷

docker run -d \
  --name postgres \
  --network backend \
  -e POSTGRES_DB=crowdpulse \
  -e POSTGRES_USER=postgres \
  -e POSTGRES_PASSWORD=123456 \
  -e TZ=Asia/Singapore \
  -p 5432:5432 \
  -v pg-data:/var/lib/postgresql/data \
  --shm-size=1g \
  --restart unless-stopped \
  postgres:17-alpine \
  -c max_connections=600

本地测试时,wsl子系统和windows挂载路径的优先级,在windows终端中运行优先使用windows路径,wsl子系统中执行命令,优先使用子系统路径