本文将介绍如何用docker封装你的生成环境,从而实现一次部署到处运行。docker非常适合有多台服务器,或者需要经常切换工作环境的人。比如,在生产环境使用docker,因为开发环境跟生产环境是一致的,因此可以大大减低开发成本。
Docker有两个比较重要的概念,一个是image一个是container,container是用image产生出来的一个运行的容器,也就是说,你可以从同一个image里面,产生出多个不同的容器来分别执行不同的任务。你可以用 docker image ls
来查看你所有的镜像,以及用docker ps -a
来查看你所有的container。
Docker 有几种不同的版本:
更详细介绍可以看看这篇博文和另一篇关于Docker CE和Docker EE的文章。
这里安装的是Docker-CE,安装的教程请直接看:https://docs.docker.com/install/linux/docker-ce/ubuntu/#install-docker-ce-1
我这里的安装代码有可能会过期,这是目前ubuntu的安装代码:
sudo apt-get update
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
为了使用gpu功能,我们还需要安装nvidia-docker, 安装教程请看:https://github.com/NVIDIA/nvidia-docker
我这里给出的安装代码有可能是过时的,仅供参考:
# If you have nvidia-docker 1.0 installed: we need to remove it and all existing GPU containers
docker volume ls -q -f driver=nvidia-docker | xargs -r -I{} -n1 docker ps -q -a -f volume={} | xargs -r docker rm -f
sudo apt-get purge -y nvidia-docker
# Add the package repositories
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | \
sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | \
sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update
# Install nvidia-docker2 and reload the Docker daemon configuration
sudo apt-get install -y nvidia-docker2
sudo pkill -SIGHUP dockerd
# Test nvidia-smi with the latest official CUDA image
docker run --runtime=nvidia --rm nvidia/cuda:9.0-base nvidia-smi
使用加速器可以提升获取Docker官方镜像的速度
,方法如下:
首先,还是访问上面的阿里云的容器镜像服务,然后选择镜像仓库,创建你自己的镜像仓库
最后就可以按照教程push你的docker镜像到阿里云啦,在其他机器还能pull这个镜像,不要太方便。
把自己的用户加到docker组就不需要sudo了
sudo groupadd docker
sudo usermod -aG docker $USER
docker --version
docker version
docker info
docker run hello-world
因为在镜像无法动态保存你的代码,所以,如果要开发,我们可以将你本机的文件挂载到容器中(一般是挂载你的代码),这样就可以实现文件共享,你的代码在容器结束的时候也不会丢失。
docker run -v ~/github:~/github hello-world
将22端口应该到本机的2222端口中,这样可以在外部访问2222端口来ssh连接你的容器
docker run -v ~/github:~/github -p 2222:22 hello-world
docker image ls
docker container ls
docker container ls --all
docker container ls -aq
参考:https://stackoverflow.com/questions/23935141/how-to-copy-docker-images-from-one-host-to-another-without-using-a-repository
保存命令:
docker save -o
加载命令:
docker load -i
在初期build自己的镜像的时候,可能会产生一堆none的镜像,用下面的命令可以批量删除:
docker stop $(docker ps -a | grep "Exited" | awk '{print $1 }') #停止容器
docker rm $(docker ps -a | grep "Exited" | awk '{print $1 }') #删除容器
docker rmi $(docker images | grep "none" | awk '{print $3}') #删除镜像
参考:https://forums.docker.com/t/how-do-i-change-the-docker-image-installation-directory/1169
有的时候可能你的根目录空间不够,想要将镜像安装到其他目录里,我们可以将/var/lib/docker这个路径移到其他地方,然后建立一个链接:
mv /var/lib/docker /mnt/docker
ln -s /mnt/docker /var/lib/docker
关于怎么写Dockerfile建议你先去看看别人怎么写的,一个比较好的教程是:
https://takacsmark.com/dockerfile-tutorial-by-example-dockerfile-best-practices-2018/
常用的几个关键字就是FROM, COPY, RUN, ENV, EXPOSE, CMD
FROM就是你要继承的镜像,一般是选择官方的镜像
RUN 就是在里面使用shell命令,比如 RUN apt-get update
ENV 是设置环境变量
COPY 这是复制文件到镜像里面
EXPOSE 是用来暴露端口的,需要结合-p命令使用,比如EPOSE 22
这样就能使用ssh了
CMD 一般每个Docerfile只有一个,用来负责定义运行这个镜像的初始动作的,比如CMD ["bash"]
,比如一运行就打开终端。
写完Dockerfile之后,就可以直接调用命令来build你自己的镜像了:
docker build -t qj/qj_docker:latest .
之后就可以运行自己的镜像:
docker run qj/qj_docker
我自己写了一个nvidia gpu + pytorch + rstudio server的Dockerfile,有兴趣可以来看看:https://github.com/qjgods/pytorch-r-dockerfile