Ez编程 Docker 学习笔记
一.docker 简介
dockerhub官网:https://hub.docker.com
compose文件编写规范:https://docs.docker.com/reference/compose-file/
dockerhub官网:https://hub.docker.com
一、容器生命周期管理
1.1 容器创建与启动
# 基础启动(前台运行,退出即停止)
docker run <镜像名>
# 后台运行并命名容器
docker run -d --name <容器名> <镜像名>
# 带端口映射
docker run -d -p <宿主机端口>:<容器端口> --name <容器名> <镜像名>
# 挂载数据卷
docker run -d -v <宿主机路径>:<容器路径> --name <容器名> <镜像名>
# 设置环境变量
docker run -d -e "ENV_VAR=value" --name <容器名> <镜像名>
# 限制资源(内存/CPU)
docker run -d --memory="1g" --cpus="1.5" --name <容器名> <镜像名>
# 指定网络
docker run -d --network=<网络名> --name <容器名> <镜像名>
1.2 容器状态管理
Bash# 启动已停止的容器
docker start <容器ID或名>
# 停止容器(默认10秒等待时间)
docker stop <容器ID或名>
# 强制立即停止容器
docker kill <容器ID或名>
# 重启容器
docker restart <容器ID或名>
# 暂停/恢复容器进程
docker pause <容器ID或名>
docker unpause <容器ID或名>
1.3 容器删除
Bash# 删除已停止的容器
docker rm <容器ID或名>
# 强制删除运行中的容器
docker rm -f <容器ID或名>
# 删除所有停止的容器
docker container prune
二、容器操作与调试
2.1 交互操作
Bash# 进入运行中的容器(推荐exec方式)
docker exec -it <容器名> /bin/bash
# 以root用户进入容器
docker exec -u root -it <容器名> /bin/sh
# 创建临时交互式容器(退出自动删除)
docker run -it --rm <镜像名> /bin/bash
2.2 信息查看
Bash# 查看运行中的容器
docker ps
# 查看所有容器(包括已停止的)
docker ps -a
# 查看容器详细信息
docker inspect <容器ID或名>
# 查看容器日志(实时跟踪)
docker logs -f --tail 100 <容器ID或名>
# 查看容器资源使用统计
docker stats <容器ID或名>
2.3 文件操作
Bash# 从容器复制文件到宿主机
docker cp <容器名>:<容器路径> <宿主机路径>
# 从宿主机复制文件到容器
docker cp <宿主机路径> <容器名>:<容器路径>
三、镜像管理
3.1 镜像操作
Bash# 拉取镜像(默认最新标签)
docker pull <镜像名>
# 推送镜像到仓库
docker push <用户名>/<镜像名>:<标签>
# 查看本地镜像列表
docker images 或 docker image ls
# 删除镜像(需先删除关联容器)
docker rmi <镜像ID或名>
# 删除未被使用的镜像
docker image prune -a
3.2 镜像构建
Bash# 构建镜像(指定Dockerfile路径)
docker build -t <镜像名>:<标签> -f /path/to/Dockerfile .
# 查看镜像构建历史
docker history <镜像名>
# 多阶段构建示例
docker build -t <最终镜像名> --target=production .
3.3 镜像导入/导出
Bash# 保存镜像为归档文件
docker save -o <文件名>.tar <镜像名>
# 从归档文件加载镜像
docker load -i <文件名>.tar
# 导出容器文件系统为tar包
docker export <容器ID> > <文件名>.tar
# 从tar包导入为镜像
docker import <文件名>.tar <镜像名>:<标签>
四、网络管理
4.1 网络操作
Bash# 查看所有网络
docker network ls
# 创建自定义网络
docker network create --driver bridge <网络名>
# 连接容器到网络
docker network connect <网络名> <容器名>
# 断开容器网络
docker network disconnect <网络名> <容器名>
# 查看网络详情
docker network inspect <网络名>
docker network rm 或
docker network prune
docker inspect <容器ID或名称> --format='{{json .NetworkSettings.Networks}}'
4.2 网络模式
Bash# 使用主机网络模式
docker run --network=host <镜像名>
# 使用none网络模式(无网络)
docker run --network=none <镜像名>
五、数据卷管理
5.1 数据卷操作
Bash# 创建命名数据卷
docker volume create <卷名>
# 查看数据卷列表
docker volume ls
# 删除数据卷
docker volume rm <卷名>
# 先停止所有容器
docker stop $(docker ps -aq)
# 删除所有容器
docker rm $(docker ps -aq)
# 最后删除所有数据卷
docker volume rm $(docker volume ls -q)
# 删除未被使用的数据卷
docker volume prune
5.2 挂载方式
Bash# 挂载命名卷
docker run -v <卷名>:<容器路径> <镜像名>
# 绑定挂载(宿主机目录)
docker run -v /host/path:/container/path <镜像名>
# 只读挂载
docker run -v /host/path:/container/path:ro <镜像名>
六、系统维护
6.1 系统信息
Bash# 查看Docker系统信息
docker info
# 查看Docker版本
docker version
# 查看运行时状态
docker system df
6.2 资源清理
Bash# 清理所有未使用对象(镜像/容器/网络等)
docker system prune -a
# 删除所有停止的容器
docker container prune
# 删除所有悬挂镜像
docker image prune
七、Docker Compose 常用命令
Bash# 启动服务(后台运行)
docker compose up -d
# 停止并删除容器
docker compose down
# 查看运行状态
docker compose ps
# 查看日志
docker compose logs -f
# 重新构建镜像
docker compose build
# 执行单次命令
docker compose run <服务名> <命令>
八、实用技巧
8.1 批量操作
Bash# 停止所有运行中的容器
docker stop $(docker ps -q)
# 删除所有容器
docker rm -f $(docker ps -aq)
# 删除所有镜像
docker rmi -f $(docker images -aq)
8.2 配置别名(添加至 ~/.bashrc)
Bashalias dps='docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Ports}}"'
alias dimg='docker images --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}\t{{.Size}}"'
MySql
docker run -d -p 3306:3306
-v /app/myconf:/etc/mysql/conf.d
-v /app/mydata:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=123456
mysql:8.0.37-debian
compose.yaml
上线:docker compose up -d
下线:docker compose down
启动:docker compose start x1 x2 x3
停止:docker compose stop x1 x3
扩容:docker compose scale x2=3
redis
mysql
app
九、实战
创建⽹络
docker network create blog
启动mysql
docker run -d -p 3306:3306
-e MYSQL_ROOT_PASSWORD=123456
-e MYSQL_DATABASE=wordpress
-v mysql-data:/var/lib/mysql
-v /app/myconf:/etc/mysql/conf.d
--restart always --name mysql
--network blog
mysql:8.0
启动wordpress
docker run -d -p 8080:80
-e WORDPRESS_DB_HOST=mysql
-e WORDPRESS_DB_USER=root
-e WORDPRESS_DB_PASSWORD=123456
-e WORDPRESS_DB_NAME=wordpress
-v wordpress:/var/www/html
--restart always --name wordpress-app
--network blog
wordpress:latest
compose.yaml
name: myblog
services:
mysql:
container_name: mysql
image: mysql:8.0
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=123456
- MYSQL_DATABASE=wordpress
volumes:
- mysql-data:/var/lib/mysql
- /app/myconf:/etc/mysql/conf.d
restart: always
networks:
- blog
wordpress:
image: wordpress
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_USER: root
WORDPRESS_DB_PASSWORD: 123456
WORDPRESS_DB_NAME: wordpress
volumes:
- wordpress:/var/www/html
restart: always
networks:
- blog
depends_on:
- mysql
volumes:
mysql-data:
wordpress:
networks:
blog:
vim compose.yaml
docker compose -f compose.yaml up -d
docker compose -f compse.yaml down --rmi all -v
docker file
文档地址:https://docs.docker.com/reference/dockerfile/
FROM openjdk:17
LABEL author=leifengyang
COPY app.jar /app.jar
EXPOSE 8080
ENTRYPOINT ["java,"-jar","/app.jar"]
docker build -f Dockerfile -t myjavaapp:v1.0 .
docker(fastapi+vue3项目部署)
1.mysql数据库构建
docker run -d -p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-e MYSQL_DATABASE=fastapi \
-v mysql-data:/var/lib/mysql \
-v /app/myconf:/etc/mysql/conf.d \
--restart always --name mysql \
--network ezbc_cms \
mysql:8.0
2.vue3 构建
vim Dockerfile
FROM nginx
COPY ./dist /usr/share/nginx/html/
EXPOSE 5002
docker build -t vue3_ezbc_cms .
docker run -d -p 5002:80 --name vue3_ezbc_cms \
--restart always --name vue3_ezbc \
--network ezbc_cms \
vue3_ezbc_cms
3.fastapi构建
pip freeze > requirements.txt
vim Dockerfile
FROM python:3.9
WORKDIR /app
COPY . /app
RUN pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade pip
RUN pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
EXPOSE 5001
CMD ["python3"."app.py"]
docker build -t fastapi_ezbc_cms .
docker run -d -p 5001:5001 --name fastapi_ezbc_cms \
--restart always --name fastapi_ezbc \
--network ezbc_cms \
fastapi_ezbc_cms
基础配置类
FROM
指定构建镜像的基础镜像,是 Dockerfile 中第一条指令 。后续指令基于该基础镜像环境执行。比如FROM ubuntu:latest
,表示以最新版 Ubuntu 系统为基础来构建镜像;FROM python:3.9-slim
则是以精简版 Python 3.9 环境为基础 ,可用于构建 Python 应用镜像。WORKDIR
用于在镜像内设置默认工作目录。后续RUN
、CMD
、COPY
等指令若涉及相对路径操作,都以该目录为基准。例如先执行WORKDIR /app
,后续COPY. /app
就会把本地当前目录内容复制到镜像内/app
目录下。ARG
定义构建时的参数,可在构建镜像时通过--build-arg
传入值。比如ARG VERSION=latest
定义了名为VERSION
的参数,构建时可docker build --build-arg VERSION=1.0.0.
来指定具体版本值。参数仅在构建过程中可用,镜像构建完成后不可访问。
命令执行与启动类
RUN
用于在构建镜像过程中执行命令,可安装软件包、配置环境等。比如RUN apt-get update && apt-get install -y software
,在基于 Debian 或 Ubuntu 系的镜像中更新软件源并安装指定软件 。每条RUN
指令执行完都会生成新的镜像层。CMD
指定容器启动时默认执行的命令或参数。一个 Dockerfile 中只能有一条CMD
指令,若有多条,最后一条生效。可用于启动应用程序,如CMD ["python", "app.py"]
表示容器启动时运行app.py
脚本。也可提供默认参数,被docker run
命令行参数覆盖。ENTRYPOINT
设置容器启动时固定执行的命令,通常用于确保容器以特定方式启动。可搭配CMD
使用,CMD
提供的参数会附加在ENTRYPOINT
之后。例如ENTRYPOINT ["python"]
,CMD ["app.py"]
,容器启动时实际执行python app.py
。常用于设置像docker run nginx
这种直接以固定命令启动容器的场景。
文件操作类
ADD
将本地文件或目录添加到镜像中指定路径。若源路径是本地压缩包(如.tar
、.gz
等),在添加时会自动解压。比如ADD myapp.tar.gz /app
,会把myapp.tar.gz
解压到镜像内/app
目录。但使用时需注意,ADD
从远程 URL 下载文件时可能存在安全和版本控制问题。COPY
单纯将本地文件或目录复制到镜像指定路径,不会自动解压压缩包。相比ADD
更简洁、功能更明确,推荐用于一般文件复制场景。例如COPY requirements.txt /app
,把本地requirements.txt
复制到镜像内/app
目录。
环境与端口配置类
ENV
设置环境变量,可在构建镜像过程中以及容器运行时使用。比如ENV PYTHONPATH=/app
,后续在镜像内执行 Python 相关操作时就会依据此环境变量找模块路径。也可在docker run
时用-e
参数覆盖,如docker run -e PYTHONPATH=/newpath myimage
。EXPOSE
声明容器运行时打算暴露的端口,主要起文档说明和端口映射提示作用。本身不实际开启端口访问,需配合docker run -p
(映射端口)或docker-compose.yml
中的ports
配置来实现端口对外映射。比如EXPOSE 80
表示容器内应用使用 80 端口,后续可通过映射让外部访问容器内 80 端口服务。
数据与权限类
VOLUME
定义数据卷,用于在容器中持久化数据或实现容器间数据共享。数据卷可绕过镜像的联合文件系统,直接在宿主机存储数据。比如VOLUME /data
,表示在容器内/data
目录可挂载宿主机目录或其他数据卷,实现数据持久化,容器删除后数据仍可保留。USER
指定容器运行时使用的用户和用户组。可以是用户名或 UID 。例如USER appuser
,后续在容器内执行命令就以appuser
用户身份运行,增强容器安全性,避免容器以root
权限运行带来的风险。
标识与元数据类
LABEL
用于给镜像添加自定义标签,以键值对形式存在,可添加镜像的描述、作者、版本、用途等元数据信息。例如 LABEL maintainer="example@example.com" description="This is a sample app image"
,方便对镜像进行管理、分类和识别 。
评论区