Dcoker是什么
容器化技术 直接运行在操作系统上(宿主机内核中)没有虚拟硬件 内核级别虚拟化 轻便 每个容器间互相隔离 各有自己的文件系统 通过镜像生成容器
所有docker镜像都是只读,在镜像启动时加载一个新的可写层至镜像层顶部,即为容器层。
Docker入门命令
命令概览
所有命令可在Docker命令官方文档中查询
1 | #一条通用原则 |
1 | #关于镜像 |
进入容器后
1 | exit # 退出并关闭容器 |
通常将容器放在后台运行,此时如果需要进入当前正在运行的容器
1 | docker exec -it 容器id 进入后执行的命令 #(通常执行bash) |
关于宿主机与容器的文件交换
1 | # 1. 手动从容器拷贝文件到主机(只要容器在数据就在,无论是否运行,即docker ps -a存在即可): |
数据共享(目录挂载)时,将容器内的目录挂载到linux上,以实现容器的持久化和同步操作。容器之间的数据也可以共享。
可通过以下方式查看挂载信息
1 | docker inspect 容器id |
-v后宿主机路径与容器路径会绑定,若本机不存在此路径则新建,文件双向绑定同步,即使exit退出容器只要镜像还在(docker ps -a)即可在本地修改文件并在容器中同步。即使删除容器,改变的数据文件已存在本地,所以不会丢失。
通过以下命令重新进入容器
1 | docker start 容器id |
文件挂载的两种方式
匿名挂载
1 | -v 容器内路径 |
具名挂载 (常用)
1 | -v name:容器内路径 # name中不包含/,否则表示本机路径 |
1 | -v /path/of/local:容器内路径 #表示指定路径挂载 |
容器内路径后可通过 :ro rw 来改变读写权限,表示只读/只写,ro表示容器中此路径只能通过宿主机操作
Dockerfile
Dockerfile官方说明
用于构建docker的构建文件,为命令脚本,通过docker build构建成为镜像。很多官方镜像都是基础包(FROM scratch),缺乏很多功能如vim,因此通常自己制作镜像。
面向开发,通常用于发布项目/做镜像,镜像已逐渐成为企业交付的标准。DockerImages通过DockerFile生成的镜像 最终发布和运行的产品。
Dockerfile中关键字建议大写,指令小写,用 # 注释。
1 | FROM # 基础镜像 从此开始构建 |
通过以下命令创建镜像。注意最后的 . 表示当前路径不要遗漏。
1 | docker build -f dockerfile_name -t 镜像名[:tag] . |
若命名为Dockerfile可省去-f dockerfile_name的指令。
Dockerfile中CMD与ENTRYPOINT区别
对于dockerfile创建的镜像,可通过以下命令来指定运行容器后需要执行的命令:
1 | docker run 镜像id [cmd] |
此cmd会覆盖Dockefile中CMD指定的命令,而对于ENTRYPOINT指定的命令,cmd会追加在命令后执行,不会忽略。
ADD与COPY的区别
二者区别不大,都可以从主机上将资源复制或加入到镜像中,都是在构建镜像过程中完成。
COPY支持从远程URL获取资源,而ADD不行,后者更擅长读取本地tar文件并解压。
在用途相同时开发者更推荐前者
镜像发布
可将打包好的镜像发布至 docker官网镜像网站 供他人下载,也可以在此寻找别人打包好的镜像。
在提交到hub之前必须给镜像加上tag:
1 | docker tag SOURCE_IMAGE[:TAG] hub_username/TARGET_IMAGE[:TAG] |
hub_username为docker账号的用户名,且提交前必须在镜像前加上此字段,然后:
1 | docker push hub_username/TARGET_IMAGE[:TAG] |
即可在镜像网站中登陆查看到。
也可以推送至阿里云(收费托管)
个人常用命令
从tensorflow官网拉取镜像运行tf-GPU(若GPU设备足够(算力(Compute Capability)大于5.2)可使用NVIDIA-docker官网的TensorFlow镜像):
1 | docker run --gpus all -it --rm -v $PWD:/tmp -w /tmp tensorflow/tensorflow:latest-gpu bash |
需要手动安装scipy/matplotlib/vim等库/软件
1 | docker ps -a #正在以及历史运行的容器 |
踩坑记录
1 | docker run -d 镜像名 # 对于某些镜像,在docker ps时不会找到,因为后台运行时必须要有一个前台进程 否则docker发现没有应用会自动停止 |
暂时未找到在Dockerfile中设置Nvidia GPU的办法,只能通过以下方法调用,较为麻烦。找了一天没找到解决办法,留个坑看未来是否能解决。
1 | docker run --gpus all ..... |