1# SPDK and Containers {#containers} 2 3This is a living document as there are many ways to use containers with 4SPDK. As new usages are identified and tested, they will be documented 5here. 6 7# In this document {#containers_toc} 8 9* @ref kata_containers_with_spdk_vhost 10* @ref spdk_in_docker 11 12# Using SPDK vhost target to provide volume service to Kata Containers and Docker {#kata_containers_with_spdk_vhost} 13 14[Kata Containers](https://katacontainers.io) can build a secure container 15runtime with lightweight virtual machines that feel and perform like 16containers, but provide stronger workload isolation using hardware 17virtualization technology as a second layer of defense. 18 19From Kata Containers [1.11.0](https://github.com/kata-containers/runtime/releases/tag/1.11.0), 20vhost-user-blk support is enabled in `kata-containers/runtime`. That is to say 21SPDK vhost target can be used to provide volume service to Kata Containers directly. 22In addition, a container manager like Docker, can be configured easily to launch 23a Kata container with an SPDK vhost-user block device. For operating details, visit 24Kata containers use-case [Setup to run SPDK vhost-user devices with Kata Containers and Docker](https://github.com/kata-containers/documentation/blob/master/use-cases/using-SPDK-vhostuser-and-kata.md#host-setup-for-vhost-user-devices) 25 26# Containerizing an SPDK Application for Docker {#spdk_in_docker} 27 28There are no SPDK specific changes needed to run an SPDK based application in 29a docker container, however this quick start guide should help you as you 30containerize your SPDK based application. 31 321. Make sure you have all of your app dependencies identified and included in your Dockerfile 332. Make sure you have compiled your application for the target arch 343. Make sure your host has hugepages enabled 354. Make sure your host has bound your nvme device to your userspace driver 365. Write your Dockerfile. The following is a simple Dockerfile to containerize the nvme `hello_world` 37 example: 38 39~~~{.sh} 40# start with the latest Fedora 41FROM fedora 42 43# if you are behind a proxy, set that up now 44ADD dnf.conf /etc/dnf/dnf.conf 45 46# these are the min dependencies for the hello_world app 47RUN dnf install libaio-devel -y 48RUN dnf install numactl-devel -y 49 50# set our working dir 51WORKDIR /app 52 53# add the hello_world binary 54ADD hello_world hello_world 55 56# run the app 57CMD ./hello_world 58~~~ 59 606. Create your image 61 62`sudo docker image build -t hello:1.0 .` 63 647. You docker command line will need to include at least the following: 65- the `--privileged` flag to enable sharing of hugepages 66- use of the `-v` switch to map hugepages 67 68`sudo docker run --privileged -v /dev/hugepages:/dev/hugepages hello:1.0` 69 70or depending on the needs of your app you may need one or more of the following parameters: 71 72- If you are using the SPDK app framework: `-v /dev/shm:/dev/shm` 73- If you need to use RPCs from outside of the container: `-v /var/tmp:/var/tmp` 74- If you need to use the host network (i.e. NVMF target application): `--network host` 75 76Your output should look something like this: 77 78~~~{.sh} 79$ sudo docker run --privileged -v //dev//hugepages://dev//hugepages hello:1.0 80Starting SPDK v20.01-pre git sha1 80da95481 // DPDK 19.11.0 initialization... 81[ DPDK EAL parameters: hello_world -c 0x1 --log-level=lib.eal:6 --log-level=lib.cryptodev:5 --log-level=user1:6 --iova-mode=pa --base-virtaddr=0x200000000000 --match-allocations --file-prefix=spdk0 --proc-type=auto ] 82EAL: No available hugepages reported in hugepages-1048576kB 83Initializing NVMe Controllers 84Attaching to 0000:06:00.0 85Attached to 0000:06:00.0 86Using controller INTEL SSDPEDMD400G4 (CVFT7203005M400LGN ) with 1 namespaces. 87 Namespace ID: 1 size: 400GB 88Initialization complete. 89INFO: using host memory buffer for IO 90Hello world! 91~~~ 92