Docker使用指南

-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:/#

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值