获取镜像
命令格式
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 ~]# docker run -it --rm \ > centos: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 weeks ago 192MB
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 days ago 107MB
列出再 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 weeks ago 192MB
以特定格式显示
显示出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
这条命令会用 nginx 镜像启动一个容器,命名为 webserver ,并且映射了 80 端口,这样就可以用浏览器访问这个nginx服务器,
访问地址为服务器 ip:80
也可以是用 docker exec 命令进入容器,修改页面内容
#docker exec -it webserver bash root@c4c0c4e556b2:/# echo '<h1>Hello, Captain</h1>' > /usr/share/nginx/html/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 "修改了默认网页" \ > webserver \ > 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 nginx:v4
可以直接访问 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