Linux基础教程 第13课:Docker容器技术基础

浏览量:55 次 发布时间:2026-01-21 19:44 作者:明扬工控商城 下载docx

最近更新:Linux基础教程 第15课:Linux内核和驱动管理


好的,我们继续第十三课。今天学习Docker容器技术,这是现代应用部署的重要技术。


第一部分:Docker基础概念

1.1 什么是Docker?

Docker是一个开源的容器化平台,可以将应用程序及其依赖项打包到一个标准化的单元中,这个单元叫做容器。


与传统虚拟机的区别:


text

虚拟机:硬件 -> 主机操作系统 -> 虚拟机管理程序 -> 每个虚拟机有自己的操作系统 -> 应用

Docker:硬件 -> 主机操作系统 -> Docker引擎 -> 容器(共享主机操作系统内核)-> 应用

优势:


轻量级(容器共享主机内核)


快速启动(秒级)


一致性(开发、测试、生产环境一致)


资源利用率高


易于扩展


1.2 Docker核心概念

镜像(Image):只读模板,包含运行应用所需的所有内容


容器(Container):镜像的运行实例


仓库(Registry):存储镜像的地方(Docker Hub是官方仓库)


Dockerfile:构建镜像的脚本文件


第二部分:Docker安装和配置

2.1 在Ubuntu上安装Docker

bash

# 1. 卸载旧版本

sudo apt remove docker docker-engine docker.io containerd runc


# 2. 更新软件包索引

sudo apt update


# 3. 安装依赖包

sudo apt install -y apt-transport-https ca-certificates curl gnupg lsb-release


# 4. 添加Docker官方GPG密钥

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg


# 5. 添加Docker仓库

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null


# 6. 安装Docker引擎

sudo apt update

sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin


# 7. 验证安装

sudo docker --version

sudo docker run hello-world

2.2 配置Docker

bash

# 1. 启动Docker服务

sudo systemctl start docker

sudo systemctl enable docker


# 2. 查看Docker状态

sudo systemctl status docker


# 3. 将当前用户加入docker组(避免每次都使用sudo)

sudo usermod -aG docker $USER


# 需要重新登录或执行以下命令使组更改生效

newgrp docker


# 4. 验证非sudo权限

docker run hello-world


# 5. 配置Docker守护进程

sudo vim /etc/docker/daemon.json

daemon.json示例配置:


json

{

 "registry-mirrors": ["https://registry.docker-cn.com"],

 "log-driver": "json-file",

 "log-opts": {

   "max-size": "10m",

   "max-file": "3"

 },

 "storage-driver": "overlay2",

 "live-restore": true

}

bash

# 6. 重启Docker使配置生效

sudo systemctl restart docker


# 7. 查看Docker信息

docker info

第三部分:Docker镜像管理

3.1 镜像基本操作

bash

# 搜索镜像

docker search ubuntu

docker search nginx --filter "is-official=true"


# 拉取镜像

docker pull ubuntu:20.04

docker pull nginx:latest

docker pull mysql:8.0


# 查看本地镜像

docker images

docker image ls

docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"


# 查看镜像详细信息

docker image inspect ubuntu:20.04


# 删除镜像

docker rmi ubuntu:20.04

docker image rm nginx:latest

docker rmi $(docker images -q)  # 删除所有镜像(危险!)


# 清理未使用的镜像

docker image prune

docker image prune -a  # 删除所有未使用的镜像


# 给镜像打标签

docker tag ubuntu:20.04 myubuntu:v1

3.2 构建镜像(Dockerfile)

创建第一个Dockerfile:


bash

# 创建项目目录

mkdir myapp && cd myapp


# 创建应用文件

cat > app.py << 'EOF'

from flask import Flask

import os


app = Flask(__name__)


@app.route('/')

def hello():

   return f"Hello from Docker! Hostname: {os.uname().nodename}"


@app.route('/health')

def health():

   return 'OK'


if __name__ == '__main__':

   app.run(host='0.0.0.0', port=5000)

EOF


# 创建requirements.txt

cat > requirements.txt << 'EOF'

Flask==2.3.0

EOF


# 创建Dockerfile

cat > Dockerfile << 'EOF'

# 使用官方Python基础镜像

FROM python:3.9-slim


# 设置工作目录

WORKDIR /app


# 设置环境变量

ENV PYTHONDONTWRITEBYTECODE=1

ENV PYTHONUNBUFFERED=1

ENV FLASK_APP=app.py

ENV FLASK_RUN_HOST=0.0.0.0


# 安装系统依赖

RUN apt-get update && apt-get install -y \

   gcc \

   && rm -rf /var/lib/apt/lists/*


# 复制依赖文件

COPY requirements.txt .


# 安装Python依赖

RUN pip install --no-cache-dir -r requirements.txt


# 复制应用代码

COPY . .


# 创建非root用户

RUN useradd -m -u 1000 appuser && chown -R appuser:appuser /app

USER appuser


# 暴露端口

EXPOSE 5000


# 健康检查

HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \

   CMD curl -f http://localhost:5000/health || exit 1


# 启动命令

CMD ["flask", "run"]

EOF

构建镜像:


bash

# 构建镜像

docker build -t myapp:v1 .


# 查看构建历史

docker history myapp:v1


# 使用多阶段构建优化镜像大小

cat > Dockerfile.multistage << 'EOF'

# 构建阶段

FROM python:3.9 AS builder

WORKDIR /app

COPY requirements.txt .

RUN pip install --user -r requirements.txt


# 运行阶段

FROM python:3.9-slim

WORKDIR /app

COPY --from=builder /root/.local /root/.local

COPY . .

ENV PATH=/root/.local/bin:$PATH

EXPOSE 5000

CMD ["flask", "run"]

EOF

第四部分:Docker容器管理

4.1 容器生命周期

bash

# 运行容器(前台)

docker run ubuntu:20.04 echo "Hello Docker"

docker run -it ubuntu:20.04 /bin/bash  # 交互式运行


# 运行容器(后台)

docker run -d --name mynginx nginx:latest


# 运行容器并暴露端口

docker run -d -p 8080:80 --name webserver nginx


# 运行容器并挂载数据卷

docker run -d -p 5000:5000 -v $(pwd):/app --name flaskapp myapp:v1


# 查看运行中的容器

docker ps

docker ps -a  # 查看所有容器(包括停止的)


# 查看容器详细信息

docker inspect webserver


# 查看容器日志

docker logs webserver

docker logs -f webserver  # 实时查看

docker logs --tail 10 webserver  # 查看最后10行

docker logs --since 10m webserver  # 查看10分钟内的日志


# 查看容器资源使用

docker stats

docker stats --no-stream  # 单次查看

docker stats webserver mysql  # 查看特定容器


# 进入运行中的容器

docker exec -it webserver /bin/bash

docker exec -it webserver sh  # 如果bash不可用


# 执行命令(不进入交互模式)

docker exec webserver nginx -t


# 停止容器

docker stop webserver

docker stop $(docker ps -q)  # 停止所有容器


# 启动已停止的容器

docker start webserver


# 重启容器

docker restart webserver


# 暂停容器

docker pause webserver

docker unpause webserver


# 删除容器

docker rm webserver

docker rm -f webserver  # 强制删除运行中的容器

docker container prune  # 删除所有停止的容器

4.2 容器资源限制

bash

# 限制CPU使用

docker run -d --name limited-cpu --cpus="0.5" nginx  # 最多使用0.5个CPU核心

docker run -d --name cpu-shares --cpu-shares=512 nginx  # 相对权重(默认1024)


# 限制内存使用

docker run -d --name limited-mem --memory="512m" nginx  # 限制512MB内存

docker run -d --name mem-swap --memory="512m" --memory-swap="1g" nginx  # 包括交换空间


# 限制磁盘I/O

docker run -d --name limited-io \

   --device-write-bps /dev/sda:10mb \

   --device-read-bps /dev/sda:10mb \

   nginx


# 限制进程数

docker run -d --name limited-pid --pids-limit=100 nginx

第五部分:Docker网络

5.1 Docker网络基础

bash

# 查看Docker网络

docker network ls

docker network inspect bridge


# 创建自定义网络

docker network create mynetwork

docker network create --driver bridge --subnet 172.20.0.0/16 --gateway 172.20.0.1 mynet


# 运行容器时指定网络

docker run -d --name web1 --network mynetwork nginx

docker run -d --name web2 --network mynetwork nginx


# 在容器中测试网络连通性

docker exec web1 ping web2  # 可以使用容器名直接访问


# 将现有容器连接到网络

docker network connect mynetwork existing_container


# 断开网络连接

docker network disconnect bridge container_name


# 删除网络

docker network rm mynetwork

5.2 网络模式

bash

# 桥接模式(默认)

docker run -d --name bridge-container --network bridge nginx


# 主机模式(共享主机网络命名空间)

docker run -d --name host-container --network host nginx


# 无网络模式

docker run -d --name none-container --network none alpine sleep 3600


# 容器模式(共享另一个容器的网络)

docker run -d --name parent-container nginx

docker run -d --name child-container --network container:parent-container alpine sleep 3600


# 自定义网络

docker run -d --name custom-net --network mynetwork --ip 172.20.0.100 nginx

第六部分:数据持久化

6.1 Docker卷(Volumes)

bash

# 创建数据卷

docker volume create mydata


# 查看数据卷

docker volume ls

docker volume inspect mydata


# 使用数据卷

docker run -d --name db \

   -v mydata:/var/lib/mysql \

   -e MYSQL_ROOT_PASSWORD=123456 \

   mysql:8.0


# 挂载主机目录作为数据卷

docker run -d --name app \

   -v /host/path:/container/path \

   -v $(pwd)/app:/app \

   nginx


# 只读挂载

docker run -d --name ro-app \

   -v /host/path:/container/path:ro \

   nginx


# 清理未使用的数据卷

docker volume prune

6.2 数据卷容器

bash

# 创建数据卷容器

docker create --name data-container \

   -v /data \

   -v /config \

   ubuntu:20.04


# 从数据卷容器挂载数据

docker run -d --name app1 \

   --volumes-from data-container \

   nginx


docker run -d --name app2 \

   --volumes-from data-container \

   nginx


# 备份数据卷

docker run --rm \

   --volumes-from data-container \

   -v $(pwd):/backup \

   ubuntu:20.04 \

   tar czf /backup/backup.tar.gz /data


# 恢复数据卷

docker run --rm \

   --volumes-from data-container \

   -v $(pwd):/backup \

   ubuntu:20.04 \

   tar xzf /backup/backup.tar.gz -C /

第七部分:Docker Compose

7.1 Docker Compose安装

bash

# 安装Docker Compose(如果未安装)

sudo apt install docker-compose-plugin


# 验证安装

docker compose version


# 或使用独立版本

sudo curl -L "https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose

7.2 编写docker-compose.yml

bash

# 创建项目目录

mkdir myproject && cd myproject


# 创建docker-compose.yml

cat > docker-compose.yml << 'EOF'

version: '3.8'


services:

 # Web应用服务

 web:

   build: .

   container_name: flask_app

   ports:

     - "5000:5000"

   environment:

     - DATABASE_URL=postgresql://user:password@db:5432/mydb

     - REDIS_URL=redis://redis:6379

   volumes:

     - ./app:/app

     - static_data:/app/static

   depends_on:

     - db

     - redis

   networks:

     - backend

   restart: unless-stopped

   healthcheck:

     test: ["CMD", "curl", "-f", "http://localhost:5000/health"]

     interval: 30s

     timeout: 10s

     retries: 3


 # 数据库服务

 db:

   image: postgres:15

   container_name: postgres_db

   environment:

     POSTGRES_USER: user

     POSTGRES_PASSWORD: password

     POSTGRES_DB: mydb

   volumes:

     - postgres_data:/var/lib/postgresql/data

     - ./init.sql:/docker-entrypoint-initdb.d/init.sql

   networks:

     - backend

   restart: unless-stopped

   healthcheck:

     test: ["CMD-SHELL", "pg_isready -U user"]

     interval: 10s

     timeout: 5s

     retries: 5


 # Redis缓存服务

 redis:

   image: redis:7-alpine

   container_name: redis_cache

   command: redis-server --appendonly yes

   volumes:

     - redis_data:/data

   networks:

     - backend

   restart: unless-stopped


 # Nginx反向代理

 nginx:

   image: nginx:alpine

   container_name: nginx_proxy

   ports:

     - "80:80"

     - "443:443"

   volumes:

     - ./nginx.conf:/etc/nginx/nginx.conf

     - static_data:/usr/share/nginx/html/static

     - ./ssl:/etc/nginx/ssl

   depends_on:

     - web

   networks:

     - backend

   restart: unless-stopped


# 网络配置

networks:

 backend:

   driver: bridge

   ipam:

     config:

       - subnet: 172.20.0.0/16


# 数据卷配置

volumes:

 postgres_data:

   driver: local

 redis_data:

   driver: local

 static_data:

   driver: local

EOF

7.3 Docker Compose常用命令

bash

# 启动所有服务

docker-compose up -d

docker compose up -d  # 新版本


# 查看服务状态

docker-compose ps

docker compose ps


# 查看服务日志

docker-compose logs

docker-compose logs -f  # 实时查看

docker-compose logs web  # 查看特定服务


# 停止服务

docker-compose down

docker compose down


# 停止并删除数据卷

docker-compose down -v


# 重新构建服务

docker-compose build

docker compose build


# 重启服务

docker-compose restart

docker compose restart


# 暂停服务

docker-compose pause

docker compose pause


# 恢复服务

docker-compose unpause

docker compose unpause


# 执行命令

docker-compose exec web python manage.py migrate

docker compose exec db psql -U user -d mydb


# 查看服务资源使用

docker-compose top

docker compose top


# 拉取镜像

docker-compose pull

docker compose pull

第八部分:Docker实践案例

8.1 部署WordPress网站

bash

mkdir wordpress && cd wordpress


cat > docker-compose.yml << 'EOF'

version: '3.8'


services:

 db:

   image: mysql:8.0

   container_name: wordpress_db

   environment:

     MYSQL_ROOT_PASSWORD: rootpassword

     MYSQL_DATABASE: wordpress

     MYSQL_USER: wordpress

     MYSQL_PASSWORD: wordpresspassword

   volumes:

     - db_data:/var/lib/mysql

   networks:

     - wp_network

   restart: always

   healthcheck:

     test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]

     timeout: 20s

     retries: 10


 wordpress:

   image: wordpress:php8.2-apache

   container_name: wordpress_app

   depends_on:

     - db

   ports:

     - "8080:80"

   environment:

     WORDPRESS_DB_HOST: db:3306

     WORDPRESS_DB_USER: wordpress

     WORDPRESS_DB_PASSWORD: wordpresspassword

     WORDPRESS_DB_NAME: wordpress

   volumes:

     - wp_data:/var/www/html

     - ./uploads.ini:/usr/local/etc/php/conf.d/uploads.ini

   networks:

     - wp_network

   restart: always


 phpmyadmin:

   image: phpmyadmin/phpmyadmin

   container_name: phpmyadmin

   depends_on:

     - db

   environment:

     PMA_HOST: db

     PMA_PORT: 3306

     UPLOAD_LIMIT: 300M

   ports:

     - "8081:80"

   networks:

     - wp_network

   restart: always


networks:

 wp_network:

   driver: bridge


volumes:

 db_data:

   driver: local

 wp_data:

   driver: local

EOF


# 启动服务

docker compose up -d


# 访问WordPress

# http://localhost:8080

# http://localhost:8081 (phpMyAdmin)

8.2 部署监控系统

bash

mkdir monitoring && cd monitoring


cat > docker-compose.yml << 'EOF'

version: '3.8'


services:

 # Prometheus监控

 prometheus:

   image: prom/prometheus:latest

   container_name: prometheus

   ports:

     - "9090:9090"

   volumes:

     - ./prometheus.yml:/etc/prometheus/prometheus.yml

     - prometheus_data:/prometheus

   command:

     - '--config.file=/etc/prometheus/prometheus.yml'

     - '--storage.tsdb.path=/prometheus'

     - '--web.console.libraries=/etc/prometheus/console_libraries'

     - '--web.console.templates=/etc/prometheus/consoles'

     - '--storage.tsdb.retention.time=200h'

     - '--web.enable-lifecycle'

   networks:

     - monitoring

   restart: unless-stopped


 # Grafana可视化

 grafana:

   image: grafana/grafana:latest

   container_name: grafana

   ports:

     - "3000:3000"

   volumes:

     - grafana_data:/var/lib/grafana

     - ./grafana/provisioning:/etc/grafana/provisioning

   environment:

     - GF_SECURITY_ADMIN_PASSWORD=admin

     - GF_USERS_ALLOW_SIGN_UP=false

   networks:

     - monitoring

   depends_on:

     - prometheus

   restart: unless-stopped


 # Node Exporter(监控主机)

 node-exporter:

   image: prom/node-exporter:latest

   container_name: node-exporter

   volumes:

     - /proc:/host/proc:ro

     - /sys:/host/sys:ro

     - /:/rootfs:ro

   command:

     - '--path.procfs=/host/proc'

     - '--path.rootfs=/rootfs'

     - '--path.sysfs=/host/sys'

     - '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)'

   networks:

     - monitoring

   restart: unless-stopped

   ports:

     - "9100:9100"


networks:

 monitoring:

   driver: bridge


volumes:

 prometheus_data:

   driver: local

 grafana_data:

   driver: local

EOF


# 创建Prometheus配置

cat > prometheus.yml << 'EOF'

global:

 scrape_interval: 15s

 evaluation_interval: 15s


scrape_configs:

 - job_name: 'prometheus'

   static_configs:

     - targets: ['localhost:9090']


 - job_name: 'node-exporter'

   static_configs:

     - targets: ['node-exporter:9100']


 - job_name: 'docker'

   static_configs:

     - targets: ['docker.for.mac.host.internal:9323']

EOF


# 启动监控系统

docker compose up -d

# 访问Grafana: http://localhost:3000 (admin/admin)

# 访问Prometheus: http://localhost:9090

第九部分:Docker最佳实践

9.1 安全最佳实践

bash

# 1. 使用非root用户运行容器

# 在Dockerfile中:

# RUN useradd -r -u 1001 -g root appuser

# USER appuser


# 2. 定期更新基础镜像

FROM ubuntu:20.04

RUN apt update && apt upgrade -y


# 3. 扫描镜像安全漏洞

docker scan myapp:v1


# 4. 使用最小化基础镜像

FROM alpine:3.18  # 而不是 ubuntu:20.04

FROM python:3.9-slim  # 而不是 python:3.9


# 5. 限制容器资源

docker run --memory=512m --cpus=1.0


# 6. 设置只读文件系统

docker run --read-only


# 7. 避免在镜像中存储敏感信息

# 使用环境变量或Docker secrets

9.2 性能优化实践

bash

# 1. 使用多阶段构建减小镜像大小

# 2. 合理使用.dockerignore文件

cat > .dockerignore << 'EOF'

.git

__pycache__

*.pyc

*.pyo

*.pyd

.env

.DS_Store

README.md

EOF


# 3. 合并RUN命令减少镜像层数

RUN apt update && apt install -y \

   package1 \

   package2 \

   && rm -rf /var/lib/apt/lists/*


# 4. 使用特定的标签而不是latest

FROM nginx:1.25-alpine  # 而不是 nginx:latest


# 5. 使用数据卷存储变化数据

9.3 Docker生产环境配置

bash

# 1. 配置Docker守护进程

sudo vim /etc/docker/daemon.json

json

{

 "log-driver": "json-file",

 "log-opts": {

   "max-size": "10m",

   "max-file": "3"

 },

 "storage-driver": "overlay2",

 "live-restore": true,

 "userland-proxy": false,

 "iptables": true,

 "ip-forward": true,

 "ip-masq": true,

 "exec-opts": ["native.cgroupdriver=systemd"],

 "registry-mirrors": [

   "https://docker.mirrors.ustc.edu.cn",

   "https://hub-mirror.c.163.com"

 ]

}

第十部分:练习项目

项目1:构建个人博客系统

使用Docker Compose部署包含以下服务的个人博客:


Ghost博客平台


MySQL数据库


Nginx反向代理


Redis缓存


备份服务


项目2:微服务应用部署

部署一个简单的微服务应用:


API网关(Kong)


用户服务(Python/Flask)


产品服务(Node.js/Express)


订单服务(Java/Spring Boot)


数据库(PostgreSQL)


消息队列(RabbitMQ)


项目3:CI/CD流水线

创建自动化的CI/CD流水线:


Git仓库(代码管理)


Jenkins(持续集成)


Docker镜像构建


自动化测试


部署到生产环境


项目4:容器监控告警系统

部署完整的监控系统:


Prometheus(指标收集)


Grafana(可视化)


Alertmanager(告警)


cAdvisor(容器监控)


Loki(日志聚合)


今日总结

今天我们学习了Docker容器技术:


Docker基础:概念、安装、配置


镜像管理:拉取、构建、优化


容器管理:生命周期、资源限制


网络:网络模式、自定义网络


存储:数据卷、持久化


Docker Compose:多容器应用编排


实践案例:WordPress、监控系统


最佳实践:安全、性能、生产配置


重要提示:


容器不是虚拟机,而是进程级别的隔离


使用Dockerfile构建可重复的镜像


数据持久化要使用卷而不是容器内部


生产环境要关注安全和性能


Docker Compose适合开发和测试环境


Docker是现代应用部署的标准工具,掌握它将大大提高你的开发和运维效率。


有问题吗?完成练习项目后,我们可以继续第十四课:Linux系统故障排查和恢复。


明扬工控商城

推荐阅读:

Linux基础教程 第20课:Linux安全攻防和渗透测试基础

Linux基础教程 第19课:性能调优和容量规划

Linux基础教程 第18课:Linux云计算基础

Linux基础教程 第17课:自动化运维工具

Linux基础教程 第16课:集群和高可用性

Linux基础教程 第15课:Linux内核和驱动管理

热门标签:
Linux基础教程 第13课:Docker容器技术基础.docx

将本文的Word文档下载到电脑

推荐度:

下载

全部评论

请登录
产业新闻-明扬资讯网
科技资讯-明扬资讯网