xref: /spdk/doc/containers.md (revision b30d57cdad6d2bc75cc1e4e2ebbcebcb0d98dcfa)
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