像虚拟机又不是虚拟机的一个环境。
详细信息
如果你有以下需求,就需要使用到Docker。
Image
有两种制作方式:
Dockerfile
来制作Container
使用docker commit
命令来制作Container一般都由docker run
来产生
假设有如下一个Dockerfile文件
FROM tensorflow/tensorflow:1.12.0-gpu-py3
RUN pip install bert-serving-server bert-serving-client flask
WORKDIR /tmp
RUN apt update && apt install locales \
&& locale-gen en_US.UTF-8
ENV LC_ALL=en_US.UTF-8
ENV LANG=en_US.UTF-8
ENV LANGUAGE=en_US.UTF-8
我们使用docker build -t bert_similarity:test .
命令构建镜像
Step 1/7 : FROM tensorflow/tensorflow:1.12.0-gpu-py3
---> 413b9533f92a
Step 2/7 : RUN pip install bert-serving-server bert-serving-client flask
---> Using cache
---> e1ab6d13c7bf
Step 3/7 : WORKDIR /tmp
---> Using cache
---> 1f3eb3637d48
Step 4/7 : RUN apt update && apt install locales && locale-gen en_US.UTF-8
---> Using cache
---> dcbe00117168
Step 5/7 : ENV LC_ALL=en_US.UTF-8
---> Using cache
---> 4ce805435e64
Step 6/7 : ENV LANG=en_US.UTF-8
---> Using cache
---> b4389530c8ca
Step 7/7 : ENV LANGUAGE=en_US.UTF-8
---> Using cache
---> b40e0a3e0c93
Successfully built b40e0a3e0c93
Successfully tagged bert_similarity:test
可以看到,Dockerfile中的每一行命令都会对应地构建一层,每一层都有一个属于自己的唯一标示码,多个镜像会共用拥有同一个码的层,例如,tensorflow/tensorflow:1.12.0-gpu-py3
的码就是413b9533f92a
,很多FROM tensorflow/tensorflow:1.12.0-gpu-py3
的镜像都是以它为基础制作的。由于这样的依赖关系的存在,在删除镜像时可能会产生依赖问题,以及删除镜像时所释放的空间,其实是该镜像所独特的层所占用的空间。
这样的组织结构的好处主要有两点:
1.节省存储空间
2.在build时如果遇到错误时可以不必再从开头进行构建(cache机制,可以指定–no-cache)
常用的Dockerfile命令
FROM
RUN
ADD
WORKDIR
ENV
docker命令速查手册(含各参数内容介绍以及使用示例)
查看镜像
>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centosvim latest 3c387eca042f About an hour ago 355MB
centos latest 75835a67d134 3 weeks ago 200MB
hello-world latest 4ab4c602aa5e 8 weeks ago 1.84kB
一个创建一个新容器的例子
docker run -it -v /home/liupei/project/neo4j:/var/lib/neo4j -w /home/liupei/project/neo4j -d -p 7474:7474 -p 7687:7687 -p 1111:22 liupei:neo4j2
一个建议的使用例子
>docker run -d --name=zxr --runtime=nvidia -v /home/zxr/bert_similarity:/bert_similarity --rm -p 20086:20086 bert_similarity
e4e2626f94cf306301dfea379f6060041c374e231f0c65dbbe860338b5204e34
>docker exec -it zxr bash
查看运行中的容器
>docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0f6fad31056c centos "/bin/bash" About an hour ago Up About an hour condescending_murdock
查看所有容器
>docker ps --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0f6fad31056c centos "/bin/bash" About an hour ago Up About an hour condescending_murdock
416635fe8cc0 hello-world "/hello" 2 hours ago Exited (0) 2 hours ago admiring_mestorf
将某个容器重新打包成一个镜像
>docker commit 0f6fad31056c centosvim
将文件从主机拷贝至某个容器中
>docker cp test 0f6fad31056c:/home/tmp
>[root@0f6fad31056c tmp]# ls
test
停止某个id的容器
删除某个id的容器(需要先stop)
docker rm 0f6fad31056c
删除某个id的镜像
>docker rmi 3c387eca042f
Untagged: centosvim:latest
Deleted: sha256:3c387eca042f838491847053ab9a19d5ca229fa0b58a0fc8666c8b9e5b387716
Deleted: sha256:3aa3e55e94b9a1d509c2480f51cf4a2156dd878a02632a6fee980b6d6f25c358
$ 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}') //删除镜像
Dockerfile
构建镜像docker run -v[]:[] --rm --name=[] --runtime=nvidia -d ...
启动容器,然后使用docker exec -it [] bash
进入容器进行操作。在使用结束后docker stop []
关闭容器。-v
命令挂载到容器内,修改时在宿主机上进行修改,容器内不建议直接对文件进行修改