Docker

学习docker命令可以结合

http://www.runoob.com/docker/docker-command-manual.html

一起学习

第一章  初识Docker与容器

         一  知识点整理               

                    1.  简单地讲,读者可以将Docker 容器理解为一种轻量级的沙盒( sandbox ) 。每个容器内运行着一个

                         应用,不同的容器相互隔离,容器之间也可以通过网络互相通信。容器的创建和停止十分快速,几乎

                         跟创建和终止原生应用一致;另外,容器自身对系统资源的额外需求非常的少,甚至可以忽略。

                    2.  通过容器来打包应用、解藕应用和运行平台

                    3.  docker支持的平台:物理机、虚拟机、公有云、私有云、个人电脑、服务器等

                    4.  传统虚拟机方式运行N 个不同的应用就要启用N 个虚拟机(每个虚拟机需要单独分配独占的内存、磁

                         盘等资源),而Docker 只需要启动N 个隔离得“很薄的”容器,并将应用放进容器内即可。

                    5.  传统方式是在硬件层面实现虚拟化,需要有额外的虚拟机管理应用和虚拟机操作系统层。Docker 容器

                         是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,因此更加轻量级。

                        

         二  问题

                   1. Docker分层是什么意思?

 

第二章  核心概念与安装配置

              一.  核心概念

                              Docker 大部分的操作都围绕着它的三大核心概念: 镜像、容器和仓库。因此,准确把握这三大核

                       心概念对于掌握Docker 技术尤为重要。

 

                       1. Docker镜像

                                  Docker 镜像类似于虚拟机镜像,可以将它理解为一个只读的模板。

                                  例如,一个镜像可以包含一个基本的操作系统环境,里面仅安装了Apache 应用程序(或用户

                           需要的其他软件) 。可以把它称为一个Apache 镜像。镜像是创建Docker 容器的基础。通过版本

                           管理和增量的文件系统, Docker 提供了一套十分简单的机制来创建和更新现有的镜像,用户甚至

                           可以从网上下载一个已经做好的应用镜像,并直接使用。

                       2. Docker容器

                                   Docker 容器类似于一个轻量级的沙箱, Docker 利用容器来运行和隔离应用

                                   容器是从镜像创建的应用运行实例。它可以启动、开始、停止、删除,而这些容器都是彼此

                            相互隔离、互不可见的。可以把容器看作一个简易版的Linux 系统环境,一个容器就是一台主机

                          (包括root 用户权限、进程空间、用户空间和网络空间等)以及运行在其中的应用程序打包而成

                            的盒子。

                       3. Docker仓库

                                   Docker 仓库类似于代码仓库,是Docker 集中存放镜像文件的场所。

                                   有时候我们会将Docker 仓库和仓库注册服务器( Regis町)混为一谈,并不严格区分。实际

                           上,仓库注册服务器是存放仓库的地方,其上往往存放着多个仓库。每个仓库集中存放某一类镜

                           像,往往包括多个镜像文件,通过不同的标签( tag )来进行区分。例如存放Ubuntu 操作系统镜

                           像的仓库,被称为Ubuntu 仓库,其中可能包括16.04 、18 . 04 等不同版本的镜像。

                                   根据所存储的镜像公开分享与否, Docker仓库可以分为公开仓库( Public )和私有仓库(

                           Private  )两种形式。

                                   目前,最大的公开仓库是官方提供的Docker Hub ,其中存放着数量庞大的镜像供用户下载。

                            国内不少云服务提供商(如腾讯云、阿里云等)也提供了仓库的本地源,可以提供稳定的国内访

                            问。

                                  当然,用户如果不希望公开分享自己的镜像文件, Docker 也支持用户在本地网络内创建一

                           个只能自己访问的私有仓库。

                                  当用户创建了自己的镜像之后就可以使用push 命令将它上传到指定的公有或者私有仓库。这

                           样用户下次在另外一台机器上使用该镜像时,只需要将其从仓库上pull下来就可以了。

                            

              三  安装Docker引擎

                           Docker 引擎是使用Docker 容器的核心组件,可以在主流的操作系统和云平台上使用,包括Linux

                    操作系统(如Ubuntu 、Debian , CentOS 、Red.hat 等), macOS 和Windows 操作系统,以及IBM 、

                    亚马逊、微软等知名云平台。

                           目前Docker 支持Docker 引擎、Docker Hub 、Docker Cloud 等多种服务。

                    --  Docker 引擎:包括支持在桌面系统或云平台安装Docker ,以及为企业提供简单安全弹性的容器集

                                               群编排和管理。

                    --  DockerHub :官方提供的云托管服务,可以提供公有或私有的镜像仓库;

                    --  DockerCloud :官方提供的容器云服务,可以完成容器的部署与管理,可以完整地支持容器化项

                                                  目,还有CI 、CD 功能。

                    1.  各种环境中Docker的安装,看书

第三章  使用Docker镜像

                             镜像是Docker 三大核心概念中最重要的, 自Docker 诞生之日起镜像就是相关社区最为热门的

                      关键词。

                             Docker 运行容器前需要本地存在对应的镜像, 如果镜像不存在, Docker 会尝试先从默认镜像

                      仓库下载(默认使用Docker Hub 公共注册服务器中的仓库), 用户也可以通过配置,使用自定义

                      的镜像仓库。

                             本章将围绕镜像这一核心概念介绍具体操作, 包括如何使用pull 命令从Docker Hub仓库中下载

                      镜像到本地;如何查看本地已有的镜像信息和管理镜像标签;如何在远端仓库使用search 命令进行

                      搜索和过滤;如何删除镜像标签和镜像文件;如何创建用户定制的镜像并且保存为外部文件。最后,

                      还将介绍如何往Docker Hub 仓库中推送自己的镜像。

                      1.  获取镜像

                         (1)命令讲解

                           命令:docker pull [OPTIONS] NAME[:TAG|@DIGEST](网上)

                                      docker [image] pull NAME [ :TAG] (书上)

                                      其中, NAME 是镜像仓库名称(用来区分镜像), TAG 是镜像的标签(往往用来表示版

                                      本信息) 。通常情况下, 描述一个镜像需要包括“名称+标签“ 信息。

                                      例如, 获取一个Ubuntu 18.04 系统的基础镜像可以使用如下的命令:

                $ docker pull ubuntu: 18.04
                18. 04: Pulling from library/ubuntu
Digest: sha256:e27e9d7f7f28d67aa9e2d7540bdc2b33254b452ee8e60f388875e5b7d9b2b696
Status: Downloaded newer image for ubun七u:18.04

                                      对于Docker镜像来说, 如果不显式指定TAG, 则默认会选择la迳釭标签,这会下载仓库中最

                                      新版本的镜像。

                                      下面的例子将从DockerHub 的Ubuntu仓库下载一个最新版本的Ubuntu操作系统的镜像:

                $ docker pull ubuntu
Using default tag: latest latest: Pulling from library/ubun七U Digest: sha256:e27e9d7f7f28d67aa9e2d7540bdc2b33254b452ee8e60f388875e5b7d9b2b696 Status: Downloaded newer image for ubun七u:latest

                                      该命令实际上下载的就是ubuntu:latest镜像。

                                      注:一般来说, 镜像的latest 标签意味着该镜像的内容会跟踪最新版本的变更而变化, 内

                                             容是不稳定的。因此,从稳定性上考虑,不要在生产环境中忽略镜像的标签信息或使

                                             用默认的latest标记的镜像。

                                      严格地讲,镜像的仓库名称中还应该添加仓库地址(即registry, 注册服务器)作为前缀,只

                                      是默认使用的是官方DockerHub服务,该前缀可以忽略。

                                             例如, docker pull ubuntu:18.04命令相当于

                                      docker pull registry.hub.docker.com/ubuntu:18.04命令,即从默认的注册服务器

                                      DockerHub Registry中的ubuntu仓库来下载标记为18.04的镜像。如果从非官方的仓库下载,

                                      则需要在仓库名称前指定完整的仓库地址。例如从网易蜂巢的镜像源来下载ubuntu:18.04镜

                                      像,可以使用如下命令,此时下载的镜像名称为hub.c.163 .com/public/ubuntu:18.04:

                $ docker pull hub.c.163.com/public/ubuntu:18.04

                                      pull命令支持的选项包括:

                                       -a, --all-ags=true|false: 是否获取仓库中的所有镜像,默认为否;

                                       --disable-content-trust:取消镜像的内容校验,默认为真

                         (2)使用代理加速Docker镜像的获取过程

                                   在Docker服务启动配置中增加--registry-mirror=proxy_URL来指定镜像代理服务地址

                                 (如https://registry.docker-en.com) 。

                      2.  查看镜像信息

                         (1)images命令

                                  使用docker images或docker image ls 命令可以列出本地主机上已有镜像的基本信息。

                                  例如:

                                 

                                (a)REPOSITORY

                                         来自于哪个仓库, 比如ubuntu 表示ubuntu 系列的基础镜像;

                                (b)TAG

                                          镜像的标签信息

                                (c)IMAGE ID

                                         镜像的ID(唯一标识镜像), 如果两个镜像的ID 相同, 说明它们实际上指向了同一个镜

                                         像, 只是具有不同标签名称而已;

                                (d)CREATED

                                         创建时间,说明镜像最后的更新时间

                                (e)SIZE

                                         镜像大小,优秀的镜像往往体积都很小

                                  IMAGES子命令的参数,看书。

                         (2)使用tag命令添加镜像标签

                                          为了方便在后续工作中使用特定镜像,还可以使用docker tag命令来为本地镜像任意添加

                                   新的标签。例如,添加一个新的myubuntu: latest镜像标签:

               $ docker七ag ubun七u:la七est myubuntu:latest

                                   再次使用docker images列出本地主机上镜像信息, 可以看到多了一个myubun:latest标签的

                                   镜像:

                                 

                                  细心的读者可能注意到, 这些myubuntu:latest镜像的ID跟ubun四: latest是完全一致的,它们

                                  实际上指向了同一个镜像文件,只是别名不同而巳。docker tag命令添加的标签实际上起到了

                                  类似链接的作用。

                         (3)inspect

                                  查看镜像详细信息,详细看书或自行百度

                         (4)hystory

                                  查看镜像历史,详细看书或自行百度

                      3.  搜寻镜像

                           命令:docker search [option] keyword

                           参数:

                                   -f, --fi迁er fil七er: 过滤输出内容;

                                   - -format string: 格式化输出内容;

                                   --limi七in七:限制输出结果个数, 默认为25 个;

                                   --no-trunc: 不截断输出结果。

                           例如, 搜索官方提供的带nginx关键字的镜像, 如下所示:

           $ docker search --filter=is-official=true nginx
           NAME DESCRIPTION STARS OFFICIAL AUTOMATED
           nginx Official build of Nginx. 7978 [OK]
           kong Open-source Microservice & API Management la··· 159 [OK]

                           再比如, 搜索所有收藏数超过4 的关键词包括tensorflow 的镜像:

           $ docker search --filter=stars=4 tensorflow
           NAME DESCRIPTION STARS OFFICIAL AUTOMATED
           tensorflow/tensorflow Official docker images for deep learning fra... 760
           xblaster/tensorflow-jupyter Dockerized Jupyter with tensorflow 47 [OK]
           jupyter/tensorflow-notebook Jupy七er Notebook Scientific Python stack w/ ... 46
           romilly/rpi-docker-tensorflow Tensorflow and Jupyter running in docker con... 16
           floydhub/tensorflow tensorflow 8 [OK]
           erroneousboat/tensorflow-pyt.hon3-jupyter Docker container with python 3 version of
           te... 8 [OK]
           tensorflow/tf_grpc_server Server for TensorFlow GRPC Distribu七ed Runti"· 5

                           可以看到返回了很多包含关键字的镜像, 其中包括镜像名字、描述、收藏数(表示该镜像的受欢迎

                           程度)、是否官方创建、是否自动创建等。默认的输出结果将按照星级评价进行排序。

                      4.  删除和清理镜像

                         (1)删除镜像

                                (a)使用标签删除镜像

                                         使用docker rmi 或docker image rm 命令可以删除镜像, 命令格式为

                                         docker rmi IMAGE [IMAGE ... ], 其中IMAGE 可以为标签或ID。删除镜像包括两个步骤,

                                         删除镜像标签和镜像本身。

                                         支持选项包括:

                                         -f, -force:强制删除镜像, 即使有容器依赖它;通常,当有镜像创建的容器存在时是不能

                                                          被删除的,使用该参数,使得镜像即使有容器依赖也会被删除。

                                         -no-prune: 不要清理未带标签的父镜像。

                                         例如, 要删除掉myubun 四: lates 七镜像, 可以使用如下命令:

                  $ docker rmi myubun四: latest
                  Untagged: myubun七u:latest

                                        读者可能会想到, 本地的ubuntu:la 七est 镜像是否会受到此命令的影响。无须担心,当同

                                        一个镜像拥有多个标签的时候, docker rmi 命令只是删除了该镜像多个标签中的指定标签

                                        而巳, 并不影响镜像文件。因此上述操作相当于只是删除了镜像0458a4468cbc 的一个标

                                        签副本而已。

                                               但当镜像只剩下一个标签的时候就要小心了, 此时再使用docker rmi 命令会彻底删除

                                        镜像。

                                (b)使用ID删除镜像

                                         当使用docker rmi 命令, 并且后面跟上镜像的ID (也可以是能进行区分的部分ID 串前缀)

                                         时, 会先尝试删除所有指向该镜像的标签, 然后删除该镜像文件本身。

                            (2)清理镜像

                                            使用Docker一段时间后, 系统中可能会遗留一些临时的镜像文件, 以及一些没有被使用

                                     的镜像, 可以通过docker image prune命令来进行清理。

                                     支持选项包括:

                                     a, -all: 删除所有无用镜像, 不光是临时镜像;

                                     filter filter: 只清理符合给定过滤器的镜像;

                                     -f, -force: 强制删除镜像, 而不进行提示确认。

                                     例如, 如下命令会自动清理临时的遗留镜像文件层, 最后会提示释放的存储空间:

                $ docker image prune -f
                . . .
                Total reclaimed space: 1.4 GB

                      5.  创建镜像

                           创建镜像的方法主要有三种: 基于已有镜像的容器创建、基千本地模板导入、基于Dockerfile 创建。

                           本节主要介绍Docker 的commit、impot和build 子命令。

                         (1)基于已有容器创建(commit命令)

                                  从容器创建一个新的镜像。

                                  语法:

              docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

                                 参数:                                  

                                  -a, --author="":作者信息;

                                  -c, - -change=[]:提交的时候执行Dockerfile指令, 包括CMD | ENTRYPOINT | ENV | EXPOSE

                                                              | LABEL | ONBUILD | VOLUME | WORKDIR 等

                                  -m, - -message=”“:提交消息;

                                  -p,  - -pause=true: 提交时暂停容器运行。

                                  示例:使用该命令创建一个新镜像 

                                            首先, 启动一个镜像, 并在其中进行修改操作。例如, 创建一个test文件, 之后退出,
                                            代码如下:                                         

                   $ docker run -it ubuntu:18.04 /bin/bash
                     root@a925cb40b3f0:/# touch test
                     root@a925cb40b3f0:/# exit

                                  记住容器的ID 为a925cb40b3£0。

                                  此时该容器与原ubun七u:18.04 镜像相比, 已经发生了改变, 可以使用docker[container] commt

                                  命令来提交为一个新的镜像。提交时可以使用ID 或名称来指定容器                          

              $ docker [con七ainer] commi七-m "Added a new file" -a "Docker Newbee" a925cb40b3f0
                test:0.1
                9e9c814023bcffc3e67e892a235afe6lb02f66a947d2747f724bd317dda02f27

                                  顺利的话, 会返回新创建镜像的ID 信息, 例如9e9c814023bcffc3e67e892a235afe6lb02f66a9

                                  47d2747f724bd317dda02f27。

                                  此时查看本地镜像列表, 会发现新创建的镜像已经存在了:

                                 

                         (2)基于本地模板导入(使用import命令)

                                         要直接导人一个镜像,可以使用OpenVZ 提供的模板来创建,或者用其他已导出的镜像模

                                  板来创建。OPENVZ 模板的下载地址为http: //openvz.org/Download/templat /precreated 。

                                  例如,下载了ubuntu-18.04 的模板压缩包,之后使用以下命令导人即可:

              $cat ubuntu-18.04-x86_64-minimal.tar.gz I docker import - ubuntu:lB.04

                                  然后查看新导人的镜像,已经在本地存在了:

                                 

                         (3)基于Dockerfile创建

                                         基于Dockerile 创建是最常见的方式。Dockerfile 是一个文本文件,利用给定的指令描述基

                                  于某个父镜像创建新镜像的过程。

                                  下面给出Dockerfile的一个简单示例,基于debian:stretch-slim 镜像安装Python 3环境,构成一

                                  个新的python:3 镜像:

                               

                                   

                                创建镜像的过程可以使用docker [image] build 命令,编译成功后本地将多出一个python:3 镜像:

                             

                                上面的例子是使用当前目录的Dockerfile文件创建镜像,下面的例子将使用Dockerfile文件的位置

                                创建镜像:

             $ docker build -f /path/to/a/Dockerfile .

 

                               上面两种方式是基于本地的Dockerfile文件创建镜像,下面是通过URL创建镜像。

                               示例:使用URL github.com/creack/docker-firefox 的 Dockerfile 创建镜像       

             docker build github.com/creack/docker-firefox

                      6.  存出和载入镜像

                         (1)存出镜像

                                  save命令

                                  docker save : 将指定镜像保存成 tar 归档文件。

                                  例如,导出本地的ubuntu:lS.04 镜像为文件ubuntu 18.04.tar ,如下所示:

                                  

                                  之后,用户就可以通过复制ubuntu 18.04.tar 文件将该镜像分享给他人。 

                         (2)导入镜像

                                  可以使用docker [image] load 将导出的tar 文件再导人到本地镜像库。支持-i,

                                  -input string选项,从指定文件中读人镜像内存。

                                  例如,从文件ubuntu 18.04.tar 导人镜像到本地镜像列表,如下所示:

                                 

                                    这将导人镜像及其相关的元数据信息(包括标签等) 。导人成功后,可以使用docker images

                                    命令进行查看, 与原镜像一致。

                            扩展:

                                   load和import的区别:

                                   两者的使用方法是一样的,导入压缩包生成镜像但是docker import可以重新指定镜像的名字。

                       7.  上传镜像

                             push命令,将本地的镜像上传到镜像仓库,要先登陆到镜像仓库。默认上传到Docker Hub 官方仓库。

                             语法:                             

            docker push [OPTIONS] NAME[:TAG]

                             用户在Docker Hub 网站注册后可以上传自制的镜像。例如,用户user 上传本地的test :latest 镜像,

                             可以先添加新的标签user/test:latest , 然后用docker [image ] push 命令上传镜像。

                          

                            第一次上传时,会提示输入登录信息或进行注册,之后登录信息会记录到本地~ / . docker目录下。

第四章  操作Docker容器

                       简单来说,容器是镜像的一个运行实例。

                     如果认为虚拟机是模拟运行的一整套操作系统(包括内核、应用运行态环境和其他系统

                     环境)和跑在上面的应用。那么Docker 容器就是独立运行的一个(或一组)应用,以及它们

                     必需的运行环境

              一  创建容器

                1. docker create

                         docker create [OPTIONS] IMAGE [COMMAND] [ARG...]

                         表示创建一个新的容器但不启动它。

            示例:

          runoob@runoob:~$ docker create  --name myrunoob  nginx:latest      
          09b93464c2f75b7b69f83d56a9cfc23ceb50a48a9db7652ee4c27e3e2cb1961f

                        --name:表示为容器指定一个名称。

                2. docker start

                           docker start [OPTIONS] CONTAINER [CONTAINER...]

                           启动容器,使用docker create 创建的容器并没有启动,使用该命令让容器启动起来。

                           示例:

           docker start myrunoob

                3. docker run

 

                    等于docker create+docker start

posted @ 2019-04-17 10:50  jialanshun  阅读(257)  评论(0编辑  收藏  举报