1. Docker实验环境搭建与基础操作
在容器化技术日益普及的今天,Docker已经成为开发者必备的技能之一。作为第二次Docker实验,我们将深入探索容器技术的核心概念和实用技巧。不同于初次接触时的简单安装,本次实验将带您从零开始构建完整的Docker开发环境,并掌握日常工作中最常用的容器操作命令。
首先需要准备一台运行Linux的机器(物理机或虚拟机均可),推荐使用Ubuntu 20.04 LTS或更新版本。如果使用Windows系统,建议安装WSL2作为底层支持。内存建议至少4GB,硬盘空间20GB以上,这对运行多个容器来说已经足够。
注意:生产环境中的Docker主机配置要求会更高,具体取决于应用负载,但实验环境这些配置已经足够
安装Docker引擎的步骤如下:
- 更新系统软件包索引:
bash复制sudo apt-get update
- 安装必要的依赖包:
bash复制sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
- 添加Docker官方GPG密钥:
bash复制curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
- 设置稳定版仓库:
bash复制echo \
"deb [arch=amd64 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
- 安装Docker引擎:
bash复制sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
安装完成后,可以通过以下命令验证Docker是否正常运行:
bash复制sudo docker run hello-world
这个命令会下载一个测试镜像并在容器中运行,如果看到"Hello from Docker!"的消息,说明安装成功。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Docker镜像管理与定制
2.1 镜像基础操作
Docker镜像是容器运行的基础,理解镜像管理是掌握Docker的关键。以下是日常工作中最常用的镜像操作命令:
查看本地镜像列表:
bash复制docker images
搜索Docker Hub上的镜像:
bash复制docker search nginx
拉取远程镜像到本地:
bash复制docker pull nginx:latest
删除本地镜像:
bash复制docker rmi nginx
查看镜像详细信息:
bash复制docker inspect nginx
2.2 构建自定义镜像
虽然Docker Hub提供了大量现成镜像,但在实际项目中,我们通常需要构建自己的镜像。Dockerfile是定义镜像构建过程的文本文件,下面是一个典型的Dockerfile示例:
dockerfile复制# 基于官方Python镜像
FROM python:3.9-slim
# 设置工作目录
WORKDIR /app
# 复制当前目录内容到容器中的/app目录
COPY . /app
# 安装项目依赖
RUN pip install --no-cache-dir -r requirements.txt
# 暴露端口
EXPOSE 80
# 定义环境变量
ENV NAME World
# 容器启动时运行的命令
CMD ["python", "app.py"]
构建镜像的命令:
bash复制docker build -t my-python-app .
提示:构建镜像时,Docker会缓存每一层的结果。合理排序Dockerfile中的指令可以显著提高构建速度,例如将不常变化的操作放在前面
2.3 镜像优化技巧
随着项目复杂度增加,镜像体积可能会变得很大。以下是几个优化建议:
- 使用多阶段构建:在最终镜像中只包含运行时必要的文件
dockerfile复制# 构建阶段
FROM golang:1.16 AS builder
WORKDIR /go/src/app
COPY . .
RUN go build -o myapp
# 运行阶段
FROM alpine:latest
WORKDIR /root/
COPY --from=builder /go/src/app/myapp .
CMD ["./myapp"]
-
选择合适的基础镜像:对于生产环境,通常推荐使用alpine或distroless等轻量级镜像
-
合并RUN指令:减少镜像层数
dockerfile复制RUN apt-get update && \
apt-get install -y \
package1 \
package2 && \
rm -rf /var/lib/apt/lists/*
3. 容器生命周期管理
3.1 容器基本操作
启动一个新容器:
bash复制docker run -d -p 8080:80 --name my-nginx nginx
查看运行中的容器:
bash复制docker ps
查看所有容器(包括已停止的):
bash复制docker ps -a
停止运行中的容器:
bash复制docker stop my-nginx
启动已停止的容器:
bash复制docker start my-nginx
删除容器:
bash复制docker rm my-nginx
3.2 容器交互与调试
进入运行中的容器:
bash复制docker exec -it my-nginx /bin/bash
查看容器日志:
bash复制docker logs my-nginx
查看容器资源使用情况:
bash复制docker stats
复制文件到容器:
bash复制docker cp localfile.txt my-nginx:/path/in/container
从容器复制文件:
bash复制docker cp my-nginx:/path/in/container/file.txt localfile.txt
3.3 容器网络配置
Docker提供了多种网络模式,默认创建的是bridge网络。查看网络列表:
bash复制docker network ls
创建自定义网络:
bash复制docker network create my-network
将容器连接到特定网络:
bash复制docker run -d --network=my-network --name container1 nginx
docker run -d --network=my-network --name container2 nginx
此时container1和container2可以通过容器名直接互相访问,而不需要知道IP地址。
4. 数据持久化与容器编排
4.1 数据卷管理
容器本身是临时的,为了持久化数据,我们需要使用数据卷。创建和管理数据卷的基本命令:
创建数据卷:
bash复制docker volume create my-vol
查看数据卷列表:
bash复制docker volume ls
使用数据卷启动容器:
bash复制docker run -d \
--name my-nginx \
-v my-vol:/usr/share/nginx/html \
nginx
删除数据卷:
bash复制docker volume rm my-vol
4.2 绑定挂载
除了使用数据卷,还可以直接将主机目录挂载到容器中:
bash复制docker run -d \
--name my-nginx \
-v /path/on/host:/usr/share/nginx/html \
nginx
这种方式适合开发环境,可以实时看到代码变更的效果。
4.3 Docker Compose基础
对于复杂的多容器应用,使用Docker Compose可以简化管理。一个典型的docker-compose.yml文件如下:
yaml复制version: '3'
services:
web:
image: nginx
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- db
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:
启动服务:
bash复制docker-compose up -d
停止服务:
bash复制docker-compose down
4.4 容器资源限制
在生产环境中,合理限制容器资源使用非常重要。以下是一些常用参数:
限制内存使用:
bash复制docker run -d --memory=512m --memory-swap=1g nginx
限制CPU使用:
bash复制docker run -d --cpus=1.5 nginx
限制CPU优先级:
bash复制docker run -d --cpu-shares=512 nginx
在实际操作中,我发现很多初学者容易忽视资源限制,导致单个容器占用过多资源影响整个主机。建议从一开始就养成设置合理限制的习惯,即使是在开发环境中。
