Docker 学习笔记
Docker是一个开源的应用容器引擎,基于Go语言 并遵从Apache2.0协议开源。Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低。
最近用 Docker 的次数越来越多了,在此记录一下常用的命令。
核心概念
在使用之前,需要理解几个基本概念。
镜像(Image)
镜像是一个只读模板,包含应用程序运行所需的环境、依赖和配置文件,可以理解为一个运行环境的 快照。容器就是基于镜像创建的运行实例。
镜像通常采用分层结构构建,便于复用和节省存储空间。
容器(Container)
容器是镜像的运行实例,是一个轻量级、隔离的运行环境。
它共享宿主机内核,启动速度快、资源占用少,并通过 Namespace 和 Cgroups 实现进程级隔离。
仓库(Repository)
仓库是镜像存储与分发的位置,例如:Docker Hub
可以通过 docker pull 从仓库拉取镜像,也可以搭建私有仓库用于企业内部使用。
Docker 架构
Docker 采用 C/S 架构:
客户端(docker CLI)
→ Docker Daemon(后台服务)
→ 镜像仓库
用户通过 CLI 发送命令,由 Docker Daemon 负责镜像构建、容器运行和资源管理,如本地无镜像则会自动从远程仓库拉取。
安装 Docker
安装 Docker 主要有以下几种方法,适用于不同的操作系统和需求:
通用安装脚本
推荐用于 CentOS 7、Debian、Ubuntu
curl -sSL https://get.docker.com/ | sh
国内镜像加速
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
配置 Docker
设置开机自启
systemctl start docker
systemctl enable docker
更换镜像源
为了提高拉取镜像的速度,建议配置国内的镜像源:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com"
]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
docker info
Docker 常用命令
以下是一些基本的 Docker 命令,用于管理容器和镜像:
镜像操作
docker -v # 查看版本
docker search nginx # 搜索镜像
docker pull nginx # 拉取镜像
docker images # 查看本地镜像
docker rmi 镜像ID # 删除镜像
docker history nginx # 查看镜像分层历史
docker save -o nginx.tar nginx # 导出镜像
docker load -i nginx.tar # 导入镜像
构建镜像(不使用缓存):
docker build --no-cache -t mynginx .
容器操作
docker run -d -p 8080:80 --name mynginx nginx
常用参数说明:
--name指定容器名称-d后台运行-p端口映射(宿主机:容器)-P随机端口映射-it交互模式--rm容器停止后自动删除-e传递环境变量--restart设置重启策略
其他命令
docker ps # 查看当前正在运行的容器
docker ps -a # 查看所有容器(包括已停止的容器)
docker ps -q # 只显示容器ID(静默模式)
docker ps -n 5 # 显示最近创建的5个容器
docker stop 容器名 # 停止正在运行的容器(优雅停止,发送 SIGTERM 信号)
docker start 容器名 # 启动一个已经停止的容器
docker restart 容器名 # 重启容器(先 stop 再 start)
docker rm 容器名 # 删除已停止的容器(运行中的容器需要先 stop)
docker rm -f 容器名 # 强制删除运行中的容器
docker exec -it 容器名 bash
# 进入正在运行的容器内部
# -i 保持标准输入开启
# -t 分配一个伪终端
# bash 在容器中启动 bash 终端(如果没有 bash,可改为 sh)
docker attach 容器名 # 连接到容器主进程
docker logs 容器名 # 查看日志
docker logs -f 容器名 # 实时查看日志
docker stats # 查看容器资源使用情况
docker top 容器名 # 查看容器内部进程
docker inspect 容器名 # 查看容器详细信息
数据持久化(Volume)
容器删除后数据会丢失,因此必须使用数据卷。
目录挂载
docker run -d \
-p 8080:80 \
-v /data/www:/usr/share/nginx/html \
nginx
查看数据卷
docker volume ls
删除数据卷
docker volume rm 卷名
Docker 网络管理
查看网络
docker network ls
默认网络模式:
bridge(默认):为容器分配独立网络空间,通过 NAT 与宿主机通信,适合大多数场景host:容器与宿主机共享网络栈,不进行端口映射,性能高但隔离性降低none:不配置网络,容器没有任何网络功能
创建自定义网络
docker network create mynet
指定网络运行
docker run -d --network=mynet nginx
网络连接与断开
docker network connect 网络名 容器名
docker network disconnect 网络名 容器名
自定义网络下容器可以通过容器名互相访问。
日志与调试
查看日志
docker logs 容器名
实时查看日志
docker logs -f 容器名
限制日志大小(生产环境建议)
docker run -d \
--log-opt max-size=10m \
--log-opt max-file=3 \
nginx
容器运行高级参数
环境变量
docker run -d \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql
自动重启
docker run -d \
--restart=always \
nginx
重启策略:
no:默认,不自动重启容器always:始终重启容器(即使手动停止后也会尝试重启)on-failure:容器异常退出时重启,可指定失败次数unless-stopped:除非手动停止,否则自动重启
资源限制
docker run -d \
--memory="512m" \
--cpus="1.0" \
nginx
指定 CPU 核心:
--cpuset-cpus="0,1"
时间同步
-v /etc/localtime:/etc/localtime:ro
Dockerfile 基础
Dockerfile 用于自定义镜像。
FROM nginx:latest
COPY ./html /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
常见指令:
FROM:指定基础镜像,Dockerfile 必须以FROM开头RUN:在构建镜像时执行命令(生成新的镜像层)COPY:将本地文件复制到镜像中ADD:类似COPY,但支持自动解压和远程URLWORKDIR:设置工作目录,后续命令默认在该目录执行EXPOSE:声明容器对外暴露的端口(仅说明用途,不会自动映射)CMD:容器启动时默认执行的命令(可被覆盖)ENTRYPOINT:容器启动时的固定入口命令(通常不被覆盖)
构建镜像:
docker build -t mynginx .
Docker Compose
Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。
安装
curl -L "https://github.com/docker/compose/releases/download/v2.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose version
yml 文件编写
version: '3'
services:
php:
image: php:7.2-apache
volumes:
- ./www:/var/www/html
ports:
- "8080:80"
启动:
docker compose up -d
停止并删除:
docker compose down
查看状态:
docker compose ps
查看日志:
docker compose logs -f
Docker 清理与空间管理
查看磁盘占用
docker system df
清理无用资源
docker system prune
清理所有未使用镜像(慎用):
docker system prune -a
批量操作命令
docker stop $(docker ps -aq)
docker rm $(docker ps -aq)
docker rmi $(docker images -q)
按条件删除:
docker rmi `docker images | grep nginx | awk '{print $3}'`