一、概述

Docker 是一种轻量级的应用容器化平台,可以将应用程序及其依赖环境打包成一个标准化的单元,实现“一次构建,到处运行”。

为什么使用 Docker

  • 组织有序性:便于管理不同应用之间的依赖关系,避免环境冲突。
  • 便携性:解决应用迁移和集群部署的问题,保障开发、测试、生产环境一致性。
  • 安全性:容器之间相互隔离,降低应用间的干扰和攻击面。

传统虚拟化 vs 容器虚拟化

比较项 传统虚拟化 容器虚拟化
创建速度 较慢(需启动完整操作系统) 极快(共享宿主机内核)
性能消耗 有显著的性能损耗 几乎无额外性能开销
资源占用 占用大量内存和磁盘空间 占用资源极少,轻量高效
操作系统覆盖 支持 Linux、Windows、macOS 等 仅限宿主机内核所支持的操作系统

基本概念

  • 仓库(Repository):用于存储和分发 Docker 镜像的地方(如 Docker Hub、阿里云容器镜像服务)。
  • 镜像(Image):一个只读的模板,包含运行应用所需的代码、运行时、库、环境变量和配置文件。一个镜像可以创建多个容器。
  • 容器(Container):由镜像创建的运行实例,可被启动、停止、删除。容器之间相互隔离,但共享宿主机内核。

二、安装(以 CentOS 为例)

  1. 更新 yum 仓库,确保软件包均为最新版本:

    yum update -y
    
  2. 检查并卸载旧版 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
    
  3. 安装所需依赖包(yum-utils 提供 yum-config-manager 工具,其余为 devicemapper 驱动依赖):

    yum install -y yum-utils device-mapper-persistent-data lvm2
    
  4. 设置阿里云 Docker 镜像源(加速下载):

    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
  5. 查看可用版本,按需选择:

    yum list docker-ce --showduplicates | sort -r
    
  6. 安装 Docker CE

    yum install -y docker-ce
    
  7. 启动并设置开机自启

    systemctl start docker
    systemctl enable docker
    
  8. 验证安装

    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 设置工作目录,后续 RUNCMD 等命令在该目录下执行
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 守护进程重启也不自动启动)
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐