一文读懂docker使用

Docker使用简介

什么是Docker

像虚拟机又不是虚拟机的一个环境。
详细信息

为什么要用Docker

如果你有以下需求,就需要使用到Docker。

  1. 你在一台公用服务器上没有root权限,而又需要root权限。
  2. 你在做一些操作时可能会污染到系统环境,而又不想让系统环境被污染。
  3. 你需要发布你的程序,给用户一个一行命令能跑通的环境。
  4. 其他原因

如何使用Docker

Docker中的概念

Docker中最重要的两个概念

  1. 镜像(image):可以理解为一张光盘、一段代码或者一个配置文件,是一个静态的概念。
  2. 容器(container):可以理解为一个进程,是一个动态的概念。动态意味着会有自己的生命周期及各种状态。

Docker中容器的生命周期
一文读懂docker使用_第1张图片

Docker中Image的由来

Image有两种制作方式:

  1. 通过编写Dockerfile来制作
  2. 通过运行状态的Container使用docker commit命令来制作
    [外链图片转存失败(img-UVRu2KRS-1562919772086)(media/15414235420912/%E6%9C%AA%E5%91%BD%E5%90%8D%E6%96%87%E4%BB%B6.png)]

Container一般都由docker run来产生

Docker中Image的组织结构

假设有如下一个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命令速查手册(含各参数内容介绍以及使用示例)

1. docker images

查看镜像

>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

2. docker run -d --name=[CONTAINERNAME] --rm --runtime=nvidia -v [SOURCEDIR]:[CONTAINERDIR] [IMAGENAME]:[TAG]

一个创建一个新容器的例子

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

3. docker ps

查看运行中的容器

>docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
0f6fad31056c        centos              "/bin/bash"         About an hour ago   Up About an hour                        condescending_murdock

4. docker ps --all

查看所有容器

>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

5. docker exec -it [CONTAINERNAME] bash

6. docker commit [CONTAINERID] [new imagename]:[tag]

将某个容器重新打包成一个镜像

>docker commit 0f6fad31056c centosvim

7. docker cp SRC_PATH CONTAINER:DEST_PATH

将文件从主机拷贝至某个容器中

>docker cp test 0f6fad31056c:/home/tmp
>[root@0f6fad31056c tmp]# ls
test

8. docker stop [CONTAINERID]

停止某个id的容器

9. docker rm [CONTAINERID]

删除某个id的容器(需要先stop)

docker rm 0f6fad31056c

10. docker rmi [IMAGEID]

删除某个id的镜像

>docker rmi 3c387eca042f
Untagged: centosvim:latest
Deleted: sha256:3c387eca042f838491847053ab9a19d5ca229fa0b58a0fc8666c8b9e5b387716
Deleted: sha256:3aa3e55e94b9a1d509c2480f51cf4a2156dd878a02632a6fee980b6d6f25c358

11. docker save

12. docker load

13. docker 删除废弃镜像和容器

$ 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}')  //删除镜像 

建议的使用方式

  1. 使用Dockerfile构建镜像
  2. 使用docker run -v[]:[] --rm --name=[] --runtime=nvidia -d ...启动容器,然后使用docker exec -it [] bash进入容器进行操作。在使用结束后docker stop []关闭容器。
  3. 代码和数据使用-v命令挂载到容器内,修改时在宿主机上进行修改,容器内不建议直接对文件进行修改

你可能感兴趣的:(linux,docker)