docker基础
下载地址
桌面版:https://www.docker.com/products/docker-desktop
服务器版:https://docs.docker.com/engine/install/#server
windwos需要开启虚拟化和WSL2
控制面板->程序->启用或关闭 windows 功能,开启 Windows 虚拟化和 Linux 子系统(WSL2)
搜索公共镜像
加速源
- Docker 中国官方镜像 https://registry.docker-cn.com
- DaoCloud 镜像站 http://f1361db2.m.daocloud.io
- Azure 中国镜像 https://dockerhub.azk8s.cn
- 科大镜像站 https://docker.mirrors.ustc.edu.cn
- 阿里云 https://ud6340vz.mirror.aliyuncs.com
- 七牛云 https://reg-mirror.qiniu.com
- 网易云 https://hub-mirror.c.163.com
- 腾讯云 https://mirror.ccs.tencentyun.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 ~/.bashrccurl -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/dockersudo rm -rf /var/lib/containerdsudo docker volume ls 列出所有卷sudo docker volume rm <卷名>删除数据卷
删除配置(如果有)sudo rm /etc/docker/daemon.json
删除 Docker 组(如果有)sudo groupdel docker
拉取镜像docker pull redis:7.4.5-alpinedocker pull mongo:8.0.11docker pull postgres:17-alpinedocker pull python:3.11.12-slimdocker pull neo4j:5.26docker 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-slimdocker 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方式运行,可以是名字或IDexit退出命令
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子系统中执行命令,优先使用子系统路径