11 Docker 镜像使用
当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。
下面我们来学习:
- 管理和使用本地 Docker 主机镜像
- 创建镜像
11.1列出镜像列表
我们可以使用docker images
来列出本地主机上的镜像。
各个选项说明:
- REPOSITORY:表示镜像的仓库源
- TAG:镜像的标签
- IMAGE ID:镜像ID
- CREATED:镜像创建时间
- SIZE:镜像大小
统计镜像的个数:docker images | wc -l
同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,如 ubuntu 仓库源里,有 20.10、15.10 等多个不同的版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。
所以,我们如果要使用版本为20.10的ubuntu系统镜像来运行容器时,命令如下:
docker run -t -i ubuntu:20.10 /bin/bash
参数说明:
- -i: 交互式操作。
- -t: 终端。
ubuntu:20.10: 这是指用 ubuntu 20.10 版本镜像为基础来启动容器。
/bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
如果要使用版本为 15.10 的 ubuntu 系统镜像来运行容器时,命令如下:
docker run -t -i ubuntu:15.10 /bin/bash
如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像。
11.2获取一个新的镜像
当我们在本地主机上使用一个不存在的镜像时 Docker 就会自动下载这个镜像。如果我们想预先下载这个镜像,我们可以使用 docker pull
命令来下载它。
下载完成后,我们可以直接使用这个镜像来运行容器
11.3 查找镜像
我们可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址为: https://hub.docker.com/
我们也可以使用 docker search
命令来搜索镜像。
比如我们需要一个 httpd 的镜像来作为我们的 web 服务。我们可以通过 docker search
命令搜索 httpd 来寻找适合我们的镜像。
- NAME: 镜像仓库源的名称
- DESCRIPTION: 镜像的描述
- OFFICIAL: 是否 docker 官方发布
- stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。
- AUTOMATED: 自动构建。
11.4拖取镜像
我们决定使用上图中的 httpd 官方版本的镜像,使用命令 docker pull
来下载镜像。
下载完成后,我们就可以使用这个镜像了。
11.5删除镜像
镜像删除使用 docker rmi
命令,比如我们删除 hello-world 镜像:
docker rmi hello-world
11.6 删除所有镜像
docker rmi $(docker images -q)
# 不建议大家尝试
11.7 创建镜像
当我们从 docker 镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。
- 从已经创建的容器中更新镜像,并且提交这个镜像(docker commit命令)
- 使用 Dockerfile 指令来创建一个新的镜像
11.7.1 使用docker commit 命令
我们创建一个基于ubuntu20的镜像。更新镜像并安装wget和vim
首先需要使用已有镜像来创建一个容器。
docker pull ubuntu:20.10
docker run -it --name ubuntu20 ubuntu:20.10
在运行的容器内使用 apt-get update
命令进行更新。
apt-get update
注意:apt-get update就是访问服务器,更新可获取软件及其版本信息,但仅仅给出一个可更新的list,更新软件列表,并不更新软件。
安装wget
wget # 先看下是否存在
apt-get install wget #安装
wget # 再次查看wget是否存在
安装vim
vim # 先查看是否存在
apt-get install vim # 安装
vim # 再次查看是否存在
使用exit
退出容器
此时 ID 为 ef942b7be7ee的容器,是按我们的需求更改的容器。我们可以通过命令 docker commit
来提交容器副本。创建一个镜像
docker commit -m="has update" -a="thomas Guo" ef942b7be7ee thomas/ubuntu:v8
各个参数说明:
- -m: 提交的描述信息
- -a: 指定镜像作者
- e218edb10161:容器 ID
- thomas/ubuntu:v8: 指定要创建的目标镜像名
使用 docker images
命令来查看我们的新镜像 thomas/ubuntu:v8
docker images
基于新镜像来启动一个容器
docker run -t -i thomas/ubuntu:v8 /bin/bash
查看wget和vim是否存在
wget
vim
11.7.2 使用docker build 构建镜像
推荐使用这种方式构建镜像,尽量不要使用docker commit
。
我们使用命令 docker build
, 从零开始来创建一个新的镜像。
为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。
该文件内容如下,你可以通过 vim Dockerfile 来创建并编辑这个文件
FROM centos:8.2.2004
MAINTAINER Thomas "thomas@sina.com"
RUN /bin/echo 'root:111111' |chpasswd
RUN useradd thomas
RUN /bin/echo 'thomas:11111' |chpasswd
RUN mkdir test
EXPOSE 22
EXPOSE 80
CMD /usr/sbin/sshd -D
注:从系统的标准输入读入用户的名称和口令,并利用这些信息来更新系统上已存在的用户的口令
这是一种输出的形式:
echo 用户名:密码 | chpasswd
每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。
第一条FROM,指定使用哪个镜像源
RUN 指令告诉docker 在镜像内执行命令,安装了什么。。。
然后,我们使用 Dockerfile 文件,通过docker build
命令来构建一个镜像。
docker build -t thomas/centos:8.2 .
# 请注意:命令的后面是有一个 . 的
请注意:上面这个命令最后面是有一个 . 的
参数说明:
- -t :指定要创建的目标镜像名
- . :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径
使用docker images
查看创建的镜像已经在列表中存在,镜像ID为8e3226f1261d
我们可以使用新的镜像来创建容器
docker run -t -i thomas/centos:8.2 /bin/bash
从上面看到新镜像已经包含我们创建的用户 thomas。
设置镜像标签
我们可以使用docker tag
命令,为镜像添加一个新的标签。
docker tag 8e3226f1261d thomas/centos:dev
docker tag 镜像ID,这里是 8e3226f1261d,用户名称、镜像源名(repository name)和新的标签名(tag)。
使用 docker images
命令可以看到,ID为860c279d2fec的镜像多一个标签。
11.8 Docker File 指令
Dockerfile的指令根据作用可以分为两种:构建指令和设置指令。
- 构建指令用于构建image,其指定的操作不会在运行image的容器上执行;
- 设置指令用于设置image的属性,其指定的操作将在运行image的容器中执行。
Dockerfile 官方参考文档:https://docs.docker.com/engine/reference/builder/#usage
附录
目前常用的命令
查看命令如何使用:docker
查看docker 版本: docker version
查看docker 信息: docker info
拉取镜像 :docker pull nginx:latest
查看本地镜像: docker images
查看本地指定镜像 docker images nginx
删除镜像 docker rmi nginx
运行容器: docker run -it -d --name=ddd nginx
停止容器: docker stop 容器名称或者容器id
启动已存在的容器: docker start 容器名称或者容器id
删除容器: docker rm 容器名称或者容器id
查看运行中的容器: docker ps
查看最后创建的容器: docker ps -l
查看所有容器(包括未运行的) docker ps -a
进入容器: docker exec -it 容器名称或者容器id /bin/bash
查看容器里的进程: docker top 容器名称或者容器id
查看容器终端输出的信息: docker logs 容器名称或者容器id
查看容器里web服务器的日志 docker logs -f 容器名称或者容器id
查看容器内部的详细信息 docker inspect 容器名称或者容器id
查看容器的端口映射情况: docker port 容器名称或者容器id