文章目录
Docker 官网:https://www.docker.com
比较好的视频教程:B站十五分钟速成
docker操作
什么是docker
Docker 可以打包程序和程序依赖的环境,放入到一个容器中。这个容器可移植到其他Linux系统中,使得程序更容易交付。容器是完全使用沙箱机制。
Docker 分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),我们用社区版就可以了。
docker安装(带NVIDIA显卡)
各个平台安装,参考:Windows Docker 安装, Ubuntu Docker 安装
安装GPU版本的tensorflow,要安装 nvidia-docker
# 安装docker
sudo curl -sS https://get.docker.com/ | sh
# 本地有GPU,继续执行以下命令以支持GPU调用,即nvidia-docker
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
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-container-toolkit
sudo systemctl restart docker
三个概念:镜像、容器、仓库
-
镜像 Image:
镜像相当与虚拟机中的img或者iso文件。类比于程序开发中的class,是一个模板,用于创建实例。
-
容器 Container:
容器可以类比做正在运行中的虚拟机,或者类比于程序开发中类生成的对象。一个镜像可以启动多个容器。类比于一个iso可以运行成很多个虚拟机。
-
仓库 Repository:
类似于github仓库,可以创建一个自己账号,把做好的镜像放到在线仓库里,通过pull命令可以随时拉取下来。推荐的仓库有Docker Hub.
tar文件
类似于vm使用过程中的vmdk文件,可以将一个镜像保存成tar文件,通过load就可以将一个tar文件加载成一个镜像。
Dockerfile
配置文件,指定一个镜像如何构建,通过docker build可以构建成一个镜像。
常用命令
仓库:一般取ID的前2个就行。
镜像:一般都是镜像名称全名操作。
## 镜像
docker pull [镜像名称](:[版本tag]) # 从远程仓库获取镜像
docker images # 查看本地有哪些镜像
docker rmi [镜像名](:[版本tag]) # 删除本地镜像 注意:被删除的镜像需要没有正在运行的容器,否则无法删除
## 容器
docker run [镜像名称]:[版本] # 将镜像运行成容器(虚拟机)
docker container run [镜像名称]:[版本]
# eg
docker run -it ubuntu /bin/bash # 直接进入容器
docker run -itd --name ubuntu-python ubuntu /bin/bash # 只会后台运行,后面需要exec -it进入容器
# arg:
# -d 后台运行 detached, 默认是前台运行
# -p [外部端口]:[内部端口] 端口映射
# -v [外部文件路径]:[内部文件路径] 文件映射
# --name [容器名字] 设置运行起来的容器名字
# --gpus all docker里支持显卡的读取
# --rm 容器退出时能够自动清理容器内部的文件系统
# --shm-size [多少G] 指定docker可使用内存空间大小
# --net="bridge" 指定容器的网络连接类型,支持 bridge/host/none/container四种类型
# -it 以交互模式运行容器interactive terminal,分配一个shell
docker ps # 查看本地正在运行的有哪些容器
docker container ls -a # 查看本地存在的容器(包括未启动)
docker container start [container Id] # 启动被关掉的容器
docker start [containerID 取前几位能唯一分辨就可以] # 启动已经停止的容器
docker stop [containerID 取前几位能唯一分辨就可以] # 停止容器
docker rm -f [containerID 取前几位能唯一分辨就可以] # 删除容器
docker exec -it [ContainerID 取前几位能唯一分辨就可以] /bin/bash # 进入正在后台运行的容器
docker commit [containerID 取前几位能唯一分辨就可以] [用户名]:[新的镜像名称]:[tag] # 修改容器内容后commit镜像
docker logs [containerID 取前几位能唯一分辨就可以] # 查看容器运行的日志
# 把当前容器放到后台
# control + P 然后再按 Q
# 基于Dockerfile文件构建,dockerfile文件语法不在本文叙述范围
# -t [镜像名字] 指定新构建的镜像名 -t -tag
docker build -t [镜像名] [dockerfile所在文件夹的路径,不包括dockerfile自身] .
## tar文件
docker save [镜像名] >[tar文件名] # 镜像保存成tar文件
docker load < [tar文件名] # tar文件加载成镜像
## 镜像传到dockerhub
# 登陆 docker hub: htttps://hub.docker.com
docker login
# username: docker hub上注册的账号
# password: docker hub上所注册账号的密码
# 给镜像打tag,作用相当于给镜像重命名,注意新镜像名称即推送到远程仓库的名称,且必须严格按照[用户名]/[新镜像名称]:[新镜像tag]格式命名
docker tag [本地镜像ID](or [本地镜像名字]:[本地镜像tag]) [远程用户名]/[新镜像名称]:[新镜像tag]
# 推送
docker push [远程用户名]/[新镜像名称]:[新镜像tag]
Dockerfile语法
详细参考:Docker Dockerfile
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
常见命令:
FROM python:3 # 定制需要的基础镜像,这里以python为例
RUN echo 'hello, world!' > hello.py # 执行后面的命令行,等同终端的shell命令
CMD <shell 命令> # 类似 RUN 命令
COPY <源路径> <目标路径> # 复制文件或者目录到容器里的指定路径
ADD <源路径> <目标路径> # 与COPY功能类似,官方推荐使用 COPY
ENV <key> <value> # 设置环境变量。后续的指令中,就可以使用 $key 引用这个环境变量
ARG <参数名>[=<默认值>] #构建参数,与 ENV 作用一至。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。
WORKDIR <工作目录路径> # 指定工作目录。(WORKDIR 指定的工作目录,必须是提前创建好的)
注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。以 && 符号连接命令,这样执行后,只会创建 1 层镜像。
运行python程序实例
test文件夹下,有3个文件:hello.py
、run.sh
和Dockerfile
文件
hello.py
:import numpy print('hello, world!')
文件
run.sh
:#!/bin/bash python3 hello.py
文件
Dockerfile
:FROM registry.cn-shanghai.aliyuncs.com/tcc-public/python:3 # 基础镜像来源 RUN pip3 install numpy # 构建镜像时候,安装numpy ADD hello.py /workspace # 添加hello.py到workspace文件夹下 ADD run.sh /workspace # 添加run.sh到workspace文件夹下 # 或者使用 ADD . /workspace 添加当前目录下所有文件到workspace文件夹下 WORKDIR /workspace # 设定workspace为工作目录 CMD ["sh","run.sh"] # 运行镜像成为仓库的时候,执行run.sh
(不推荐)cd到test文件夹下,执行以下命令,可以直接运行得到结果,但是不推荐,因为不可调试:
docker build -t hello:1.0 . # 构建镜像hello,版本是1.0。主意最后有一个字符".",指定的是当前目录下的Dockerfile
docker images # 查看镜像,可以看到有hello镜像存在
docker run hello # 运行镜像,得到容器。可以看到输出:hello, world!
(推荐)或者进入仓库,比较推荐,因为可以进行调试:
docker build -t hello:2.0 . # 构建镜像hello,版本是2.0。主意最后有一个字符".",指定的是当前目录下的Dockerfile
docker run -itd hello:2.0 /bin/bash # 运行镜像,得到容器
# 此时会得到一个长的无规则的容器ID号码,一般只需要ID前两位就可指定为对应的容器
# 假定ID为:e8656212a9c4
docker exec -it e8 /bin/bash # 进入容器内部,其实就是进入了Ubuntu系统中,可以进行shell命令了
# 下面是容器内部的shell命令
#######################################
apt-get update # 更新源,方便后面安装库
apt-get install vim # 安装vim,可以使用vim命令了
# 可以进行一系列的操作了,比如修改code等
exit # 调试完毕后,exit退出容器
#######################################
docker commit e8 hello:3.0 # 保存修改后的容器,为镜像hello,版本是3.0
docker push hello:3.0 # 推送到云端,需要登陆账号
搭建python环境
docker image pull ubuntu
docker image
docker run -itd --name ubuntu_python -p 9977:22 ubuntu /bin/bash
docker exec -it 容器ID /bin/bash
apt-get update
apt-get install sudo # 安装sudo命令
sudo passwd root # 激活root用户
# 安装python,和虚拟环境virtualenv,安装vim(之后会用到)
apt-get install python
apt-get install python3
apt-get install virtualenv
apt-get install virtualenvwrapper
apt-get install vim
# 配置虚拟环境
mkdir ~/.virtualenvs # 创建虚拟环境存放目录
vi ~/.bashrc # 编辑环境配置文件
# 文件 .bashrc 中内容添加如下:
export WORKON_HOME=$HOME/.virtualenvs
source /usr/share/virtualenvwrapper/virtualenvwrapper.sh
# 保存退出后执行如下
source .bashrc
# 创建虚拟环境,创建的虚拟环境默认的解释器为先安装的python版本
mkvirtualenv py_2
# 将当前容器保存为镜像
docker commit 容器ID前两位 镜像名