当我们运行容器(后面文章会讲)时,使用的镜像在本地不存在,docker会自动从docker镜像仓库中下载,默认是从Docker Hub公共镜像源下载。
下面我们进行学习:
- 管理和使用本地Docker主机镜像
- 创建镜像
列出镜像列表:
我们可以使用docker images来列出本机上的镜像。
[root@node6 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
各选项说明:
- REPOSITORY:表示镜像的仓库源
- TAG:镜像的标签
- IMAGE ID:镜像的ID
- CREATED:镜像创建时间
- SIZE:镜像大小
同一仓库源可以有多个TAG,代表这个仓库源的多个不同的版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。
所以,我们要使用指定版本的镜像时,必须将镜像的TAG写对。
获取一个新的镜像:
当我们主机上使用一个不存在的镜像时docker就会自动下载这个镜像,如果我们想预先下载这个镜像,我们可以使用 docker pull 命令来下载它。
[root@node5 ~]# docker pull centos:7
Using default tag: 7
latest: Pulling from library/centos
7a0437f04f83: Pull complete
Digest: sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c04efc1
Status: Downloaded newer image for centos:7
docker.io/library/centos:7
运行一个镜像:
[root@node5 ~]# docker run -t -i centos:7 /bin/bash
[root@3a843fba828c /]#
参数说明:
- -t:交互式操作
- -i:终端
- centos:7:引用此centos:7为基础来启动容器。
- /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式shell,因此用的是/bin/bash
如果你不指定镜像的版本标签,例如你只用centos,docker将会默认使用centos:latest镜像。
镜像下载完成后,就可以使用镜像运行一个容器。
查找镜像:
我们可以从 docker Hub 网站上来搜索镜像,Docker Hub网址为 https://hub.docker.com/
我们也可以使用 docker search 命令来搜索镜像,比如我们需要一个httpd的镜像来作为我们的web服务。我们可以通过 docker search 命令搜索httpd来寻找适合我们的镜像。
[root@node6 ~]# docker search httpd
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
httpd The Apache HTTP Server Project 3589 [OK]
centos/httpd-24-centos7 Platform for running Apache httpd 2.4 or bui… 40
centos/httpd 34 [OK]
arm32v7/httpd The Apache HTTP Server Project 9
solsson/httpd-openidc mod_auth_openidc on official httpd image, ve… 2 [OK]
hypoport/httpd-cgi httpd-cgi 2 [OK]
salim1983hoop/httpd24 Dockerfile running apache config 2 [OK]
dariko/httpd-rproxy-ldap Apache httpd reverse proxy with LDAP authent… 1 [OK]
manageiq/httpd Container with httpd, built on CentOS for Ma… 1 [OK]
publici/httpd httpd:latest 1 [OK]
lead4good/httpd-fpm httpd server which connects via fcgi proxy h… 1 [OK]
dockerpinata/httpd 1
clearlinux/httpd httpd HyperText Transfer Protocol (HTTP) ser… 1
jonathanheilmann/httpd-alpine-rewrite httpd:alpine with enabled mod_rewrite 1 [OK]
inanimate/httpd-ssl A play container with httpd, ssl enabled, an… 1 [OK]
centos/httpd-24-centos8 1
appertly/httpd Customized Apache HTTPD that uses a PHP-FPM … 0 [OK]
amd64/httpd The Apache HTTP Server Project 0
interlutions/httpd httpd docker image with debian-based config … 0 [OK]
e2eteam/httpd 0
trollin/httpd 0
ysli/httpd Httpd for DeepWeb 0 [OK]
manasip/httpd 0
manageiq/httpd_configmap_generator Httpd Configmap Generator 0 [OK]
itsziget/httpd24 Extended HTTPD Docker image based on the off… 0 [OK]
参数说明:
- NAME:镜像仓库源的名称
- DESCRIPTION:镜像的描述
- STARS:类似Github里面的star,表示点赞、喜欢的意思。
- OFFICIAL:是否是docker官方发布
- AUTOMATED:自动构建
删除镜像:
镜像删除使用 docker rmi 命令,比如我们删除ubuntu镜像:
[root@node5 ~]# docker rmi ubuntu:latest
Untagged: ubuntu:latest
Untagged: ubuntu@sha256:b3e2e47d016c08b3396b5ebe06ab0b711c34e7f37b98c9d37abe794b71cea0a2
Deleted: sha256:c29284518f497b8c5f49933e74e43ca5221e69c8251e780427f7d12f716625ff
Deleted: sha256:a70daca533d02f0886624703e70526b9ce8969b8cb87ff1eac163441fe071aa3
在删除镜像时注意,当你的镜像正在运行容器时,无法进行删除,会出现报错,只有在删除运行的容器之后,才可以删除镜像。
创建镜像:
当我们从docker镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。
- 从已经创建的容器中更新镜像,并且提交这个镜像。
- 使用Dockerfile指令来创建一个新的镜像。
更新镜像:
更新镜像之前,我们需要使用镜像创建一个容器。
docker run -t -i centos:latest /bin/bash
[root@3a843fba828c /]#
在运行的容器内使用 yum -y update 命令进行更新。
在完成操作之后,输入exit命令来退出这个容器。
此时ID为 3a843fba828c 的容器,是按照我们的需求更改的容器,我们可以通过命令 docker commit来提交容器副本。
[root@node5 ~]# docker commit 3a843fba828c centos:v2
sha256:bdeaf28fc199013d8007938a8f4c9d02b5314a582e84b60b5e4b3e44a8145232
参数说明:
- 3a843fba828c:容器ID
- centos:v2:指定创建的镜像名称
使用docker images命令查看更新的新镜像centos:v2
[root@node5 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos v2 bdeaf28fc199 47 seconds ago 503MB
mysql latest 5c62e459e087 3 weeks ago 556MB
centos latest 300e315adb2f 7 months ago 209MB
这样就可以使用新镜像去启动容器了。
使用Dockerfile构建镜像:
- 我们使用docker build,从零开始创建一个新的镜像,为此,我们需要创建一个Dockerfile文件,其中包含一组指令来告诉Docker如何构建我们需要的镜像。
- 每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。
- 第一条FROM,指定使用哪个镜像源
- RUN 指令告诉docker 在镜像内执行命令,安装了什么。
- 然后,我们使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像。
[root@node5 ~]# docker build -t centos:6.7 .
Sending build context to Docker daemon 2.21GB
Step 1/8 : FROM centos:6.7
Step 1 : FROM centos:6.7
---> d95b5ca17cc3
Step 2 : MAINTAINER Fisher "fisher@sudops.com"
---> Using cache
---> 0c92299c6f03
Step 3 : RUN /bin/echo 'root:123456' |chpasswd
---> Using cache
---> 0397ce2fbd0a
参数说明:
-
-t :指定要创建的目标镜像名
-
. :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径
使用docker images 查看创建的镜像已经在列表中存在,镜像ID为860c279d2fec
我们可以使用新的镜像来创建容器。
设置镜像标签:
我们可以使用 docker tag 命令,为镜像添加一个新的标签。
[root@node6 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest c29284518f49 34 hours ago 72.8MB
ubuntu 14.04 13b66b487594 3 months ago 196MB
[root@node6 ~]# docker tag c29284518f49 ubuntu:v1
[root@node6 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest c29284518f49 34 hours ago 72.8MB
ubuntu v1 c29284518f49 34 hours ago 72.8MB
ubuntu 14.04 13b66b487594 3 months ago 196MB