Docker notes 01
Dockerfile
从基础镜像开始,执行安装依赖、拷贝代码、配置环境、启动应用等操作,每一步指令都会生成一个镜像层,最终所有层叠加成完整镜像。能够进行缓存复用,如果后续构建指令和文件未发生变化则可以直接复用实现增量更新。 所以尽量将不常变化的指令写在前面(基础依赖等),拷贝项目代码等放在后面。
FROM 用于指定基础镜像
FROM <镜像名>:<标签>
# 构建空镜像FROM scratch优先选择alpine 版本的基础镜像(体积小、轻量化、安全性高),避免用 latest 标签(版本不固定,易导致构建不一致)。
# 指定容器内工作目录,后续指令的相对路径都基于此目录# WORKDIR /appWORKDIR <容器内目录路径># COPY <源路径> <目标路径># 第一个. 表示当前目录下的所有文件# 第二个. 表示WORKDIR目录COPY . .分层复制
先单独构建依赖,后续主要代码变更不 需要再次安装依赖。
WORKDIR /app
# 先只复制依赖清单COPY requirements.txt .
# 安装依赖 (缓存)RUN pip install -r requirements.txt
# 最后再复制剩下的源代码COPY . .
# 启动命令CMD ["uvicorn", ...].dockerignore
用法与 .gitignore 的使用相同,可以忽略 .env node_modules 文件。
Main
- Image构建命令
docker build .
# docker build -t <镜像名:标签名>docker build -t app .docker build -t app:v1 .docker build -t app:latest .
# 推送到Docker Hub:用户名/镜像名:标签docker build -t username/my-app:v1.0 .
# 推送到私有仓库:仓库地址/镜像名:标签docker build -t 192.168.1.100:5000/my-app:v1.0 .
# 不适用缓存构建docker build --no-cache -t app:v1.0 .# 查看本地所有镜像docker images
# 过滤指定镜像docker images app- Container
# 默认占用终端前台运行docker run <镜像名/镜像ID>
docker start
docker stop
# -d 后台运行 # --name 指定容器名称docker run -d --name <容器自定义名称> <镜像名:标签>
# -p 宿主机端口号:容器内端口docker run -d --name my-nginx -p 8080:80 nginx:latest# 启动已停止的容器(通过名称/ID)docker start my-nginx
# 停止运行中的容器docker stop my-nginx
# 重启容器docker restart my-nginx
# 删除停止的容器(-f 强制删除运行中的容器)docker rm my-nginxdocker rm -f my-nginx # 强制删除
# 批量删除所有停止的容器docker container prune--restart always # 总是重启(容器退出/宿主机重启后都自动启动)--restart on-failure # 容器异常退出(退出码非0)时重启--restart unless-stopped # 除非手动docker stop,否则一直重启(推荐生产环境)查询启动后状态
# 查看运行中的容器docker ps
# 查看所有容器(运行+停止)docker ps -a
# 查看容器日志(-f 实时跟踪日志,适合排障)docker logs my-nginxdocker logs -f api-server
# 查看容器详细信息(IP、挂载、网络等)docker inspect my-nginx- Volume 挂载数据卷
Windows/Mac 宿主机路径需用绝对路径,Windows 用/c/Users/xxx/(而非C:\Users\xxx\),Mac 用/Users/xxx/
# 宿主机绝对路径-v /宿主机绝对路径/目录:容器内路径
-v 自定义卷名:容器内路径
# MySQL持久化docker run -d --name my-mysql -p 3306:3306 \ -v /usr/local/mysql/data:/var/lib/mysql \ # 持久化数据 -v /usr/local/mysql/conf:/etc/mysql/conf.d \ # 挂载配置 -e MYSQL_ROOT_PASSWORD=123456 \ # 设置root密码(MySQL镜像要求必传) mysql:8.0
# Nginx:宿主机/html目录映射容器/usr/share/nginx/html(修改宿主机html即可更新页面)docker run -d --name my-nginx -p 8080:80 -v /usr/local/nginx/html:/usr/share/nginx/html nginx- Repository
类似Github,我们可以自己上传image到Docker Hub,这样我们可以Pull别人的镜像,别人也可以拉取我们的镜像文件了。
# 把本地的 count 镜像,复制一份,贴上 xiaoming/count:v1.0 的标签docker tag count joneleee/count:v1.0
# 推送docker push joneleee/count:v1.0
# 拉取docker pull xiaoming/count:v1.0映射
- 端口映射
-p 8080:8000 将本机的8080端口连接到Docker的8000端口
- 挂载卷
-v ${PWD}/data:/app/data 把本机的 data 文件夹 映射到 容器内部的 /app/data。