Docker 容器技术笔记
一、概述
Docker 是一种轻量级的应用容器化平台,可以将应用程序及其依赖环境打包成一个标准化的单元,实现“一次构建,到处运行”。
为什么使用 Docker
- 组织有序性:便于管理不同应用之间的依赖关系,避免环境冲突。
- 便携性:解决应用迁移和集群部署的问题,保障开发、测试、生产环境一致性。
- 安全性:容器之间相互隔离,降低应用间的干扰和攻击面。
传统虚拟化 vs 容器虚拟化
| 比较项 | 传统虚拟化 | 容器虚拟化 |
|---|---|---|
| 创建速度 | 较慢(需启动完整操作系统) | 极快(共享宿主机内核) |
| 性能消耗 | 有显著的性能损耗 | 几乎无额外性能开销 |
| 资源占用 | 占用大量内存和磁盘空间 | 占用资源极少,轻量高效 |
| 操作系统覆盖 | 支持 Linux、Windows、macOS 等 | 仅限宿主机内核所支持的操作系统 |
基本概念
- 仓库(Repository):用于存储和分发 Docker 镜像的地方(如 Docker Hub、阿里云容器镜像服务)。
- 镜像(Image):一个只读的模板,包含运行应用所需的代码、运行时、库、环境变量和配置文件。一个镜像可以创建多个容器。
- 容器(Container):由镜像创建的运行实例,可被启动、停止、删除。容器之间相互隔离,但共享宿主机内核。
二、安装(以 CentOS 为例)
-
更新 yum 仓库,确保软件包均为最新版本:
yum update -y -
检查并卸载旧版 Docker(如有):
yum list installed | grep docker yum remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine -
安装所需依赖包(yum-utils 提供 yum-config-manager 工具,其余为 devicemapper 驱动依赖):
yum install -y yum-utils device-mapper-persistent-data lvm2 -
设置阿里云 Docker 镜像源(加速下载):
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -
查看可用版本,按需选择:
yum list docker-ce --showduplicates | sort -r -
安装 Docker CE:
yum install -y docker-ce -
启动并设置开机自启:
systemctl start docker systemctl enable docker -
验证安装:
docker version
三、容器常用命令
配置镜像加速器
创建 Docker 配置文件并添加国内镜像加速地址:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn",
"https://rbw25ox1.mirror.aliyuncs.com"
]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
常用操作命令
| 用途 | 命令示例 |
|---|---|
| 启动新容器 | docker run centos echo 'hello docker' |
| 启动交互式容器 | docker run -it centos /bin/bash(-i:保持 STDIN 打开,-t:分配伪终端) |
| 进入运行中的容器 | docker attach 容器名 |
| 停止容器 | docker stop 容器名(优雅停止) / docker kill 容器名(强制停止) |
| 查看容器 | docker ps(运行中)、docker ps -a(所有)、docker ps -l(最近) |
| 查看容器详情 | docker inspect 容器名或ID |
| 重启已停止容器 | docker start -i 容器名(-i 可进入交互模式) |
| 删除已停止容器 | docker rm 容器名 |
| 查看容器日志 | docker logs -f -t --tail=100 容器名(-f 跟踪,-t 时间戳,–tail 行数) |
| 查看容器内进程 | docker top 容器名 |
| 在容器内执行新命令 | docker exec -it 容器名 /bin/bash |
| 复制文件到容器 | docker cp 本地文件 容器ID:容器内路径 |
四、端口映射
Docker 容器默认与宿主机网络隔离,需通过端口映射对外提供服务。
docker run [-P] [-p]
-
-P(大写):自动将容器所有暴露的端口映射到宿主机的随机高位端口。
docker run -P -it centos /bin/bash -
-p(小写):手动指定端口映射,支持多种格式:
docker run -p 80 -it centos /bin/bash # 宿主机随机端口 → 容器80端口 docker run -p 8080:80 -it centos /bin/bash # 宿主机8080端口 → 容器80端口 docker run -p 0.0.0.0:8080:80 -it centos /bin/bash # 指定IP和端口
五、Nginx 部署示例
# 1. 创建守护式容器并映射80端口
docker run -p 80 --name=nginx-demo -it centos /bin/bash
# 2. 在容器内更新 yum 源(CentOS 8 及以后需调整仓库)
sed -i -e "s|mirrorlist=|#mirrorlist=|g" /etc/yum.repos.d/CentOS-*
sed -i -e "s|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g" /etc/yum.repos.d/CentOS-*
# 3. 安装 nginx
yum install -y epel-release
yum install -y nginx
# 4. 创建测试页面
echo "Hello Docker Nginx" > /usr/share/nginx/html/index.html
# 5. 启动 nginx(前台运行,便于调试)
/usr/sbin/nginx -g "daemon off;"
# 6. 在宿主机测试访问(端口号以实际映射为准)
curl http://localhost:32769/index.html
六、镜像与仓库常用命令
| 用途 | 命令示例 |
|---|---|
| 列出本地镜像 | docker images(-a 所有,-q 只显示ID,–no-trunc 不截断) |
| 查看镜像详情 | docker inspect 镜像名或ID |
| 删除镜像 | docker rmi 镜像名或ID(-f 强制删除) |
| 拉取镜像 | docker pull ubuntu:20.04(-a 拉取所有标签) |
| 推送镜像 | docker push 用户名/镜像名:标签(需先登录仓库) |
| 基于容器构建镜像 | docker commit -a "作者" -m "提交信息" 容器名 新镜像名:标签 |
批量删除示例:
docker rmi $(docker images -q centos) # 删除所有 centos 镜像
七、Dockerfile 构建镜像
Dockerfile 是一个文本文件,包含构建镜像所需的指令。通过 docker build 可以自动化构建镜像。
示例:构建包含 Nginx 的镜像
1. 创建目录和 Dockerfile
mkdir -p ~/mynginx
cd ~/mynginx
vi Dockerfile
2. 编写 Dockerfile
# 基础镜像
FROM centos:7
# 维护者信息
MAINTAINER maomao "maomao@example.com"
# 更新 yum 源并安装 nginx
RUN sed -i -e "s|mirrorlist=|#mirrorlist=|g" /etc/yum.repos.d/CentOS-* && \
sed -i -e "s|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g" /etc/yum.repos.d/CentOS-* && \
yum install -y epel-release && \
yum install -y nginx && \
yum clean all
# 暴露端口
EXPOSE 80
# 容器启动时运行 nginx(前台模式)
CMD ["/usr/sbin/nginx", "-g", "daemon off;"]
3. 构建镜像
docker build -t mynginx:1.0 .
4. 运行容器
docker run -d -p 8080:80 --name mynginx mynginx:1.0
Dockerfile 常用指令详解
| 指令 | 作用说明 |
|---|---|
FROM |
指定基础镜像,必须是第一条非注释指令 |
MAINTAINER |
设置镜像作者信息(已废弃,建议使用 LABEL) |
RUN |
在构建时执行的命令,常用于安装软件包 |
EXPOSE |
声明容器运行时监听的端口(仅文档说明,实际映射需用 -p) |
CMD |
容器启动时执行的命令,可被 docker run 后的参数覆盖 |
ENTRYPOINT |
容器启动时执行的命令,不会被覆盖(可与 CMD 组合使用) |
ADD |
复制文件/目录到镜像,支持 URL 和自动解压 tar 文件 |
COPY |
复制文件/目录到镜像(推荐,更透明) |
ENV |
设置环境变量,在后续指令和容器运行时生效 |
USER |
指定运行容器时使用的用户名或 UID |
WORKDIR |
设置工作目录,后续 RUN、CMD 等命令在该目录下执行 |
VOLUME |
创建挂载点,用于持久化数据或容器间数据共享 |
ONBUILD |
为子镜像(以当前镜像为基础)添加触发器指令 |
八、容器数据管理
数据卷(Volume)
数据卷是绕过联合文件系统(UFS)的特殊目录,用于持久化数据和容器间共享。
添加数据卷
# 宿主机目录:容器目录
docker run -v /host/data:/container/data -it centos /bin/bash
设置只读权限
docker run -v /host/data:/container/data:ro -it centos /bin/bash
使用数据卷容器
# 创建数据卷容器
docker create -v /data --name datastore centos /bin/true
# 其他容器挂载该数据卷
docker run --volumes-from datastore -it centos /bin/bash
九、多容器管理 —— Docker Compose
当应用由多个容器组成(如 Web 服务 + 数据库 + 缓存)时,手动管理每个容器非常繁琐。Docker Compose 通过一个 YAML 文件定义所有容器配置,实现一键管理。
docker-compose.yml 示例
version: '3.8' # 使用较新版本
services:
web:
image: nginx:latest
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
restart: always
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: root123
MYSQL_DATABASE: myapp
volumes:
- db_data:/var/lib/mysql
restart: always
volumes:
db_data: # 命名卷,便于持久化
常用命令
| 命令 | 说明 |
|---|---|
docker-compose up -d |
启动所有服务(后台运行) |
docker-compose down |
停止并删除所有容器、网络、卷 |
docker-compose ps |
查看服务运行状态 |
docker-compose logs -f |
查看所有服务日志(持续跟踪) |
docker-compose restart [服务名] |
重启所有或指定服务 |
docker-compose start/stop [服务名] |
启动/停止所有或指定服务 |
docker-compose rm [服务名] |
删除所有或指定服务(需先停止) |
docker-compose exec 服务名 命令 |
在指定服务容器中执行命令 |
docker-compose build |
重新构建所有服务的镜像 |
docker-compose pull |
拉取所有服务的最新镜像 |
重启策略(restart)
| 策略 | 行为 |
|---|---|
no |
默认,容器退出时不重启 |
on-failure |
仅当容器非正常退出(退出码非0)时重启 |
on-failure:3 |
非正常退出时重启,最多尝试 3 次 |
always |
无论退出状态如何,总是重启容器 |
unless-stopped |
总是重启,除非容器被手动停止(即使 Docker 守护进程重启也不自动启动) |
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)