-Docker概念及基本操作
docker环境与普通环境对比图
docker概念转换图
静止的是镜像(image)
查看本地镜像:docker image ls
参数:
REPOSITORY:镜像名——用户名/(可选)+镜像名
TAG:镜像版本号
IMAGE ID:镜像id
CREATED:创建时间
SIZE:尺寸
运行的是容器(container)
查看本地容器:docker container ls
参数:
CONTAINER ID:容器id
IMAGE:当前运行容器所基于的镜像——用户名/(可选)+镜像名:镜像版本号
COMMAND:运行命令
CREATED:创建时间
STATUS:当前状态
PORTS:端口信息——本机:本机端口号->容器端口号/连接形式
镜像运行(run)变容器
docker container run --runtime=nvidia -it --rm -p 8000:3000 dockername /bin/bash
其中
--runtime=nvidia 表示选择NVIDIA驱动作为运行时环境
-it 交互式运行 与之对应的是-d代表后台运行
-d 后台运行容器,并返回容器ID
–rm 代表退出容器后就删除容器
-p 8000:3000 容器端口与本地端口映射,前为本地端口,后为容器端口。这里的例子是将容器的3000端口映射到 8000端口
tf-gpu 为之前创立的镜像名称
/bin/bash 代表进入容器后选择bash的方式
另外
--name 给容器命名,没有这个参数会随机生成一个名字(停止前)容器交付(commit)变镜像
容器运行特点
同一镜像不同运行可生成不同容器,且容器间互不干扰。
所以只需要改变各自的容器即可,不会影响别人的环境,更不会影响公共环境。
挂载(-v)本地文件
容器可挂载本地文件,然后运行镜像,生成容器——即本地文件被挂载进入容器。
-v 本机目录:容器目录
完整例子:
docker run -v 本机目录:容器目录 -it --rm 镜像名:镜像版本号 /bin/bash
PS
多次使用-v即可实现多个文件的挂载
容器目录后接:rw表示有读写权限,接:ro表示只有读取权限
将本地文件拷贝(cp)到运行的容器里
docker cp 主机目的路径 容器进程ID:文件夹路径+文件
将容器文件拷贝(cp)到本地
docker cp 容器进程ID:文件夹路径+文件 主机目的路径
从dockerhub上获取(pull)镜像
dockerhub:https://hub.docker.com/
docker pull 用户名/镜像名:镜像版本号
其中,:版本号 可选,默认获取latest版本的该镜像
上传(push)到dockerhub
docker push 用户名/镜像名:镜像版本号
zjhao666/nvidia-cuda9-torch1.1-nlp-minicv:tagname
镜像保存(save)变本地文件
docker save 镜像id > 本地文件地址+本地文件(推荐+“.tar”后缀)
本地文件加载(load)变镜像
docker load < 本地文件地址+本地文件
容器导出(export)变本地文件
docker export 容器id > 本地文件地址+本地文件(推荐+“.tar”后缀)
本地文件导入(import)变容器
docker import < 本地文件地址+本地文件
导出 export 与 保存 save 的区别
(1).export导出的镜像文件大小 小于 save保存的镜像
(2).export 导出(import导入)是根据容器拿到的镜像,再导入时会丢失镜像所有的历史,所以无法进行回滚操作(docker tag <LAYER ID> <IMAGE NAME>);而save保存(load加载)的镜像,没有丢失镜像的历史,可以回滚到之前的层(layer)。(查看方式:docker images --tree)
关闭容器
exit退出并关闭容器
Ctrl+P+Q退出但不关闭容器
进入正在运行的容器
docker attach 容器ID
换源
备份sources.list并新建
sudo mv /etc/apt/sources.list /etc/apt/sources.list.old
sudo vim /etc/apt/sources.list
阿里源镜像填入(最近清华源好像有问题)
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
更新源使之生效
sudo apt-get update
NVIDIA GPU 驱动安装
驱动安装
sudo ubuntu-drivers autoinstall
检查安装结果
watch nvidia-smi
Docker安装
docker安装
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository \
"deb [arch=amd64] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu \
$(lsb_release -cs) \
stable"
sudo apt-get update
sudo apt-get install docker-ce
检查安装结果
docker -v
将当前用户加入docker用户组
避免docker操作必须要sudo,${YOUR_NAME_HERE}处填当前用户名
sudo usermod -aG docker ${YOUR_NAME_HERE}
Nvidia-docker安装
安装
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
sudo apt-get install -y nvidia-docker2
sudo pkill -SIGHUP dockerd
上述最后一步会重启docker,并载入nvidia-docker的配置
检查安装结果
--runtime=nvidia --rm nvidia/cuda:9.0-base nvidia-smi
Docker基本使用
Docker启动
sudo service docker start
或
sudo systemctl start docker
Dokcer关闭
sudo service docker stop
或
sudo systemctl stop docker
同理,重启是restart。
Docker仓库国内源修改,以加速镜像获取
打开/etc/default/docker文件(需要sudo权限),在文件的底部加上一行。
DOCKER_OPTS="--registry-mirror=https://registry.docker-cn.com"
然后,重启 Docker 服务。
sudo service docker restart
拉取镜像
docker image pull [仓库名]/[镜像名][:版本号](版本号可选,默认为最新)
例如:
docker image pull library/hello-world
查看镜像
docker image ls
Docker守护进程修改
问题:Cannot connect to the Docker daemon at tcp://localhost:4243. Is the docker daemon running?
修改配置文件 /etc/systemd/system/multi-user.target.wants/docker.service为:
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
即修改ExecStart改成上述值,即为docker指定启动的本地端口。
然后,systemctl daemon-reload/ systemctl restart docker.service /
分别运行上述命令进行docker重启,重启成功!
深度学习框架生成
首先创建一个自己合适路径下的空目录
mkdir 仓库文件夹名
cd 仓库文件夹名
vim Dockerfile
Dockerfile编写
注意:
-
这里由于制作镜像的时候无法输入命令,因此Anaconda的安装需要使用静默模式(silent mode),官网的参考链接为[link]https://conda.io/docs/user-guide/install/index.html#installing-in-silent-mode ,即选择-b -p + 安装路径的模式
-
注意Anaconda不要选择官网的最新版本Anaconda 5.3+python 3.7, 否则安装tensorflow时会报错出现找不到制定版本的tensorflow的问题(Could not find a version that satisfies the requirement tensorflow-gpu (from versions: )),因此这里采取的是清华镜像中的Anaconda3 5.2+python3.6的下载链接,清华镜像所有Anaconda的链接 https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/
-
注意Dockerfile RUN source /root/.bashrc 会报错 /bin/sh: 1: source: not found ,因此Dockerfile应该写成 /bin/bash -c “source /root/.bashrc”
FROM nvidia/cuda:9.0-cudnn7-devel-ubuntu16.04
MAINTAINER zjhao666
# install basic dependencies
RUN apt-get update
RUN apt-get install -y wget \
vim \
cmake
# install Anaconda3
RUN wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-5.2.0-Linux-x86_64.sh -O ~/anaconda3.sh
RUN bash ~/anaconda3.sh -b -p /home/anaconda3 \
&& rm ~/anaconda3.sh
ENV PATH /home/anaconda3/bin:$PATH
# change mirror
RUN mkdir ~/.pip \
&& cd ~/.pip
RUN echo -e "[global]\nindex-url = https://pypi.mirrors.ustc.edu.cn/simple/" >> ~/pip.conf
RUN /home/anaconda3/bin/pip install --upgrade pip
RUN /home/anaconda3/bin/pip install numpy==1.16.0
RUN /home/anaconda3/bin/pip install matplotlib
RUN /home/anaconda3/bin/pip install scipy
RUN /home/anaconda3/bin/pip install sklearn
RUN /home/anaconda3/bin/pip install echarts
RUN /home/anaconda3/bin/pip install tensorflow-gpu==1.9.0
RUN /home/anaconda3/bin/pip install torch===1.2.0 torchvision===0.4.0 -f https://download.pytorch.org/whl/torch_stable.html
其中,
FROM表示来自基础镜像
MAINTAINER表示用户持有者名字
RUN表示运行命令
ENV表示修改环境变量
显然,最后的几个RUN可以自行修改安装包及版本号
建议:torch\tensorflow这种大框架,一个镜像最好只有一个。
镜像起名
docker build -t my_image .
-t 后面跟镜像的名字
运行生成容器
docker run --runtime=nvidia -it --rm my_image /bin/bash
镜像修改
先使用下载的镜像启动容器
$ docker run -t -i training/sinatra /bin/bash
root@0b2616b0e5a8:/#
注意:记住容器的 ID,稍后还会用到。
在容器中添加 json 和 gem 两个应用
root@0b2616b0e5a8:/# gem install json
当结束后,我们使用ctrl p q 来退出,现在我们的容器已经被我们改变了,使用 docker commit 命令来提交更新后的副本。
$ sudo docker commit -m "Added json gem" -a "Docker Newbee" 0b2616b0e5a8 ouruser/sinatra:v2
4f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c
其中
-m 来指定提交的说明信息,跟我们使用的版本控制工具一样;
-a 可以指定更新的用户信息;
之后是用来创建镜像的容器的 ID;
最后指定目标镜像的仓库名和 tag 信息,创建成功后会返回这个镜像的 ID 信息
查看镜像
使用 docker images 来查看新创建的镜像
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
training/sinatra latest 5bc342fa0b91 10 hours ago 446.7 MB
ouruser/sinatra v2 3c59e02ddd1a 10 hours ago 446.7 MB
ouruser/sinatra latest 5db5f8471261 10 hours ago 446.7 MB
运行镜像生成容器
之后,可以使用新的镜像来启动容器
$ sudo docker run -t -i ouruser/sinatra:v2 /bin/bash
root@78e82f680994:/#