1. Docker与Ubuntu22.04部署概述
在当今的开发和运维环境中,容器化技术已经成为不可或缺的一部分。Docker作为最流行的容器平台之一,能够帮助我们快速部署和运行各种应用环境。而Ubuntu 22.04 LTS(Jammy Jellyfish)作为最新的长期支持版本,提供了稳定的基础系统环境。将两者结合使用,可以为我们提供一个轻量级、可移植且一致的开发或生产环境。
与传统的虚拟机相比,Docker容器更加轻量,启动速度更快,资源占用更少。通过Docker部署Ubuntu 22.04,我们可以在几秒钟内获得一个干净的Ubuntu系统环境,而不需要像传统方式那样进行完整的系统安装。这对于需要频繁创建和销毁测试环境的开发者来说尤其有价值。
2. 环境准备与Docker安装
2.1 系统要求检查
在开始之前,我们需要确保主机系统满足运行Docker的基本要求:
- 64位操作系统(x86_64或arm64架构)
- Linux内核版本3.10或更高(推荐4.x或更高)
- 对于Windows和macOS用户,需要安装Docker Desktop
可以通过以下命令检查Linux内核版本:
uname -r2.2 Docker引擎安装
对于Ubuntu/Debian系统,官方推荐的安装方式如下:
- 首先更新软件包索引:
sudo apt-get update- 安装必要的依赖包:
sudo apt-get install \ ca-certificates \ curl \ gnupg \ lsb-release- 添加Docker官方GPG密钥:
sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg- 设置稳定版仓库:
echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null- 安装Docker引擎:
sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin- 验证安装是否成功:
sudo docker run hello-world如果看到"Hello from Docker!"的消息,说明安装成功。
注意:在生产环境中,建议将用户添加到docker组以避免每次都需要sudo,但要注意这会有安全风险:
sudo usermod -aG docker $USER
3. 获取Ubuntu 22.04 Docker镜像
3.1 官方镜像介绍
Docker Hub上提供了官方维护的Ubuntu镜像,这些镜像经过优化,体积较小且安全可靠。Ubuntu 22.04的官方镜像标签为ubuntu:22.04或ubuntu:jammy。
3.2 拉取Ubuntu 22.04镜像
使用以下命令拉取最新的Ubuntu 22.04镜像:
docker pull ubuntu:22.04拉取完成后,可以使用以下命令查看已下载的镜像:
docker images输出应该类似于:
REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu 22.04 a8780b506fa4 2 weeks ago 77.8MB可以看到,官方Ubuntu 22.04镜像非常精简,只有约78MB大小。
3.3 验证镜像完整性
为了确保下载的镜像没有被篡改,可以验证其签名:
docker trust inspect --pretty ubuntu:22.04输出中应该显示"Signatures for"部分,确认镜像已经过官方签名。
4. 运行Ubuntu 22.04容器
4.1 基本运行方式
最简单的运行命令是:
docker run -it ubuntu:22.04这将以交互模式(-i)启动容器,并分配一个伪终端(-t)。你会看到root用户的提示符,表示已经进入了容器内部。
4.2 常用运行参数
在实际使用中,我们通常会添加一些参数来增强容器的功能:
- 后台运行容器:
docker run -d --name my_ubuntu ubuntu:22.04 sleep infinity- 映射主机端口到容器:
docker run -p 8080:80 ubuntu:22.04- 挂载主机目录到容器:
docker run -v /host/path:/container/path ubuntu:22.04- 设置环境变量:
docker run -e MY_VAR=value ubuntu:22.04- 限制资源使用:
docker run --memory=512m --cpus=1 ubuntu:22.044.3 容器管理命令
掌握基本的容器管理命令对于日常使用非常重要:
- 查看运行中的容器:
docker ps - 查看所有容器(包括停止的):
docker ps -a - 停止容器:
docker stop <container_id> - 启动已停止的容器:
docker start <container_id> - 进入运行中的容器:
docker exec -it <container_id> bash - 删除容器:
docker rm <container_id> - 删除镜像:
docker rmi <image_id>
5. 自定义Ubuntu 22.04容器
5.1 基础系统配置
默认的Ubuntu 22.04镜像非常精简,很多常用工具都没有安装。我们可以先进行基础配置:
- 更新软件包列表:
apt-get update- 安装常用工具:
apt-get install -y \ curl \ wget \ vim \ git \ net-tools \ iputils-ping \ dnsutils- 设置时区(可选):
ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime DEBIAN_FRONTEND=noninteractive apt-get install -y tzdata5.2 创建自定义镜像
为了复用这些配置,我们可以基于修改后的容器创建新的镜像:
- 首先在修改后的容器中退出(但不要停止容器)
- 使用commit命令创建新镜像:
docker commit <container_id> my-ubuntu:22.04更好的方式是使用Dockerfile来自动化这个过程:
FROM ubuntu:22.04 RUN apt-get update && \ apt-get install -y \ curl \ wget \ vim \ git \ net-tools \ iputils-ping \ dnsutils && \ rm -rf /var/lib/apt/lists/* RUN ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ DEBIAN_FRONTEND=noninteractive apt-get install -y tzdata CMD ["bash"]然后构建镜像:
docker build -t my-ubuntu:22.04 .5.3 优化镜像大小
为了保持镜像精简,有几个最佳实践:
- 合并RUN命令减少镜像层
- 清理apt缓存:
rm -rf /var/lib/apt/lists/* - 使用多阶段构建(对于需要编译的环境)
- 选择更小的基础镜像(如ubuntu:22.04比ubuntu:latest更明确)
6. 常见问题与解决方案
6.1 容器内systemd服务无法启动
Ubuntu 22.04默认使用systemd,但在Docker容器中直接运行systemd会遇到问题。解决方案:
- 运行容器时添加特权模式:
docker run --privileged -it ubuntu:22.04- 或者在Dockerfile中使用init系统替代:
RUN apt-get install -y dumb-init ENTRYPOINT ["/usr/bin/dumb-init", "--"]6.2 时区设置问题
容器内的时区默认是UTC,要设置为本地时区:
ENV TZ=Asia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone6.3 中文支持
如果需要中文支持:
RUN apt-get install -y locales && \ locale-gen zh_CN.UTF-8 && \ update-locale LANG=zh_CN.UTF-8 ENV LANG zh_CN.UTF-8 ENV LANGUAGE zh_CN:zh ENV LC_ALL zh_CN.UTF-86.4 容器网络配置
查看容器网络信息:
docker inspect <container_id> | grep IPAddress连接容器网络:
docker network create my_network docker run --network=my_network ubuntu:22.047. 高级部署场景
7.1 使用Docker Compose编排
对于复杂应用,可以使用docker-compose.yml文件定义服务:
version: '3' services: ubuntu_service: image: ubuntu:22.04 container_name: my_ubuntu volumes: - ./data:/data ports: - "8000:80" environment: - TZ=Asia/Shanghai restart: unless-stopped然后运行:
docker-compose up -d7.2 持久化数据管理
Docker容器默认是临时的,要持久化数据可以使用:
- 绑定挂载(Bind Mounts):
docker run -v /host/path:/container/path ubuntu:22.04- 卷(Volumes):
docker volume create my_volume docker run -v my_volume:/container/path ubuntu:22.047.3 容器资源限制
在生产环境中,限制容器资源使用非常重要:
docker run \ --memory=512m \ --cpus=1 \ --cpu-shares=512 \ --blkio-weight=500 \ ubuntu:22.047.4 容器监控与日志
查看容器日志:
docker logs <container_id>监控容器资源使用:
docker stats使用cAdvisor进行高级监控:
docker run \ --volume=/:/rootfs:ro \ --volume=/var/run:/var/run:ro \ --volume=/sys:/sys:ro \ --volume=/var/lib/docker/:/var/lib/docker:ro \ --publish=8080:8080 \ --detach=true \ --name=cadvisor \ google/cadvisor:latest8. 安全最佳实践
8.1 非root用户运行
默认情况下,容器以root用户运行,这有安全风险。更好的做法:
- 在Dockerfile中创建用户:
RUN useradd -ms /bin/bash appuser USER appuser- 或者运行时指定用户:
docker run -u 1000 ubuntu:22.048.2 只读文件系统
对于不需要写入的容器,可以设置为只读:
docker run --read-only ubuntu:22.04对于需要写入的特定目录,可以单独挂载:
docker run --read-only -v /path/to/writable:/data ubuntu:22.048.3 安全扫描
定期扫描镜像中的漏洞:
docker scan ubuntu:22.048.4 网络隔离
限制容器的网络访问:
docker network create --internal isolated_network docker run --network=isolated_network ubuntu:22.049. 性能优化技巧
9.1 镜像构建优化
- 利用构建缓存:将不经常变化的指令放在Dockerfile前面
- 使用.dockerignore文件排除不必要的文件
- 多阶段构建减少最终镜像大小
9.2 容器运行时优化
- 限制资源使用(如前所述)
- 使用--tmpfs挂载临时文件系统:
docker run --tmpfs /tmp ubuntu:22.04- 调整swappiness:
docker run --memory-swappiness=0 ubuntu:22.049.3 存储驱动选择
根据主机环境选择合适的存储驱动(overlay2, aufs, devicemapper等),可以通过以下命令查看当前驱动:
docker info | grep "Storage Driver"10. 实际应用案例
10.1 开发环境容器化
创建一个Python开发环境:
FROM ubuntu:22.04 RUN apt-get update && \ apt-get install -y python3 python3-pip && \ rm -rf /var/lib/apt/lists/* WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt CMD ["python3"]10.2 数据库服务部署
部署MySQL服务:
docker run -d \ --name mysql_server \ -e MYSQL_ROOT_PASSWORD=mysecretpassword \ -e MYSQL_DATABASE=myapp \ -e MYSQL_USER=user \ -e MYSQL_PASSWORD=password \ -v mysql_data:/var/lib/mysql \ -p 3306:3306 \ ubuntu:22.04 \ sh -c "apt-get update && apt-get install -y mysql-server && service mysql start && tail -f /dev/null"10.3 Web服务部署
部署Nginx web服务器:
FROM ubuntu:22.04 RUN apt-get update && \ apt-get install -y nginx && \ rm -rf /var/lib/apt/lists/* && \ echo "daemon off;" >> /etc/nginx/nginx.conf EXPOSE 80 CMD ["nginx"]构建并运行:
docker build -t my-nginx . docker run -d -p 8080:80 my-nginx