获取镜像

命令格式



docker pull [选项] [Docker Registry地址]<仓库名>:<标签>



[root@localhost ~]# docker pull redis:latest
latest: Pulling from library/redis
d13d02fa248d: Already exists 
039f8341839e: Already exists 
21b9cdda7eb9: Already exists 
b696c7f97b5d: Pull complete 
2fbb3f7700f1: Pull complete 
bf8057ee2aa1: Pull complete 
Digest: sha256:de4e675f62e4f3f71f43e98ae46a67dba92459ff950de4428d13289b69328f96
Status: Downloaded newer image for redis:latest



运行



[root@localhost ~]#7.3.1611 bash
[root@4e10dc4d0f52 /]# cat /etc/os-release 
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

[root@4e10dc4d0f52 /]# exit
exit



  • -it :这是两个参数,-i:交互式操作,-t:终端. 这里打算进入bash 执行一些命令并查看返回结果,因此需要交互式终端。
  • --rm :这个参数是说容器退出后随之将其删除,避免浪费空间。
  • centos:7.3.1611 :指用 centos:7.3.1611 镜像作为基础来启动容器。
  • bash : 放在镜像名后的命令,这是希望有个交互式shell,因此用的是bash.
  • exit 退出容器

 Docker 1.13+ 推荐使用 docker image 管理



#docker image pull centos:7 #docker container run -it --rm \ centos:7 \ bash



列出镜像

列出镜像命令 docker images



[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               v3                  5f5ae3a99038        2 days ago          108MB
nginx               v2                  376cdbd21e24        3 days ago          108MB
redis               latest              c3eb149853f0        6 days ago          107MB
centos              7                   3fa822599e10        11 days ago         204MB
centos              latest              3fa822599e10        11 days ago         204MB
nginx               latest              9e7424e5dbae        2 weeks ago         108MB
nginx               1.12.2              db5c5ed76327        5 weeks ago         108MB
redis               3.2.11              d3f696a9f230        5 weeks ago         99.7MB
mysql               8.0.3               e691422324d8        5 weeks ago         343MB
centos              7.3.1611            66ee80d59a68        5 weeks ago         192MB



列表包含了仓库名、标签、镜像ID、创建时间以及所占用的空间

镜像体积

Docker 使用 Union FS,相同的层 只需要保存一份即可,因此实际镜像硬盘占用空间很可能要比这个列表镜像大小的总和要小的多

查看镜像、容器、数据卷所占用的空间



[root@localhost ~]# docker system df
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              9                   3                   1.023GB             1.023GB (99%)
Containers          4                   3                   102B                0B (0%)
Local Volumes       0                   0                   0B                  0B
Build Cache                                                 0B                  0B



虚悬镜像



#docker images -f dangling=true



删除虚悬镜像



#docker image prune



中间层镜像

显示中间层镜像



#docker images -a



列出部分镜像



# docker images centos
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              7                   3fa822599e10        11 days ago         204MB
centos              latest              3fa822599e10        11 days ago         204MB
centos              7.3.1611            66ee80d59a68        5 weeks ago         192MB



# docker images centos:7.3.1611 REPOSITORY TAG IMAGE ID CREATED SIZE centos 7.3.1611 66ee80d59a68 5



docker images 支持过滤参数 --filter ,简写 -f ,例如列出 centos:7 之后建立的镜像



# docker images -f since=centos:7
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               v3                  5f5ae3a99038        3 days ago          108MB
nginx               v2                  376cdbd21e24        3 days ago          108MB
redis               latest              c3eb149853f0        6



列出再 redis:3.2.11 之前建立的镜像



# docker images -f before=redis:3.2.11 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mysql               8.0.3               e691422324d8        5 weeks ago         343MB
centos              7.3.1611            66ee80d59a68        5



以特定格式显示

显示出ID列表



# docker images -q
5f5ae3a99038
376cdbd21e24
c3eb149853f0
3fa822599e10
3fa822599e10
9e7424e5dbae
db5c5ed76327
d3f696a9f230
e691422324d8
66ee80d59a68



# docker images --format "{{.ID}}: {{.Repository}}"
5f5ae3a99038: nginx
376cdbd21e24: nginx
c3eb149853f0: redis
3fa822599e10: centos
3fa822599e10: centos
9e7424e5dbae: nginx
db5c5ed76327: nginx
d3f696a9f230: redis
e691422324d8: mysql
66ee80d59a68: centos



# docker images --format "{{.ID}}\t{{.Repository}}\t{{.Tag}}"
5f5ae3a99038    nginx    v3
376cdbd21e24    nginx    v2
c3eb149853f0    redis    latest
3fa822599e10    centos    7
3fa822599e10    centos    latest
9e7424e5dbae    nginx    latest
db5c5ed76327    nginx    1.12.2
d3f696a9f230    redis    3.2.11
e691422324d8    mysql    8.0.3
66ee80d59a68    centos    7.3.1611



Docker 1.13+推荐使用 docker image ls



# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               v3                  5f5ae3a99038        3 days ago          108MB
nginx               v2                  376cdbd21e24        3 days ago          108MB
redis               latest              c3eb149853f0        6 days ago          107MB
centos              7                   3fa822599e10        11 days ago         204MB
centos              latest              3fa822599e10        11 days ago         204MB
nginx               latest              9e7424e5dbae        2 weeks ago         108MB
nginx               1.12.2              db5c5ed76327        5 weeks ago         108MB
redis               3.2.11              d3f696a9f230        5 weeks ago         99.7MB
mysql               8.0.3               e691422324d8        5 weeks ago         343MB
centos              7.3.1611            66ee80d59a68        5 weeks ago         192MB



利用 commit 理解镜像构成



#docker run --name webserver -d -p 80:80



这条命令会用 nginx 镜像启动一个容器,命名为 webserver ,并且映射了 80 端口,这样就可以用浏览器访问这个nginx服务器,

访问地址为服务器 ip:80

使用浏览器下载docker镜像 docker 浏览器镜像_shell

也可以是用 docker exec 命令进入容器,修改页面内容



#docker exec -it webserver bash
root@c4c0c4e556b2:/# echo '<h1>Hello, Captain</h1>'index.html
root@c4c0c4e556b2:/# exit
exit



使用浏览器下载docker镜像 docker 浏览器镜像_nginx_02

修改了容器文件,也就是改动了容器的存储层。可以通过 docker diff 命令看到具体的改动



# docker diff webserver
C /run
A /run/nginx.pid
C /usr
C /usr/share
C /usr/share/nginx
C /usr/share/nginx/html
C /usr/share/nginx/html/index.html
C /root
A /root/.bash_history
C /var
C /var/cache
C /var/cache/nginx
A /var/cache/nginx/scgi_temp
A /var/cache/nginx/uwsgi_temp
A /var/cache/nginx/client_temp
A /var/cache/nginx/fastcgi_temp
A /var/cache/nginx/proxy_temp



Docker 提供了一个 docker commit 命令,可以将容器的存储层保存下来成为镜像。

docker commit 语法格式为:

docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]

用下面的命令将容器保存为镜像:



# docker commit \
> --author "Captain Wong <wangchao_90@163.com>" \
> --message "修改了默认网页" \ nginx:v4
sha256:2c0772fc693d358c06e48a22c354991e1bb36a0b840d70220f538d13c37aaa34



--author 是指定修改的作者;--message 是记录本次修改的内容

用 docker images 或 docker image ls查看新定制的镜像:



# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               v4                  2c0772fc693d        4 minutes ago       108MB
nginx               v3                  5f5ae3a99038        3 days ago          108MB
nginx               v2                  376cdbd21e24        4 days ago          108MB
redis               latest              c3eb149853f0        7 days ago          107MB
centos              7                   3fa822599e10        12 days ago         204MB
centos              latest              3fa822599e10        12 days ago         204MB
nginx               latest              9e7424e5dbae        2 weeks ago         108MB
nginx               1.12.2              db5c5ed76327        5 weeks ago         108MB
redis               3.2.11              d3f696a9f230        5 weeks ago         99.7MB
mysql               8.0.3               e691422324d8        5 weeks ago         343MB
centos              7.3.1611            66ee80d59a68        5 weeks ago         192MB



还可以用 docker history 具体查看镜像内的历史记录



# docker history nginx:v4



新的镜像定制好后,可以来运行这个镜像



# docker run --name web4 -d -p 81:80



可以直接访问 ip:81 , 内容和之前修改后的 webserver 一样

使用Dockerfile定制镜像

Dockerfile 是一个文本文件,其内容包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层如何构建。

使用 Dockerfile 定制 nginx 镜像:



# mkdir mynginx
# cd mynginx
# touch Dockerfile



其内容为



FROM nginx
RUN echo '<h1>Hello, Captian!</h1>' > /usr/share/nginx/html/index.html



FROM 指定基础镜像

RUN 执行命令

RUN 指令是用来执行命令行命令的。RUN 指令在定制镜像时是最常用的指令之一。格式有两种:

  • shell 格式: RUN <命令>,就像直接在命令行中输入的命令一样。上文写的 Dockerfile 中的 RUN 指令就是这种格式
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html



  • exec 格式:RUN ["可执行文件","参数1","参数2"] ,这更像是函数调用中的格式。

Dockerfile 支持 Shell 类的行尾添加 \ 的命令换行方式,以及行首 # 进行注释的格式。

镜像构建时,一定要确保每一层只添加真正需要添加的东西,任何无关的东西都应该清理掉。

构建镜像

再 Dockerfile 文件所在目录执行:



# docker build -t nginx:v6 .
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM nginx
 ---> 9e7424e5dbae
Step 2/2 : RUN echo '<h1>Hello, Captain!</h1>' > /usr/share/nginx/html/index.html
 ---> Running in 42ec0aaec822
 ---> 1183337d5396
Removing intermediate container 42ec0aaec822
Successfully built 1183337d5396
Successfully tagged nginx:v6



这里使用了 docker build 命令进行镜像构建。其格式为:



docker build [选项] <上下文路劲/URL/->



此处指定了最终镜像的名称 -t nginx:v6

镜像构建上下文(Context)

 其他 docker build 的用法

  • 直接用 Git repo 进行构建
# docker build https://github.com/twang2218/gitlab-ce-zh.git#:10.0
Sending build context to Docker daemon  4.608kB
Step 1/8 : FROM gitlab/gitlab-ce:10.0.3-ce.0
10.0.3-ce.0: Pulling from gitlab/gitlab-ce
9fb6c798fa41: Pull complete 
3b61febd4aef: Pull complete 
9d99b9777eb0: Pull complete 
d010c8cf75d7: Pull complete 
7fac07fb303e: Pull complete 
ae2fdb575b06: Pull complete 
e17254fcdaa5: Pull complete 
51ee0e488e7a: Pull complete 
0e358475ab4c: Pull complete 
097988c3d66c: Pull complete 
70a83b240617: Pull complete 
Digest: sha256:a4679291942fbac737509548b70878e4bf969b8a75f7223ced6bf991c8089a8a
Status: Downloaded newer image for gitlab/gitlab-ce:10.0.3-ce.0
 ---> 453d64ae84c7
Step 2/8 : ENV GITLAB_VERSION v10.0.3
 ---> Running in 83e710d92841
 ---> 02a6abab42cc
...



  •  用给定的tar压缩包构建

# docker build http://server/context.tar.gz



  • 从标准输入中读取Dockerfile进行构建

docker build - < Dockerfile





cat Dockerfile | docker build -



  • 从标准输入中读取上下文压缩包进行构建

# docker build - < context.tar.gz



Docker 1.13+

在 Docker 1.13+ 版本中推荐使用 docker image 来管理镜像



# docker image build