1. 首页 > IT综合教程 > 正文

it教程FG052-容器化技术与Docker实践

内容大纲

1. 容器化技术概述

容器化技术是一种轻量级的虚拟化技术,它允许将应用程序及其依赖项打包到一个独立的容器中,实现应用程序的快速部署、移植和扩展。与传统的虚拟机相比,容器具有更小的体积、更快的启动速度和更高的资源利用率。

容器化技术的主要优势包括:

  • 一致性:容器在不同环境中运行一致,消除了”在我的机器上可以运行”的问题
  • 隔离性:容器之间相互隔离,确保应用程序的安全性和稳定性
  • 可移植性:容器可以在任何支持容器运行时的环境中运行
  • 资源效率:容器共享主机操作系统内核,比虚拟机更节省资源
  • 快速部署:容器启动时间通常在秒级,大大缩短了应用程序的部署时间

风哥风哥提示:容器化技术已成为现代应用开发和部署的标准实践,特别是在微服务架构和DevOps环境中。

2. Docker基础知识

Docker是目前最流行的容器化平台,它提供了一套完整的工具和API,用于构建、运行和管理容器。Docker的核心组件包括:

  • Docker Engine:Docker的核心运行时,负责容器的创建、运行和管理
  • Docker镜像:容器的基础,包含了应用程序及其依赖项
  • Docker容器:Docker镜像的运行实例
  • Docker Registry:存储和分发Docker镜像的仓库,如Docker Hub

Docker的工作原理是通过Linux内核的namespace和cgroup技术,为容器提供隔离的运行环境。namespace用于隔离容器的网络、进程、文件系统等资源,cgroup用于限制容器的资源使用。

3. Docker安装与配置

3.1 在Ubuntu上安装Docker

# 更新软件包索引
sudo apt-get update

# 安装必要的依赖包
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

# 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add –

# 添加Docker稳定版仓库
sudo add-apt-repository “deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable”

# 更新软件包索引
sudo apt-get update

# 安装Docker CE
sudo apt-get install docker-ce docker-ce-cli containerd.io

# 验证Docker安装是否成功
sudo docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the “hello-world” image from the Docker Hub.
3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/

For more examples and ideas, visit:
https://docs.docker.com/get-started/

3.2 在CentOS上安装Docker

# 安装必要的依赖包
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

# 添加Docker仓库
sudo yum-config-manager –add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 安装Docker CE
sudo yum install docker-ce docker-ce-cli containerd.io

# 启动Docker服务
sudo systemctl start docker

# 设置Docker服务开机自启
sudo systemctl enable docker

# 验证Docker安装是否成功
sudo docker run hello-world

3.3 Docker配置

Docker的配置文件位于/etc/docker/daemon.json,可以通过修改该文件来配置Docker的行为。例如,配置Docker的镜像加速源:

# 创建或编辑Docker配置文件
sudo vi /etc/docker/daemon.json

{
“registry-mirrors”: [
“https://hub-mirror.c.163.com”,
“https://docker.mirrors.ustc.edu.cn”,
“https://registry.docker-cn.com”
],
“exec-opts”: [“native.cgroupdriver=systemd”],
“log-driver”: “json-file”,
“log-opts”: {
“max-size”: “100m”
},
“storage-driver”: “overlay2”
}
# 重启Docker服务以应用配置
sudo systemctl restart docker

4. Docker镜像管理

4.1 拉取镜像

# 拉取Ubuntu镜像
docker pull ubuntu:latest

# 拉取指定版本的镜像
docker pull ubuntu:20.04

latest: Pulling from library/ubuntu
7b1a6ab2e44d: Pull complete
Digest: sha256:626ffe58f6e7566e00254b638eb7e0f3b11d4da9675088f4781a50ae288f3322
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest

4.2 列出镜像

# 列出所有本地镜像
docker images

REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 7e0aa2d69a15 2 weeks ago 72.9MB
hello-world latest bf756fb1ae65 5 months ago 13.3kB

4.3 删除镜像

# 通过镜像ID删除镜像
docker rmi 7e0aa2d69a15

# 通过镜像名称删除镜像
docker rmi ubuntu:latest

4.4 构建镜像

可以通过Dockerfile来构建自定义镜像。创建一个Dockerfile文件:

# 使用Ubuntu 20.04作为基础镜像
FROM ubuntu:20.04

# 维护者信息
MAINTAINER fengge

# 更新软件包并安装nginx
RUN apt-get update && apt-get install -y nginx

# 复制自定义配置文件
COPY nginx.conf /etc/nginx/nginx.conf

# 暴露80端口
EXPOSE 80

# 启动nginx服务
CMD [“nginx”, “-g”, “daemon off;”]
# 构建镜像
docker build -t my-nginx:latest .

Sending build context to Docker daemon 2.048kB
Step 1/6 : FROM ubuntu:20.04
—> 7e0aa2d69a15
Step 2/6 : MAINTAINER fengge
—> Running in 3a3b6f4c5d7e
Removing intermediate container 3a3b6f4c5d7e
—> 8f9e7d6c5b4a
Step 3/6 : RUN apt-get update && apt-get install -y nginx
—> Running in 9c8b7a6d5e4f

Step 6/6 : CMD [“nginx”, “-g”, “daemon off;”]
—> Running in 5d4c3b2a1f7e
Removing intermediate container 5d4c3b2a1f7e
—> 1a2b3c4d5e6f
Successfully built 1a2b3c4d5e6f
Successfully tagged my-nginx:latest

5. Docker容器操作

5.1 创建并运行容器

# 运行一个交互式容器
docker run -it ubuntu:latest bash

# 运行一个后台容器并映射端口
docker run -d -p 80:80 –name nginx-container nginx:latest

# 运行一个带环境变量的容器
docker run -d -e MYSQL_ROOT_PASSWORD=123456 –name mysql-container mysql:latest

# 运行交互式容器的输出
root@container-id:/#

# 运行后台容器的输出
1a2b3c4d5e6f7g8h9i0j

5.2 列出容器

# 列出运行中的容器
docker ps

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

# 列出运行中的容器输出
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1a2b3c4d5e6f nginx:latest “nginx -g ‘daemon of…” 2 minutes ago Up 2 minutes 0.0.0.0:80->80/tcp nginx-container

# 列出所有容器输出
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1a2b3c4d5e6f nginx:latest “nginx -g ‘daemon of…” 2 minutes ago Up 2 minutes 0.0.0.0:80->80/tcp nginx-container
9i8h7g6f5e4d ubuntu:latest “bash” 10 minutes ago Exited (0) 5 minutes ago ubuntu-container

5.3 停止和启动容器

# 停止容器
docker stop nginx-container

# 启动容器
docker start nginx-container

# 重启容器
docker restart nginx-container

5.4 进入容器

# 使用docker exec进入容器
docker exec -it nginx-container bash

root@nginx-container:/#

5.5 删除容器

# 删除停止的容器
docker rm ubuntu-container

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

6. Docker网络配置

6.1 Docker网络类型

Docker提供了多种网络类型,包括:

  • bridge:默认网络类型,容器通过网桥连接到主机网络
  • host:容器直接使用主机网络,没有网络隔离
  • none:容器没有网络连接
  • overlay:用于Docker Swarm集群的网络类型
  • macvlan:为容器分配MAC地址,使其看起来像物理设备

6.2 创建自定义网络

# 创建一个自定义网络
docker network create –driver bridge my-network

# 列出所有网络
docker network ls

NETWORK ID NAME DRIVER SCOPE
1a2b3c4d5e6f bridge bridge local
2b3c4d5e6f7g host host local
3c4d5e6f7g8h my-network bridge local
4d5e6f7g8h9i none null local

6.3 使用自定义网络

# 在自定义网络中运行容器
docker run -d –name container1 –network my-network nginx:latest
docker run -d –name container2 –network my-network nginx:latest

7. Docker存储管理

7.1 数据卷

数据卷是Docker中用于持久化数据的机制,它可以在容器之间共享数据,并且数据不会随着容器的删除而丢失。

# 创建数据卷
docker volume create my-volume

# 列出数据卷
docker volume ls

# 查看数据卷详情
docker volume inspect my-volume

# 列出数据卷输出
DRIVER VOLUME NAME
local my-volume

# 查看数据卷详情输出
[
{
“CreatedAt”: “2026-04-03T10:00:00Z”,
“Driver”: “local”,
“Labels”: {},
“Mountpoint”: “/var/lib/docker/volumes/my-volume/_data”,
“Name”: “my-volume”,
“Options”: {},
“Scope”: “local”
}
]

7.2 使用数据卷

# 运行容器并挂载数据卷
docker run -d -v my-volume:/app –name app-container nginx:latest

7.3 绑定挂载

绑定挂载是将主机上的目录或文件挂载到容器中,适用于开发环境。

# 运行容器并绑定挂载主机目录
docker run -d -v /host/path:/container/path –name dev-container nginx:latest

8. Docker Compose使用

Docker Compose是一个用于定义和运行多容器Docker应用程序的工具,它使用YAML文件来配置应用程序的服务、网络和存储。

8.1 安装Docker Compose

# 下载Docker Compose
sudo curl -L “https://github.com/docker/compose/releases/download/1.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

docker-compose version 1.29.2, build 5becea4c

8.2 编写docker-compose.yml文件

version: ‘3’
services:
web:
image: nginx:latest
ports:
– “80:80”
volumes:
– ./nginx.conf:/etc/nginx/nginx.conf
networks:
– app-network
db:
image: mysql:latest
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: myapp
volumes:
– db-data:/var/lib/mysql
networks:
– app-network

networks:
app-network:
driver: bridge

volumes:
db-data:
driver: local

8.3 运行Docker Compose

# 启动服务
docker-compose up -d

# 查看服务状态
docker-compose ps

# 停止服务
docker-compose down

# 启动服务输出
Creating network “app_app-network” with driver “bridge”
Creating volume “app_db-data” with local driver
Creating app_web_1 … done
Creating app_db_1 … done

# 查看服务状态输出
Name Command State Ports
—————————————————————
app_db_1 docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcp
app_web_1 nginx -g daemon off; Up 0.0.0.0:80->80/tcp

9. Docker Swarm集群

Docker Swarm是Docker的原生集群管理工具,它允许将多个Docker主机组成一个集群,实现容器的编排和管理。

9.1 初始化Swarm集群

# 在管理节点上初始化Swarm
docker swarm init –advertise-addr 192.168.1.100

Swarm initialized: current node (1a2b3c4d5e6f) is now a manager.

To add a worker to this swarm, run the following command:

docker swarm join –token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c 192.168.1.100:2377

To add a manager to this swarm, run ‘docker swarm join-token manager’ and follow the instructions.

9.2 添加节点到Swarm集群

# 在工作节点上运行加入命令
docker swarm join –token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c 192.168.1.100:2377

This node joined a swarm as a worker.

9.3 部署服务到Swarm集群

# 部署一个服务
docker service create –name nginx-service –replicas 3 -p 80:80 nginx:latest

# 查看服务状态
docker service ls

# 查看服务详情
docker service ps nginx-service

# 查看服务状态输出
ID NAME MODE REPLICAS IMAGE PORTS
1a2b3c4d5e6f nginx-service replicated 3/3 nginx:latest *:80->80/tcp

# 查看服务详情输出
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
2b3c4d5e6f7g nginx-service.1 nginx:latest node1 Running Running 2 minutes ago
3c4d5e6f7g8h nginx-service.2 nginx:latest node2 Running Running 2 minutes ago
4d5e6f7g8h9i nginx-service.3 nginx:latest node3 Running Running 2 minutes ago

10. 生产环境最佳实践

10.1 镜像管理

  • 使用官方镜像:优先使用Docker Hub上的官方镜像,确保安全性和稳定性
  • 使用固定版本标签:避免使用latest标签,使用具体的版本号,确保环境一致性
  • 最小化镜像大小:使用Alpine等轻量级基础镜像,减少镜像体积
  • 定期更新镜像:及时更新镜像以修复安全漏洞

10.2 容器管理

  • 设置资源限制:为容器设置CPU和内存限制,避免资源争用
  • 使用健康检查:配置健康检查,确保容器正常运行
  • 使用命名卷:使用命名卷持久化数据,避免数据丢失
  • 限制容器权限:使用非root用户运行容器,减少安全风险

10.3 网络配置

  • 使用自定义网络:为不同的应用创建独立的网络,增强网络隔离
  • 使用网络策略:在Swarm集群中使用网络策略,控制容器间的通信
  • 使用HTTPS:为容器服务配置HTTPS,确保数据传输安全

10.4 安全管理

  • 扫描镜像:使用工具扫描镜像中的安全漏洞
  • 使用 secrets:在Swarm集群中使用secrets管理敏感信息
  • 限制容器能力:使用–cap-drop和–cap-add参数限制容器的系统调用能力
  • 定期审计:定期审计容器和镜像,确保符合安全要求

学习交流加群风哥微信: itpux-com

11. 常见问题与解决方案

11.1 容器无法启动

问题:容器启动后立即退出

解决方案:检查容器的日志,查看退出原因

# 查看容器日志
docker logs container-name

11.2 网络连接问题

问题:容器之间无法通信

解决方案:确保容器在同一个网络中,检查网络配置

# 查看容器的网络配置
docker inspect container-name | grep -A 20 “NetworkMode”

11.3 存储问题

问题:数据卷挂载失败

解决方案:检查主机目录权限,确保容器有足够的权限访问挂载目录

# 检查数据卷状态
docker volume inspect volume-name

11.4 性能问题

问题:容器运行缓慢

解决方案:检查容器的资源使用情况,调整资源限制

# 查看容器的资源使用情况
docker stats container-name

更多学习教程www.fgedu.net.cn

学习交流加群风哥QQ113257174

更多学习教程公众号风哥教程itpux_com

author:www.itpux.com

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息