diff options
| author | Bruce Ashfield <bruce.ashfield@gmail.com> | 2024-10-29 15:19:54 +0000 |
|---|---|---|
| committer | Bruce Ashfield <bruce.ashfield@gmail.com> | 2024-11-15 19:50:00 +0000 |
| commit | eb5c2bc4a5b48adf11a8fb3ae5cf63e65bde2f4a (patch) | |
| tree | cb15787888d7c181e83bf55b56028edbdfff7e6a | |
| parent | 1a87aca209b614d865246acb7701175e19866b5a (diff) | |
| download | meta-virtualization-eb5c2bc4a5b48adf11a8fb3ae5cf63e65bde2f4a.tar.gz | |
documentation: add README.md for available container image types
Signed-off-by: Bruce Ashfield <bruce.ashfield@gmail.com>
| -rw-r--r-- | recipes-extended/images/README.md | 287 |
1 files changed, 287 insertions, 0 deletions
diff --git a/recipes-extended/images/README.md b/recipes-extended/images/README.md new file mode 100644 index 00000000..f087076a --- /dev/null +++ b/recipes-extended/images/README.md | |||
| @@ -0,0 +1,287 @@ | |||
| 1 | This README describes the contents of the reference images in | ||
| 2 | this directory, as well as some testing and usability tips. | ||
| 3 | |||
| 4 | container-image-host | ||
| 5 | -------------------- | ||
| 6 | |||
| 7 | As described in the recipe, this is a flexible image definition that | ||
| 8 | is suitable for building a container host image for a target. | ||
| 9 | |||
| 10 | The configuration options for the image are best found in the recipe | ||
| 11 | itself, so the information will not be duplicated here. The type of | ||
| 12 | container host that will be created is controlled by the CONTAINER_PROFILE | ||
| 13 | variable: | ||
| 14 | |||
| 15 | i.e. in your local.conf: CONTAINER_PROFILE="docker" | ||
| 16 | |||
| 17 | The valid settings for this variable can be found in the image recipe. | ||
| 18 | |||
| 19 | The recipe checks for mandatory distro features, recommends others | ||
| 20 | and provides a list of optional distro features for some workloads. | ||
| 21 | |||
| 22 | This image also builds using virt-unique-hostname, which ensures that | ||
| 23 | there is some randomization as hostname is often used to identify | ||
| 24 | hosts when clustered (i.e. k3s). | ||
| 25 | |||
| 26 | To have enough disk space for container images, it is configured | ||
| 27 | with extra space. Depending on your use case, you can add (or remove) | ||
| 28 | space as appropriate. | ||
| 29 | |||
| 30 | Also note that more memory than the default is often required. | ||
| 31 | |||
| 32 | An example execution of the image is: | ||
| 33 | |||
| 34 | % runqemu qemuarm64 nographic slirp qemuparams="-m 2048" tmp/deploy/images/qemuarm64/container-image-host-qemuarm64.rootfs.ext4 | ||
| 35 | |||
| 36 | ssh is enabled in this image by default, so the image can be accessed | ||
| 37 | via: | ||
| 38 | |||
| 39 | % ssh -p 2222 root@127.0.0.1 | ||
| 40 | |||
| 41 | After a container image has been built, it can be copied fro the | ||
| 42 | deploy directory to the registry of your choice, for example: | ||
| 43 | |||
| 44 | % cd build/tmp/deploy/images/qemuarm64 | ||
| 45 | % skopeo copy --dest-creds <username>:<creds> oci:c3-systemd-container-latest-oci:latest docker://zeddii/c3-systemd-container | ||
| 46 | |||
| 47 | Examples of pulling images to the container host for the various | ||
| 48 | runtimes follow: | ||
| 49 | |||
| 50 | % podman pull --creds <username>:<password> zeddii/container-devtools | ||
| 51 | % podman run -it docker.io/zeddii/container-devtools bash | ||
| 52 | |||
| 53 | % root@qemuarm64-54:~# docker login | ||
| 54 | # Login Succeeded | ||
| 55 | % root@qemuarm64-54:~# docker pull zeddii/container-devtools | ||
| 56 | |||
| 57 | % root@qemuarm64-54:~# docker run -it --entrypoint /bin/sh zeddii/container-base | ||
| 58 | # [ 804.133881] docker0: port 1(veth2801d6a) entered blocking state | ||
| 59 | # [ 804.134425] docker0: port 1(veth2801d6a) entered disabled state | ||
| 60 | # [ 804.135018] veth2801d6a: entered allmulticast mode | ||
| 61 | # [ 804.136101] veth2801d6a: entered promiscuous mode | ||
| 62 | # [ 806.227282] eth0: renamed from veth384b37d | ||
| 63 | # [ 806.235331] docker0: port 1(veth2801d6a) entered blocking state | ||
| 64 | # [ 806.236010] docker0: port 1(veth2801d6a) entered forwarding state | ||
| 65 | # / # ls | ||
| 66 | # bin boot dev etc home lib media mnt proc run sbin sys tmp usr var | ||
| 67 | |||
| 68 | container-base: | ||
| 69 | --------------- | ||
| 70 | |||
| 71 | Provides a minimal container image (but not absolutely smallest) that is | ||
| 72 | inherited / included by the other container images. | ||
| 73 | |||
| 74 | By default container base does not execute anything (it doesn't define | ||
| 75 | and OCI_IMAGE_ENTRYPOINT), but does provide a shell that can be used | ||
| 76 | to inspect the image. | ||
| 77 | |||
| 78 | % root@qemuarm64-54:~# docker run -it zeddii/container-base sh | ||
| 79 | [51393.764879] docker0: port 1(veth06cb397) entered blocking state | ||
| 80 | [51393.765340] docker0: port 1(veth06cb397) entered disabled state | ||
| 81 | [51393.765854] veth06cb397: entered allmulticast mode | ||
| 82 | [51393.766753] veth06cb397: entered promiscuous mode | ||
| 83 | [51396.060958] eth0: renamed from veth7e5a654 | ||
| 84 | [51396.074281] docker0: port 1(veth06cb397) entered blocking state | ||
| 85 | [51396.074786] docker0: port 1(veth06cb397) entered forwarding state | ||
| 86 | / # ls | ||
| 87 | bin boot dev etc home lib media mnt proc run sbin sys tmp usr var | ||
| 88 | / # df -kh . | ||
| 89 | Filesystem Size Used Available Use% Mounted on | ||
| 90 | overlay 37.8G 1.9G 33.8G 5% / | ||
| 91 | / # du -sh . | ||
| 92 | 2.6M . | ||
| 93 | / # | ||
| 94 | |||
| 95 | % root@qemuarm64-54:~# ctr images pull --user <user>:<password> docker.io/zeddii/container-base:latest | ||
| 96 | docker.io/zeddii/container base:latest saved | ||
| 97 | └──manifest (45395e734a93) complete |++++++++++++++++++++++++++++++++++++++| | ||
| 98 | ├──layer (1fd5069cdbad) waiting |--------------------------------------| | ||
| 99 | └──config (24b67db5b19e) waiting |--------------------------------------| | ||
| 100 | application/vnd.oci.image.manifest.v1+json sha256:45395e734a931468f5329d20d20babf13fbabbcd993e27b0e5c4198d09130966 | ||
| 101 | Pulling from OCI Registry (docker.io/zeddii/container-base:latest) elapsed: 3.7 s total: 463.0 (123.0 B/s) | ||
| 102 | |||
| 103 | % root@qemuarm64-54:~# ctr run --rm -t docker.io/zeddii/container-base:latest zedd_shell sh | ||
| 104 | / # date | ||
| 105 | Tue Oct 29 00:09:19 UTC 2024 | ||
| 106 | / # | ||
| 107 | |||
| 108 | % root@qemuarm64-54:~# nerdctl pull docker.io/zeddii/container-base:latest | ||
| 109 | docker.io/zeddii/container-base:latest: resolved |++++++++++++++++++++++++++++++++++++++| | ||
| 110 | docker.io/zeddii/container-base:latest: resolved |++++++++++++++++++++++++++++++++++++++| | ||
| 111 | manifest-sha256:45395e734a931468f5329d20d20babf13fbabbcd993e27b0e5c4198d09130966: exists |++++++++++++++++++++++++++++++++++++++| | ||
| 112 | config-sha256:24b67db5b19e0bb90291f1d5619362c7eaade7a8c65da9a32c2016394a5b57bf: exists |++++++++++++++++++++++++++++++++++++++| | ||
| 113 | elapsed: 1.2 s total: 0.0 B (0.0 B/s) | ||
| 114 | |||
| 115 | # FIXME: At the time of creating this README, bridge networking and CNI is not working. | ||
| 116 | % root@qemuarm64-54:~# nerdctl run -it --net=host docker.io/zeddii/container-base:latest sh | ||
| 117 | / # | ||
| 118 | |||
| 119 | container-devtools-base: | ||
| 120 | ------------------------- | ||
| 121 | |||
| 122 | includes container-base, and adds image features to make development | ||
| 123 | tools/headers available. | ||
| 124 | |||
| 125 | Anything added to CORE_DEV_IMAGE_EXTRA_INSTALL will be installed into | ||
| 126 | the image in it's development variant. | ||
| 127 | |||
| 128 | The container shell is changed to bash from busybox. | ||
| 129 | |||
| 130 | package-management is added to this image type, but by default there | ||
| 131 | is no package feed configured (since it must be pointed at a build) | ||
| 132 | |||
| 133 | % root@qemuarm64-54:~# docker run -it zeddii/container-devtools bash | ||
| 134 | bash-5.2# du -sh . | ||
| 135 | 399M . | ||
| 136 | bash-5.2# rpm -qa | wc -l | ||
| 137 | 308 | ||
| 138 | bash-5.2# gcc --version | ||
| 139 | gcc (GCC) 14.2.0 | ||
| 140 | Copyright (C) 2024 Free Software Foundation, Inc. | ||
| 141 | This is free software; see the source for copying conditions. There is NO | ||
| 142 | warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | ||
| 143 | |||
| 144 | container-app-base: | ||
| 145 | -------------------- | ||
| 146 | |||
| 147 | Includes container-base. | ||
| 148 | |||
| 149 | Provides an application container that installs a package (or packages) to | ||
| 150 | the container and make the specified command the OCI_IMAGE_ENTRYPOINT. | ||
| 151 | |||
| 152 | CONTAINER_APP_CMD : the binary to run via the OCI_IMAGE_ENTRYPOINT | ||
| 153 | CONATINER_APP: packages to install to the container | ||
| 154 | |||
| 155 | The default entry point is the "date" command. | ||
| 156 | |||
| 157 | % root@qemuarm64-54:~# docker run zeddii/container-app-base | ||
| 158 | Mon Oct 28 18:41:23 UTC 2024 | ||
| 159 | |||
| 160 | % root@qemuarm64-54:~# docker run --entrypoint "du" zeddii/container-app-base -sh | ||
| 161 | 2.6M . | ||
| 162 | |||
| 163 | % podman run docker.io/zeddii/container-app-base | ||
| 164 | Mon Oct 28 18:41:23 UTC 2024 | ||
| 165 | |||
| 166 | container-systemd-base: | ||
| 167 | ------------------------ | ||
| 168 | |||
| 169 | Extends container-base to create a systemd enabled container that is | ||
| 170 | an appropriate starting point if a systemd applciation is being run | ||
| 171 | or a mulit-user style environment is required. | ||
| 172 | |||
| 173 | The application specified in SYSTEMD_CONTAINER_APP will be installed | ||
| 174 | and be available to be executed. | ||
| 175 | |||
| 176 | The rootfs of this container type is post processed to enable and | ||
| 177 | disable services as specified by the containeer definition. This allows | ||
| 178 | service that are not appropriate in a containerized environemnt to | ||
| 179 | be disabled (i.e. getty login) | ||
| 180 | |||
| 181 | The list of services can be found in the recipes themselves. | ||
| 182 | |||
| 183 | This container enables ssh by default, so that it can be executed | ||
| 184 | in the background and then accessed as a full environment. | ||
| 185 | |||
| 186 | Note: this is currently a priviledged container if run under docker. | ||
| 187 | |||
| 188 | There are multiple ways to add/remove permissions from the container, | ||
| 189 | and most are configurable during launch: | ||
| 190 | |||
| 191 | % root@qemuarm64-54:~# docker run -d --rm --name systemd_test --privileged --cap-add SYS_ADMIN \ | ||
| 192 | --security-opt seccomp=unconfined --cgroup-parent=docker.slice --cgroupns private \ | ||
| 193 | --tmpfs /tmp --tmpfs /run --tmpfs /run/lock zeddii/systemd-container-base | ||
| 194 | |||
| 195 | or | ||
| 196 | |||
| 197 | % docker run -d --rm --name systemd_test --privileged --cgroup-parent=docker.slice \ | ||
| 198 | --cgroupns private zeddii/c3-systemd-container | ||
| 199 | |||
| 200 | % root@qemuarm64-54:~# docker ps | ||
| 201 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES | ||
| 202 | 4b07cc907e26 zeddii/c3-systemd-container "/sbin/init" 5 minutes ago Up 5 minutes systemd_test | ||
| 203 | |||
| 204 | % podman run -d --name systemd_test --privileged --cgroupns=host --tmpfs /tmp --tmpfs /run --tmpfs /run/lock \ | ||
| 205 | -v /sys/fs/cgroup:/sys/fs/cgroup:ro zeddii/systemd-container-base | ||
| 206 | |||
| 207 | % ctr container create --privileged --runtime="io.containerd.runc.v2" \ | ||
| 208 | --mount type=bind,src=/sys/fs/cgroup,dst=/sys/fs/cgroup,options=rbind:rw \ | ||
| 209 | docker.io/zeddii/systemd-container-base:latest my_systemd_container /sbin/init | ||
| 210 | |||
| 211 | % ctr task start --detach my_systemd_container | ||
| 212 | |||
| 213 | % ctr task ls | ||
| 214 | TASK PID STATUS | ||
| 215 | my_systemd_container 690 RUNNING | ||
| 216 | |||
| 217 | Then add a user to the container so you can login: | ||
| 218 | |||
| 219 | % root@qemuarm64-54:~# docker exec systemd_test useradd testuser | ||
| 220 | % root@qemuarm64-54:~# docker exec systemd_test sh -c "echo 'testuser:password' | chpasswd" | ||
| 221 | |||
| 222 | % podman exec systemd_test useradd testuser | ||
| 223 | % podman exec systemd_test sh -c "echo 'testuser:password' | chpasswd" | ||
| 224 | |||
| 225 | % ctr task exec --exec-id test_exec my_systemd_container useradd testuser | ||
| 226 | % ctr task exec --exec-id test_exec my_systemd_container sh -c "echo 'testuser:password' | chpasswd" | ||
| 227 | % ctr task exec -t --exec-id test_exec my_systemd_container bash | ||
| 228 | |||
| 229 | Get the IP address: | ||
| 230 | |||
| 231 | % root@qemuarm64-54:~# docker inspect systemd_test | grep \"IPAddress\": | ||
| 232 | "IPAddress": "172.17.0.2", | ||
| 233 | "IPAddress": "172.17.0.2", | ||
| 234 | |||
| 235 | % root@qemuarm64-54:~# podman inspect 2f9e00c53c13 | grep IPAdd | ||
| 236 | "IPAddress": "10.88.0.5", | ||
| 237 | "IPAddress": "10.88.0.5", | ||
| 238 | |||
| 239 | ssh into the container: | ||
| 240 | |||
| 241 | % root@qemuarm64-54:~# ssh testuser@172.17.0.2 | ||
| 242 | % testuser@172.17.0.2's password: | ||
| 243 | |||
| 244 | WARNING: Poky is a reference Yocto Project distribution that should be used for | ||
| 245 | testing and development purposes only. It is recommended that you create your | ||
| 246 | own distribution for production use. | ||
| 247 | |||
| 248 | 4b07cc907e26:~$ systemctl | grep running | ||
| 249 | init.scope loaded active running System and Service Manager | ||
| 250 | session-c1.scope loaded active running Session c1 of User testuser | ||
| 251 | dbus.service loaded active running D-Bus System Message Bus | ||
| 252 | dhcpcd.service loaded active running A minimalistic network configuration daemon with DHCPv4, rdisc and DHCPv6 support | ||
| 253 | getty@tty1.service loaded active running Getty on tty1 | ||
| 254 | sshd@2-172.17.0.2:22-172.17.0.1:39264.service loaded active running OpenSSH Per-Connection Daemon (172.17.0.1:39264) | ||
| 255 | systemd-journald.service loaded active running Journal Service | ||
| 256 | systemd-logind.service loaded active running User Login Management | ||
| 257 | systemd-networkd.service loaded active running Network Configuration | ||
| 258 | systemd-nsresourced.service loaded active running Namespace Resource Manager | ||
| 259 | systemd-resolved.service loaded active running Network Name Resolution | ||
| 260 | systemd-userdbd.service loaded active running User Database Manager | ||
| 261 | user@1000.service loaded active running User Manager for UID 1000 | ||
| 262 | xinetd.service loaded active running Xinetd A Powerful Replacement For Inetd | ||
| 263 | dbus.socket loaded active running D-Bus System Message Bus Socket | ||
| 264 | systemd-journald-dev-log.socket loaded active running Journal Socket (/dev/log) | ||
| 265 | systemd-journald.socket loaded active running Journal Sockets | ||
| 266 | systemd-networkd.socket loaded active running Network Service Netlink Socket | ||
| 267 | systemd-nsresourced.socket loaded active running Namespace Resource Manager Socket | ||
| 268 | systemd-userdbd.socket loaded active running User Database Manager Socket | ||
| 269 | |||
| 270 | |||
| 271 | % root@qemuarm64-54:~# ssh testuser@10.88.0.5 | ||
| 272 | The authenticity of host '10.88.0.5 (10.88.0.5)' can't be established. | ||
| 273 | ECDSA key fingerprint is SHA256:ydCJGSVNLdWiAcC5PUkDsiFZZ6sDTeQ9Nt13a6HQCc4. | ||
| 274 | This key is not known by any other names. | ||
| 275 | Are you sure you want to continue connecting (yes/no/[fingerprint])? yes | ||
| 276 | Warning: Permanently added '10.88.0.5' (ECDSA) to the list of known hosts. | ||
| 277 | testuser@10.88.0.5's password: | ||
| 278 | |||
| 279 | WARNING: Poky is a reference Yocto Project distribution that should be used for | ||
| 280 | testing and development purposes only. It is recommended that you create your | ||
| 281 | own distribution for production use. | ||
| 282 | |||
| 283 | 2f9e00c53c13:~$ | ||
| 284 | |||
| 285 | Enjoy! | ||
| 286 | |||
| 287 | |||
