Docker
技术原理
Docker 使用了 Linux 内核的容器化技术来实现轻量级的虚拟化。它允许开发者将应用程序及其依赖打包在一个独立的容器中,从而确保在不同环境中运行的一致性
- Cgroups:控制资源分配和限制,可以为每个容器设定 CPU,内存,网络带宽等资源的使用上限,确保容器的资源消耗不会影响到宿主机和其他容器的运行
- Namespaces:隔离进程的视图,使容器只能看到自己内部的进程 ID,网络资源,文件目录,使其认为自己在独立的系统中运行
基础命令
镜像
拉取镜像:
docker pull docker.io/library/nginx:latest 等同于 docker pull nginx
docker.io: registry 仓库地址/注册表,默认 docker.iolibrary: 命名空间,默认 librarynginx: 镜像名称latest: 标签(tag),默认 latest
拉取特定架构的镜像
--platform
docker pull --platform=linux/amd64 nginx:latest
查看镜像:docker images
删除镜像:docker rmi <IMAGE ID/NAME>
容器
运行容器:
docker run -d -p 8080:80 --name mynginx nginx:latest
- 通过镜像创建一个容器并运行(
create仅创建),如果没有这个镜像则自动拉取 -d:detached mode,后台运行容器-p 8080:80:端口映射,将宿主机的 8080 端口映射到容器的 80 端口--name mynginx:指定容器名称为 mynginx-v 宿主机目录 : 容器目录:目录映射,数据持久化保存(绑定挂载)-e:传递环境变量--restart:重启策略,always:停止则重启;unless-stopped:手动停止不重启
使用绑定挂载时,宿主机目录会暂时覆盖容器目录,而使用命名挂载时,容器的文件夹会同步到命名卷中
查看容器:docker ps:查看正在运行中的容器,-a 查看所有容器
启停容器:
docker start <CONTAINER_ID/NAME>docker stop <CONTAINER_ID/NAME>
进入容器:
docker run -it --rm <CONTAINER_ID/NAME>:-it可交互的终端环境,--rm退出时删除容器docker exec <CONTAINER_ID/NAME> <shell>:执行 shell 命令,如ps -ef查看进程信息docker exec -it <CONTAINER_ID/NAME> bash/sh:进入容器交互终端执行
删除容器:docker rm -f <CONTAINER_ID/NAME>:-f 强制删除在运行中的文件
容器日志:docker logs <CONTAINER_ID/NAME>:-f 持续输出,滚动查看
cat /etc/os-release:查看容器内部 linux 版本,便于后续安装
卷
docker volume create <VOLUME_NAME>:创建卷docker volume list:查看所有卷docker volume inspect <VOLUME_NAME>:查看卷信息docker volume rm <VOLUME_NAME>:删除卷docker volume prune -a:删除未使用卷
Dockerfile
# 基础镜像
FROM python:3.13-slim
# 镜像内工作目录
WORKDIR /app
# 本地当前目录 镜像内当前目录
COPY . .
# 镜像内命令
RUN pip install -r requirement.txt
# 仅做声明效果
EXPOSE 8000
# 容器启动时命令 ENTRYPOINT 优先级更高
CMD ["python3", "main.py"]# 构建镜像
docker build -t docker-test .
# 运行容器
docker run -d -p 8000:8000 docker-test
# 推送镜像
docker login
docker pull username/docker_testDocker 网络
Bridge 模式
Docker 网络默认 Bridge(桥接模式),所有的容器都连接到这个网络中,每一个容器都分配了一个内部的 IP 地址,一般都是 172.17 开头。在这个内部子网里面,容器可以通过内部 IP 地址互相访问
可以使用 docker network create <NETWORK_NAME> 命令创建子网,默认情况下,子网也是桥接模式的一种,然后指定容器加入不同的子网--network <NETWORK_NAME>,同一个子网内的容器可以互相通信(直接使用名称),而跨子网则不可以通信
Host 模式
Host 模式下,docker 容器直接共享宿主机的网络,容器直接使用宿主机的 IP 地址 --network host ,无需 -p 参数进行端口映射,容器内的服务直接运行在宿主机的端口上,通过宿主机的 IP 和端口就能访问到容器中服务
None 模式
不联网
查看网络:docker network list
删除自定义网络:docker network rm <NETWORK ID/NAME>
Docker Compose
Docker Compose 轻量级容器编排技术,本质是将多个 docker 命令抽象为一个 YAML 配置文件,在这个文件中记录了容器之间如何创建以及如何协同工作,简化多容器应用的管理
services:
my_mongodb:
image: mongo
environment:
MONGO_INITDB_ROOT_USERNAME: name
MONGO_INITDB_ROOT_PASSWORD: pass
volumes:
- /my/datadir:/data/db
my_mongodb_express:
image: mongo-express
ports:
- 8081:8081
environment:
ME_CONFIG_MONGODB_SERVER: my_mongodb
ME_CONFIG_MONGODB_ADMINUSERNAME: name
ME_CONFIG_MONGODB_ADMINPASSWORD: pass
depends_on:
- my_mongodbdocker compose up -d运行docker compose down -v删除(-v 同时删除卷)docker compose stop停止docker compose start启动
同一个 compose 文件中,定义的所有容器都会自动加入同一个子网
执行
docker compose up时,会检测当前目录下名为docker-compose.yaml或compose.yaml文件。可以通过docker compose -f test.yaml up -d指定 compose 文件