Docker:开源容器工具

常用操作

基于镜像创建新的容器并且运行

docker run -i -t -d ubuntu:18.04

启动已创建但停止运行的容器

docker start -i -t -d 3af41afdf9ee

登录已经启动的容器

docker attach 3af41afdf9ee

停止容器的运行

docker stop 3af41afdf9ee

容器和宿主机之间共享文件

有些比较依赖环境的库会以docker镜像的形式提供给开发者,例如GPU版本的Tensorflow,这意味这我们必须要其对应的容器中进行开发。 那就会涉及到代码文件在哪里保存,以及怎么编辑,怎么传送到容器中的问题了。

容器和宿主机之间共享文件的方式很简单,只需要在启动的时候挂载宿主目录,即使用“-v”选项。

docker run -it -v /home/haha/下载:/share microsoft/dotnet:latest /bin/bash

上述代码把宿主机的“/home/haha/下载”目录挂载到docker中的“/share”目录。

不使用sudo的docker运行方法

默认情况下,若不使用sudo,那么docker无法运行,因为docker要绑定unix socket,但如果使用sudo,则所有相关的操作都需要sudo,包括vscode连接容器里的代码时,vscode也得使用sudo启动。很麻烦也不安全。

下面是不使用sudo的运行方法

sudo groupadd docker
sudo usermod -aG docker $USER
#完成后记得注销再重新登录

查看当前所有镜像和容器

docker images
docker container ps -a

保存并迁移容器

docker commit 3af41afdf9ee qzk/my_env
docker save qzk/my_env > my_env.tar

常用模板

可运行基于Nvidia硬件、OpenGL组件的GUI程序的容器

Dockerfile

FROM ubuntu:18.04
# Dependencies for glvnd and X11.
RUN apt-get update \
&& apt-get install -y -qq --no-install-recommends \
libglvnd0 \
libgl1 \
libglx0 \
libegl1 \
libxext6 \
libx11-6 \
&& rm -rf /var/lib/apt/lists/*
# Env vars for the nvidia-container-runtime.
ENV NVIDIA_VISIBLE_DEVICES all
ENV NVIDIA_DRIVER_CAPABILITIES graphics,utility,compute

运行参数:

#!/bin/bash
# Expose the X server on the host.
sudo xhost +local:root
# --rm: Make the container ephemeral (delete on exit).
# -it: Interactive TTY.
# --gpus all: Expose all GPUs to the container.
docker run \
--rm \
-it \
--gpus all \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-e DISPLAY=$DISPLAY \
-e QT_X11_NO_MITSHM=1 \
glvnd-x \
bash

在容器中测试:

apt-get update
apt-get install -y -qq glmark2
glmark2