Environment Configuration
This guide covers the complete setup for running GPU-accelerated Docker containers on CentOS 7 using Nvidia drivers and CUDA.
System Specifications:
- Operating System: CentOS 7.4 (1708)
- GPU: Nvidia GeForce GTX 1080 Ti
Required Components
- Docker CE repository
- Nvidia Docker repository
- CUDA package repository
- cuDNN library (requires Nvidia developer account)
- Nvidia driver matching GPU model
- CUDA Docker image from Docker Hub
File Structure
/root/nvidia/
├── centos-gpu/
│ └── Dockerfile
├── cuda-repo-rhel7-9.1.85-1.x86_64.rpm
├── cudnn-9.0-linux-x64-v7.tgz
├── docker-ce.repo
├── nvidia-docker.repo
└── NVIDIA-Linux-x86_64-390.25.run
Preparation Steps
Copy repository files to the system:
cp docker-ce.repo nvidia-docker.repo /etc/yum.repos.d/
rpm -ivh cuda-repo-rhel7-9.1.85-1.x86_64.rpm
yum install epel-release
gcc gcc-c++
yum install kernel*
Driver Installation
Disable the open-source Nouveau driver and install the Nvidia driver:
echo "blacklist nouveau" >>/etc/modprobe.d/blacklist.conf
mv /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.bak
dracut -v /boot/initramfs-$(uname -r).img $(uname -r)
init 3
chmod +x NVIDIA-Linux-x86_64-390.25.run
./NVIDIA-Linux-x86_64-390.25.run
Switch to runlevel 3 (multi-user text mode) before driver installation.
Docker Installasion
yum install docker-ce nvidia-docker
systemctl enable docker
systemctl start docker
systemctl enable nvidia-docker
systemctl start nvidia-docker
The Nvidia driver must be installed before starting nvidia-docker.
Custom Docker Image
Create a Dockerfile in the centos-gpu directory:
FROM centos:7
LABEL maintainer "NVIDIA CORPORATION <cudatools@nvidia.com>"
RUN NVIDIA_GPGKEY_SUM=d1be581509378368edeec8c1eb2958702feedf3bc3d17011adbf24efacce4ab5 && \
curl -fsSL https://developer.download.nvidia.com/compute/cuda/repos/rhel7/x86_64/7fa2af80.pub | sed '/^Version/d' > /etc/pki/rpm-gpg/RPM-GPG-KEY-NVIDIA && \
echo "$NVIDIA_GPGKEY_SUM /etc/pki/rpm-gpg/RPM-GPG-KEY-NVIDIA" | sha256sum -c --strict -
ENV CUDA_VERSION 9.0.176
ENV CUDA_PKG_VERSION 9-0-$CUDA_VERSION-1
LABEL com.nvidia.volumes.needed="nvidia_driver"
LABEL com.nvidia.cuda.version="${CUDA_VERSION}"
RUN echo "/usr/local/nvidia/lib" >> /etc/ld.so.conf.d/nvidia.conf && \
echo "/usr/local/nvidia/lib64" >> /etc/ld.so.conf.d/nvidia.conf
ENV PATH /usr/local/nvidia/bin:/usr/local/cuda/bin:${PATH}
ENV LD_LIBRARY_PATH /usr/local/nvidia/lib:/usr/local/nvidia/lib64
ENV NVIDIA_VISIBLE_DEVICES all
ENV NVIDIA_DRIVER_CAPABILITIES compute,utility
ENV NVIDIA_REQUIRE_CUDA "cuda>=9.0"
Build the image:
yum install cuda-cudart-9-0-9.0.176-1
ln -s cuda-9.0 /usr/local/cuda
nvidia-docker build -t centos-nvidia /root/nvidia/centos-gpu
Verify the image:
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos-nvidia latest a02c8e0ad5ca 2 hours ago 207MB
Running GPU Containers
Launch a container with GPU access:
nvidia-docker run --name="centos-gpu-container" -ti centos-nvidia /bin/bash
Verify GPU visibility inside the container:
nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 390.25 Driver Version: 390.25 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GeForce GTX 108... Off | 00000000:02:00.0 Off | N/A |
| 23% 17C P8 8W / 250W | 10MiB / 11178MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
Container Management
List all containers:
nvidia-docker ps -a
Start an existing container:
nvidia-docker start <container_id>
Copy files into container:
nvidia-docker cp /path/to/file <container_id>:/destination/
Execute commands in running container:
nvidia-docker exec -ti <container_id> /bin/bash
cuDNN Setup
Inside the container, install cuDNN:
# Copy cuDNN archive into container
nvidia-docker cp cudnn-9.0-linux-x64-v7.tgz <container_id>:/root/
# Inside container
cd /root
tar -xzvf cudnn-9.0-linux-x64-v7.tgz
# Add library paths
cp cuda/lib64/* /usr/local/nvidia/lib64/
cp cuda/include/* /usr/local/nvidia/include/
ldconfig
Pre-built Images
Alternative pre-built CUDA images are available:
docker pull nvidia/cuda
Available tags include various CUDA versions and base OS options (ubuntu, centos, debian).
For TensorFlow with GPU support:
docker pull tensorflow/tensorflow:latest-gpu