获取镜像
命令格式
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 exec 命令进入容器,修改页面内容
#docker exec -it webserver bash
root@c4c0c4e556b2:/# echo '<h1>Hello, Captain</h1>'index.html
root@c4c0c4e556b2:/# exit
exit
修改了容器文件,也就是改动了容器的存储层。可以通过 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