首页 > 代码库 > Docker第二章:docker基础1--镜像,容器&仓库

Docker第二章:docker基础1--镜像,容器&仓库

1、镜像

Dcoker运行容器之前需要本地存在对应的镜像,如果本地不存在对应的镜像,Docker会尝试从默认镜像仓库下载(默认使用Docker Hub公共注册服务器中的仓库),用户也可以通过配置,使用自定义的本地仓库。

  • 下载一个镜像到本地

命令:docker pull centos

[root@lwtest ~]# docker pull centos     #可以指定特定版本的镜像
latest: Pulling from centos

5932f74ff0cd: Pull complete 
4a7b890637c2: Pull complete 
4beff0251382: Pull complete 
Digest: sha256:cb2a2bffb199880da9c69e7f647c01c720c6f95b186a86cfbd3ef168b8032074
Status: Downloaded newer image for centos:latest
[root@lwtest ~]# 

  也可以从其他指定的仓库下载

  

docker pull d1.dockerpool.com:5000/cetos
  • 查看镜像信息

  使用docker images命令可以列出本地主机上已有的镜像

[root@lwtest ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
centos              latest              4beff0251382        3 weeks ago         192.5 MB
hello-world         latest              7a5a2d73abce        4 months ago        1.84 kB
[root@lwtest ~]#

  在列出的信息中,可以看到几个字段的信息:

  1、来自于哪个仓库,如centos仓库

  2、镜像的标签信息

  3、镜像的ID号,ID号是唯一的。

  4、创建时间

  5、镜像大小

  使用docker inspect ID号,可以查看该镜像的详细信息

  • 搜索镜像

  docker search TERM,可以搜索远端仓库中共享的镜像,默认搜索Docker Hub官方仓库中的镜像。

  支持的参数:

  1、--automated=false  仅显示自动创建的镜像。

  2、--no-trunc=false   输出信息不截断显示

  3、-s,--stars=0 指定仅显示评价为指定星级以上的镜像

[root@lwtest ~]# docker search centos
NAME                                   DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
centos                                 The official build of CentOS.                   3369      [OK]       
jdeathe/centos-ssh                     CentOS-6 6.9 x86_64 / CentOS-7 7.3.1611 x8...   70                   [OK]
nimmis/java-centos                     This is docker images of CentOS 7 with dif...   26                   [OK]
consol/centos-xfce-vnc                 Centos container with "headless" VNC sessi...   26                   [OK]
gluster/gluster-centos                 Official GlusterFS Image [ CentOS-7 +  Glu...   19                   [OK]
million12/centos-supervisor            Base CentOS-7 with supervisord launcher, h...   16                   [OK]
kinogmt/centos-ssh                     CentOS with SSH                                 13                   [OK]
egyptianbman/docker-centos-nginx-php   A simple and highly configurable docker co...   9                    [OK]
torusware/speedus-centos               Always updated official CentOS docker imag...   8                    [OK]
nathonfowlie/centos-jre                Latest CentOS image with the JRE pre-insta...   5                    [OK]
centos/mariadb55-centos7                                                               5                    [OK]
consol/sakuli-centos-xfce              Sakuli JavaScript based end-2-end testing ...   3                    [OK]
darksheer/centos                       Base Centos Image -- Updated hourly             3                    [OK]
harisekhon/centos-java                 Java on CentOS (OpenJDK, tags jre/jdk7-8)       2                    [OK]
harisekhon/centos-scala                Scala + CentOS (OpenJDK tags 2.10-jre7 - 2...   2                    [OK]
freenas/centos                         Simple CentOS Linux interactive container       1                    [OK]
blacklabelops/centos                   CentOS Base Image! Built and Updates Daily!     1                    [OK]
timhughes/centos                       Centos with systemd installed and running       1                    [OK]
vorakl/centos                          CentOS7, EPEL, tools. Updated/Tested daily!     1                    [OK]
kz8s/centos                            Official CentOS plus epel-release               0                    [OK]
grossws/centos                         CentOS 6 and 7 base images with gosu and l...   0                    [OK]
vcatechnology/centos                   A CentOS Image which is updated daily           0                    [OK]
vcatechnology/centos-ci                A CentOS image that is used in the VCA Tec...   0                    [OK]
januswel/centos                        yum update-ed CentOS image                      0                    [OK]
repositoryjp/centos                    Docker Image for CentOS.                        0                    [OK]
[root@lwtest ~]#  

  NAME:镜像仓库源的名称

 

  DESCRIPTION:镜像的描述

 

  OFFICIAL:是否docker官方发布

 

  •  删除镜像

 使用docker rmi 命令可以删除镜像,命令格式为docker rmi IMAGE,其中IMAGE可以为标签或ID

  • 创建镜像

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

  1、基于已有镜像的容器创建

         该方法主要是使用docker commit命令,格式为:docker commit 【OPTIONS】 CONTAINER 【REPOSITORY【:TAG】】,选项包括:

    -a,--author=“”   指定镜像是由何人提交

           -m,--message=“”   描述信息

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

     例:首先启动一个容器

  docker run -d -p 5000:5000 registry   

  使用docker ps/docker image可以查看容器的ID信息

docker commit -m="this is a test to update images" -a="lw" e218edb10161 lw/centos:v2
sha256:70bf1840fd7c0d2d8ef0a42a817eb29f854c1af8f7c59fc03ac7bdee9545aff8

    创建完成后可以使用docker images 查看镜像信息

[root@lwtest ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
lw/centos           v2                  cd58eba2104d        9 seconds ago       33.17 MB
centos              latest              4beff0251382        3 weeks ago         192.5 MB
registry            latest              bb682e0824bd        3 weeks ago         33.17 MB
hello-world         latest              7a5a2d73abce        4 months ago        1.84 kB
[root@lwtest ~]#

  2、基于本地模板导入

    在OPENVZ上面下载一个模板到本地,地址:https://openvz.org/Download/template/precreated

       例如我本地下载了一个centos的镜像:centos-5-x86-devel.tar.gz

   导入:

     cat centos-5-x86-devel.tar.gz |docker import - centos:test  #test为标签名字

  • 存出和导入镜像

  可以使用docker save和docker load命令来存出和导入镜像

  存出镜像:将镜像在镜像库中导入到本地

 1 [root@lwtest ~]# docker images
 2 REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
 3 lw/centos           v2                  cd58eba2104d        9 minutes ago       33.17 MB
 4 centos              latest              4beff0251382        3 weeks ago         192.5 MB
 5 registry            latest              bb682e0824bd        3 weeks ago         33.17 MB
 6 hello-world         latest              7a5a2d73abce        4 months ago        1.84 kB
 7 [root@lwtest ~]# docker save -o centos.tar lw/centos
 8 [root@lwtest ~]# ll
 9 total 34908
10 -rw-------. 1 root root     1211 Apr  6 16:59 anaconda-ks.cfg
11 -rw-r--r--  1 root root 35693056 Jun  5 10:57 centos.tar
12 -rw-r--r--. 1 root root     6623 Apr  7 14:13 inital.sh
13 -rw-r--r--. 1 root root    28614 Apr  6 16:59 install.log
14 -rw-r--r--. 1 root root     7572 Apr  6 16:57 install.log.syslog
15 [root@lwtest ~]# 

  导入镜像:将本地镜像导入到镜像库中

  例子略,可自行测试

  • 上传镜像

  使用docker push命令上传镜像到仓库,默认上传到DockerHub官方仓库(需要登录),命令格式:docker push NAME【:TAG】

  • 设置镜像标签

   可以使用docker tag来为镜像添加一个新的标签。

[root@lwtest ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
lw/centos           v2                  cd58eba2104d        17 minutes ago      33.17 MB
centos              latest              4beff0251382        3 weeks ago         192.5 MB
registry            latest              bb682e0824bd        3 weeks ago         33.17 MB
hello-world         latest              7a5a2d73abce        4 months ago        1.84 kB
[root@lwtest ~]# docker tag cd58eba2104d lw11/centos:ops
[root@lwtest ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
lw/centos           v2                  cd58eba2104d        19 minutes ago      33.17 MB
lw11/centos         ops                 cd58eba2104d        19 minutes ago      33.17 MB
centos              latest              4beff0251382        3 weeks ago         192.5 MB
registry            latest              bb682e0824bd        3 weeks ago         33.17 MB
hello-world         latest              7a5a2d73abce        4 months ago        1.84 kB
[root@lwtest ~]# 

   3、Docfile   后面讲

2、容器

  器是使用镜像创建的,相当于python中类的一个实例,对实例的任何操作不会对类本身造成影响,可以理解为容器是镜像实例化后的一个对象,在镜像的上一层创建一个可写层,对容器的任何操作都是在可写层进行的,对镜像本身无任何影响,镜像不会有任何改变,可以对容器进行commit创建一个新的镜像。

  •  创建容器

  1、docker create  创建一个新的容器,新建的容器处于stop状态,想要启动需要执行docker start命令

  命令格式:docker create [OPTIONS] IMAGE [COMMAND] [ARG...]

[root@lwtest ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
lw/centos           v2                  cd58eba2104d        19 minutes ago      33.17 MB
lw11/centos         ops                 cd58eba2104d        19 minutes ago      33.17 MB
centos              latest              4beff0251382        3 weeks ago         192.5 MB
registry            latest              bb682e0824bd        3 weeks ago         33.17 MB
hello-world         latest              7a5a2d73abce        4 months ago        1.84 kB
[root@lwtest ~]# docker create --name mycentos lw11/centos:ops
f01346d74213aad76712a28d3ed568cb898469dd737651021bf84162e892f394
[root@lwtest ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS                  PORTS                    NAMES
f01346d74213        lw11/centos:ops     "/entrypoint.sh /etc   29 seconds ago                                                       mycentos            
46adfd7889ea        registry            "/entrypoint.sh /etc   2 days ago          Up 2 days               0.0.0.0:5000->5000/tcp   agitated_einstein   
68b8d624ca6d        centos              "/bin/bash"            9 days ago          Exited (0) 9 days ago                            drunk_pare          
[root@lwtest ~]# 

  --name 指定容器名字

  2、docker run创建并启动一个容器

  命令格式:docker run  镜像名,命令【可选】

[root@lwtest ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
lw/centos           v2                  cd58eba2104d        3 hours ago         33.17 MB
lw11/centos         ops                 cd58eba2104d        3 hours ago         33.17 MB
centos              latest              4beff0251382        3 weeks ago         192.5 MB
registry            latest              bb682e0824bd        3 weeks ago         33.17 MB
hello-world         latest              7a5a2d73abce        4 months ago        1.84 kB
[root@lwtest ~]# docker run centos 
[root@lwtest ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS                     PORTS                    NAMES
391a4afa7f97        centos              "/bin/bash"            8 seconds ago       Exited (0) 6 seconds ago                            stupefied_meitner   
f01346d74213        lw11/centos:ops     "/entrypoint.sh /etc   2 hours ago                                                             mycentos            
46adfd7889ea        registry            "/entrypoint.sh /etc   2 days ago          Up 2 days                  0.0.0.0:5000->5000/tcp   agitated_einstein   
68b8d624ca6d        centos              "/bin/bash"            9 days ago          Exited (0) 9 days ago                               drunk_pare          
[root@lwtest ~]# 
[root@lwtest ~]# docker run centos  /bin/echo "Hello world"   #跟本地直接执行/bin/echo "Hello world"感觉不到区别
 Hello world [root@lwtest ~]# docker ps -a 
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8db0cc40e83c centos
"/bin/echo ‘Hello wo 4 seconds ago Exited (0) 2 seconds ago lonely_payne
391a4afa7f97 centos "/bin/bash" About a minute ago Exited (0) About a minute ago stupefied_meitner
f01346d74213 lw11
/centos:ops "/entrypoint.sh /etc 2 hours ago mycentos
46adfd7889ea registry "/entrypoint.sh /etc 2 days ago Up 2 days 0.0.0.0:5000->5000/tcp agitated_einstein
68b8d624ca6d centos "/bin/bash" 9 days ago Exited (0) 9 days ago drunk_pare [root@lwtest ~]#

当利用docker run来创建并启动容器时,docker在后台运行的操作包括:

    • 检测本地是否存在指定镜像,如果不存在,则首先在公共仓库中下载。
    • 利用镜像创建并启动一个容器。
    • 分配一个文件系统,并在只读的镜像层外面挂载一层可写层。
    • 从宿主机配置的网桥接口中桥接一个虚拟接口道容器中去。
    • 从地址池配置一个IP地址给容器。
    • 执行用户执行的应用程序。
    • 执行完毕后容器被终止。

 下面的命令则启动一个bash终端,允许用户进行交互:

[root@lwtest ~]# docker run -t -i centos  /bin/bash       
[root@ce1b92def01f /]# 
[root@ce1b92def01f /]# ls
anaconda-post.log  bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@ce1b92def01f /]# pwd
/

[root@ce1b92def01f /]# exit
exit
[root@lwtest ~]#

其中-t选项让Docker分配一个伪终端,并绑定到容器的标准输入上,-i则让容器的标准输入保持打开。在容器内执行ps查看进程,可以看到只运行了bash应用,并没有运行其他不需要的进程,exit退出容器后,改容器就会自动处于终止状态。

  3、守护态运行

  更多时候,需要让Docker容器在后台以守护态形式运行,可以通过添加-d参数来实现

[root@lwtest ~]#  docker run -itd centos /bin/bash
30ed4e190c3bdb69af44bcb2809dc01f346c880e4922e50285893aa78b957667
[root@lwtest ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                    NAMES
30ed4e190c3b        centos              "/bin/bash"            3 seconds ago       Up 2 seconds                                 gloomy_mestorf      
46adfd7889ea        registry            "/entrypoint.sh /etc   4 days ago          Up 4 days           0.0.0.0:5000->5000/tcp   agitated_einstein   
[root@lwtest ~]#

 

  • 进入容器

  进入到运行在后台的容器的方法常见的有三种:docker attach命令、docker exec命令,以及nsenter工具等

  1、attach命令

    docker  attach是docker自带的命令

[root@lwtest ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                    NAMES
30ed4e190c3b        centos              "/bin/bash"            3 seconds ago       Up 2 seconds                                 gloomy_mestorf      
46adfd7889ea        registry            "/entrypoint.sh /etc   4 days ago          Up 4 days           0.0.0.0:5000->5000/tcp   agitated_einstein   
[root@lwtest ~]# docker attach gloomy_mestorf      #gloomy_mestorf是容器名字 
[root@30ed4e190c3b /]# [root@30ed4e190c3b /]# ls anaconda-post.log bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var

    使用attach命令进入容器并不方便,当多个窗口同时attac到同一个容器的时候,所有窗口都会同步显示

  2、exec命令

  docker 自1.3版本起,提供了一个更加方便的工具exec,可以直接在容器内运行命令。

[root@lwtest ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                    NAMES
30ed4e190c3b        centos              "/bin/bash"            58 minutes ago      Up 21 seconds                                gloomy_mestorf      
46adfd7889ea        registry            "/entrypoint.sh /etc   4 days ago          Up About a minute   0.0.0.0:5000->5000/tcp   agitated_einstein   
[root@lwtest ~]# docker exec -it 30ed4e190c3b /bin/bash    #可以跟容器名字,也可以跟ID号
[root@30ed4e190c3b /]# exit
exit
[root@lwtest ~]# docker exec -it gloomy_mestorf /bin/bash             
[root@30ed4e190c3b /]# exit
exit
[root@lwtest ~]#

  3、nsenter工具

  ①nsenter 工具在Linux2.23版本后包含,如果系统中没有该命令,首先安装:

curl https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz | tar -zxf-
cd util-linux-2.24
./configure --without-ncurses
make nsenter
cp nsenter /usr/local/bin

  ②连接到容器:

  首先需要找到容器进程的PID,然后通过PID进入到容器:

[root@lwtest ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                    NAMES
30ed4e190c3b        centos              "/bin/bash"            58 minutes ago      Up 21 seconds                                gloomy_mestorf        
[root@lwtest ~]#docker inspect --format "{{ .State.Pid }}" 30ed4e190c3b
2788
[root@lwtest ~]# nsenter --target 2788 --mount --uts --ipc --net --pid
[root@30ed4e190c3b /]# ls
anaconda-post.log  bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@30ed4e190c3b /]#
  • 删除容器

  可以使用docker rm命令删除容器,命令格式:

  docker rm  容器ID/容器名字

  支持的参数包括:

  -f,--force=false 强制终止并删除一个运行中的容器

  -l,--link=false 删除容器的连接,但保留容器

  -v,--volumes=false 删除容器挂载的数据卷

  

[root@lwtest ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                    NAMES
30ed4e190c3b        centos              "/bin/bash"            About an hour ago   Up 47 minutes                                gloomy_mestorf      
46adfd7889ea        registry            "/entrypoint.sh /etc   4 days ago          Up 48 minutes       0.0.0.0:5000->5000/tcp   agitated_einstein 

[root@lwtest ~]# docker rm -f agitated_einstein
agitated_einstein
[root@lwtest ~]# 
[root@lwtest ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
30ed4e190c3b        centos              "/bin/bash"         About an hour ago   Up 50 minutes                           gloomy_mestorf      
[root@lwtest ~]# 
  • 导入和导出容器

  1、导出容器

     使用docker export命令将一个已经创建的容器导出到一个文件,不管此时这个容器是否处于运行状态。

   docker export 后可跟容器ID/容器name

    

[root@lwtest ~]# docker ps -a
CONTAINER ID        IMAGE        COMMAND             CREATED             STATUS                    PORTS         NAMES
30ed4e190c3b        centos       "/bin/bash"         About an hour ago   Up 58 minutes                           gloomy_mestorf      
26a89d53df8e        centos       "/bin/bash"         About an hour ago   Exited (0) About an hour ago            mad_mclean          
ce1b92def01f        centos       "/bin/bash"         46 hours ago        Exited (0) 46 hours ago                 drunk_wright                
[root@lwtest ~]# docker export 30ed4e190c3b >test1.tar 
[root@lwtest ~]# ls
anaconda-ks.cfg  centos.tar  inital.sh  install.log  install.log.syslog  test1.tar
[root@lwtest ~]# docker export mad_mclean>test2.tar
[root@lwtest ~]# ls
anaconda-ks.cfg  centos.tar  inital.sh  install.log  install.log.syslog  test1.tar  test2.tar
[root@lwtest ~]#

  2、导入容器

  可以使用docker import 命令将导出的文件导入成镜像,注意:这里是导入成镜像。

 

 

3、仓库

  因为下载镜像会用到仓库,所以,先说仓库

 

仓库(Repository)是集中存放镜像的地方
仓库和注册服务器(Registry):
注册服务器是存放仓库的具体服务器,每个服务器上可以有多个仓库,每个仓库下面有多个镜像。
例如:dl.dockerpool.com/centos来说,dl.dockerpool.com是注册服务,centos是仓库名
仓库又分公共仓库和私有仓库

1.1 Docker Hub

Docker官方维护了一个公共仓库https://hub.docker.com

  • 登录

  首先在官网上面创建一个账户,然后在服务器上面使用docker login登录:

Password: [root@lwtest ~]# docker login
Username: xxxx
Password: 
Email: xxxxx@qq.com
WARNING: login credentials saved in /root/.docker/config.json
Login Succeeded
[root@lwtest ~]#
  • 创建私有仓库
docker run -d -p 5000:5000 registry

 上面的命令将自动创建一个registry容器,创建本地的私有仓库服务,此时,在本地将启动一个私有仓库服务,端口为5000.

  默认情况下,会将仓库创建在容器的/tmp/registry目录下,可以通过 -v 参数来将镜像文件存放在本地的指定路径上

  • 管理私有仓库镜像

  将已有镜像添加新的标记

[root@lwtest ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
lw/centos           v2                  cd58eba2104d        2 days ago          33.17 MB
lw11/centos         ops                 cd58eba2104d        2 days ago          33.17 MB
centos              latest              4beff0251382        3 weeks ago         192.5 MB
registry            latest              bb682e0824bd        3 weeks ago         33.17 MB
hello-world         latest              7a5a2d73abce        4 months ago        1.84 kB
[root@lwtest ~]# docker tag centos:latest 10.40.1.240:5000/test
[root@lwtest ~]# docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
lw/centos               v2                  cd58eba2104d        2 days ago          33.17 MB
lw11/centos             ops                 cd58eba2104d        2 days ago          33.17 MB
10.40.1.240:5000/test   latest              4beff0251382        3 weeks ago         192.5 MB
centos                  latest              4beff0251382        3 weeks ago         192.5 MB
registry                latest              bb682e0824bd        3 weeks ago         33.17 MB
hello-world             latest              7a5a2d73abce        4 months ago        1.84 kB
[root@lwtest ~]# 

  使用docker push上传标记的镜像到私有仓库

[root@lwtest ~]# docker push 10.40.1.240:5000/test
The push refers to a repository [10.40.1.240:5000/test] (len: 1)
4beff0251382: Image already exists 
4a7b890637c2: Image already exists 
5932f74ff0cd: Image successfully pushed 
Digest: sha256:59e13fd53a3804bca8f110d1a6eb3085e95447471dd53b853ad5336f359c31ab

现在可以在任意一台能访问到10.40.1.240地址的机器上面下载这个镜像了

 

Docker第二章:docker基础1--镜像,容器&仓库