一、查看和删除镜像

方法一:一般情况下镜像的存储地址为 /var/lib/docker

方法二:通过docker info 查看镜像信息

1. 列出镜像

1
2
3
4
5
docker images [OPTSIONS] [REPOSITORY]
-a ,--all
-f , --filter=[]
--no-trunc(使用截断的方式显示)
-q,--quiet(只显示ID)

2. 镜像标签和仓库

REPOSITORY 仓库(独立的镜像)
RESGISTRY 仓库(镜像存储服务)
TAG (ubuntu:14.04 ubuntu:latest)

3. 查看镜像

1
docker inspect [OPTIONS] CONTAINER|IMAGE [ CONTAINER|IMAGE...]

4. 删除镜像

1
2
3
docker rmi [OPTIONS] IMAGE
-f,--force 强制删除
--no-prune (不会删除未打标签的父镜像)

扩展:docker 并没有删除多个镜像的操作

删除所有 ubuntu 镜像 docker rmi $(docker images -q ubuntu)

二、获取和推送镜像

1. 查找镜像

方法一:Docker Hub(需注册账户)
方法二:命令行搜索

1
2
3
4
5
docker search [OPTIONS] TERM
-- automated (自动化构建镜像)
--no-trunc (截断形式)
-s,--stars=0 (评分)
示例:docker search -s 3 ubuntu(搜索3星以上的 ubuntu 镜像)

2. 拉取镜像

1
2
docker pull [OPTIONS] NAME [:TAG]
-a,--all-tags (所有标记)

使用–registry-mirror选项,添加国内镜像进行加速

  1. 修改:vim /etc/default/docker
  2. 添加:DOCKER_OPTS="--registry-mirror=镜像地址"
    我们这里使用daocloud(需注册账户),使用加速器生成的链接配置以上的镜像地址
  3. 重新启动 docker 守护进程 service docker restart
  4. 查看 docker 状态 ps -ef |grep docker

3. 推送镜像

1
docker push [OPTIONS] NAME [:TAG]

三、构建镜像

1
2
3
4
优点:
- 保存对容器的修改,并再次使用
- 自定义镜像的能力
- 以软件的形式打包并分发服务及其运行环境

方法一

docker commit 通过容器构建镜像

1
2
3
4
docker commit [OPTIONS] CONTAINER [REPOSITORY]
-a,--author
-m,--message
-p,--pause (是否暂停正在运行的容器)

示例:(用前面的 web 容器生成 ubuntu/commit_test1镜像,再生成以 ubuntu/commit_test1 镜像为基础的两个 nginx_web 容器)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
root@wkaanig:~# docker commit -a 'wkaanig' -m 'nginx' web ubuntu/commit_test1 # 将web容器构建成 ububtu/commit_test1 的镜像文件
sha256:27b64732dde89f0f6f466e9dc0da7b06bdc7547cf37a878515b4b42167f2f657
root@wkaanig:~# docker images # 查看镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu/commit_test1 latest 27b64732dde8 About a minute ago 206MB
ubuntu latest a2a15febcdf3 4 weeks ago 64.2MB
hello-world latest fce289e99eb9 8 months ago 1.84kB
root@wkaanig:~# docker run -d --name nginx_web1 ubuntu/commit_test1 nginx -g "daemon off;" # 以前台方式运行镜像到 nginx_web1 的容器中
43b432b814019b7e1ba111ef064bb800e986476e38e4947730c189511e7b1d49
root@wkaanig:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
43b432b81401 ubuntu/commit_test1 "nginx -g 'daemon of…" 6 seconds ago Up 5 seconds 80/tcp nginx_web1
root@wkaanig:~# docker run -d --name nginx_web2 -p 80 ubuntu/commit_test1 nginx -g "daemon off;" # 以前台方式运行镜像到 nginx_web2 的容器中 指定端口为80
3674c7cef4f4f7e9c2d7040fd5dd2d8776f08761d7db3934dca5c23132f2b9af
root@wkaanig:~# docker ps # 查看镜像
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3674c7cef4f4 ubuntu/commit_test1 "nginx -g 'daemon of…" 8 seconds ago Up 7 seconds 0.0.0.0:32769->80/tcp nginx_web2
1
2
3
4
5
6
7
8
9
root@wkaanig:~# curl http://127.0.0.1:32769 # 测试访问端口
<html>
<head>
<title>Nginx in docker<title>
<head>
<body>
<h1>hello Docker</h1>
<body>
<html>

方法二

docker bulid 通过Dockerfile文件构建

(1)写入dockerfile 文件

Dockerfile文件内容:(基础指令必须存在,其余指令视情况而定)

  1. 基础指令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 示例:dockerfile_01
# FROM <image>必须是已存在的镜像即基础镜像
FROM ubuntu:14.04

# MAINTAINER <name>指定镜像的作者信息,包含镜像所有者和联系信息
MAINTAINER wkaanig "wkaanig721@163.com"
# RUN 指定当前镜像中运行的命令,有以下两种方式
# 1.RUN <command> (shell 模式 以 /bin/sh -c command 执行命令 例:RUN echo hello )
# 2.RUN["executable","param1","param2"] (exec 模式 例:RUN ["/bin/bash","-c","echo hello"])
RUN apt-get update
RUN apt-get insatll -y nginx

# EXPOSE <port> [<port>] 指定运行该镜像的容器使用的一个或多个端口
# 出于安全考虑 docker 并不会打开端口 ,需要在运行中添加对端口的映射,即:-p 80
# 例:docker run -d --name nginx_web1 -p 80 ubuntu/commit_test1 nginx -g
EXPOSE 80
  1. 其余指令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# 1.在容器执行时运行命令的指令 
# CMD 在容器运行中的指令 不同于RUN RUN在镜像构建中运行,CMD在容器运行中运行,RUN 可以覆盖 CMD
# 1.CMD ["executable","param1","param2"](exec 模式)
# 2.CMD command param1 param2 (shell 模式)
# 3.CMD["param1","param2"](作为ENTERPOINT指令的默认参数)
# 示例:dockerfile_02
FROM ubuntu:14.04
MAINTAINER wkaanig "wkaanig721@163.com"
RUN apt-get update
RUN apt-get insatll -y nginx
EXPOSE 80
CMD ["/usr/sbin/nginx","-g","daemon off;"]

# ENTERYPOINT 不会被docker RUN 命令所覆盖,若想覆盖可以使用docker run --enterpoint 覆盖
# 示例1:dockerfile_03
FROM ubuntu:14.04
MAINTAINER wkaanig "wkaanig721@163.com"
RUN apt-get update
RUN apt-get insatll -y nginx
EXPOSE 80
ENTERYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
# 示例2:dockerfile_04 ENTERYPOINT 和 CMD 组合命令
FROM ubuntu:14.04
MAINTAINER wkaanig "wkaanig721@163.com"
RUN apt-get update
RUN apt-get insatll -y nginx
EXPOSE 80
ENTERYPOINT ["/usr/sbin/nginx"]
CMD ["-g"] # 可被 docker run 命令覆盖

# 2.设置镜像的目录和文件
# ADD 与 COPY 的区别,ADD 包含类似tar的解压功能。如果单纯复制文件,Docker推荐使用COPY

# ADD <src>...<dest> 来源地址(本地的相对路径(推荐)或URL)和目标地址(镜像中的绝对路径)
# COPY <src>...<dest> 来源地址(本地的相对路径(推荐)或URL)和目标地址(镜像中的绝对路径)
# 示例:dockerfile_05
FROM ubuntu:14.04
MAINTAINER wkaanig "wkaanig721@163.com"
RUN apt-get update
RUN apt-get insatll -y nginx
COPY index.html /usr/share/nginx/html/ # 通过本地编写的 index.html(在 dockerfile 的同级目录下)替换 nginx 的默认页
EXPOSE 80
ENTERYPOINT ["/usr/sbin/nginx","-g","daemon off;"]

# VOLUME ["/data"] 添加卷

# 3.镜像构建及容器运行中的环境设置
# WORKDIR /path/to/workdir 设置工作目录,enterpoint和cmd都会在这个目录下执行
# ENV <key>=<value> 指定环境
# USER daemon 指定用户模式

# 4.镜像触发器
# ONBUILD [INSTRUCTION] 当一个镜像被其他镜像作为基础镜像时执行,在构建过程中插入
# 示例:dockerfile_06
FROM ubuntu:14.04
MAINTAINER wkaanig "wkaanig721@163.com"
RUN apt-get update
RUN apt-get insatll -y nginx
ONBUILD COPY index.html /usr/share/nginx/html/ # 通过本地编写的 index.html(在 dockerfile 的同级目录下)替换 nginx 的默认页
EXPOSE 80
ENTERYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
# 注意:示例 dockerfile_06 的 ONBUILD 会在以该镜像为基础镜像构建的子镜像中执行,在本次构建过程中不会执行

(2) docker bulid 构建镜像

1
2
3
4
5
6
7
docker bulid [OPTIONS] PATH|URL|- # PATH和URL指的是dockerfile的路径
--force-rm
--no-cache
--pull
-q,--quiet
--rm
-t,--tag

示例:

1
2
docker bulid -t="wkaanig/docker_file_test1" . # 在当前文件夹下构建名为wkaanig/docker_file_test1 的镜像
docker run -p 80 --name cmd_test1 -d wkaanig/docker_file_test1 # 以 80 端口和守护模式运行该镜像的 cmd_test1 容器