Docker镜像和容器的使用
(1)掌握Docker镜像的拉取、获取、查找等基本操作。
(2)掌握容器的运行、删除等基本管理。
(3)掌握使用Dockerfile构建自定义镜像。
所有节点已安装好docker-ce。
1.镜像的基本管理和使用
可将Docker镜像看作只读模板,通过它可以创建Docker容器。
例如,某个镜像可能包含一个Ubuntu操作系统、一个Apache HTTP Server以及用户开发的Web应用。
镜像有多种生成方法:
①可以从无到有开始创建镜像。
②可以下载并使用别人创建好的现成的镜像。
③可以在现有镜像上创建新的镜像。
可以将镜像的内容和创建步骤描述在一个文本文件中,这个文件被称作Dockerfile,通过执行docker build <docker-file>命令可以构建出Docker镜像。
(1)查看镜像列表
使用docker images命令来列出本地主机上的镜像。
各个选项说明:
l REPOSITORY:表示镜像的仓库源
l TAG:镜像的标签
l IMAGE ID:镜像ID
l CREATED:镜像创建时间
l SIZE:镜像大小
同一仓库源可以有多个TAG,代表这个仓库源的不同个版本。例如http仓库源里有 2.2.31、2.2.32等多个不同的版本,可以使用REPOSITORY:TAG命令来定义不同的镜像。
使用版本为2.2.31的http镜像来运行容器
使用版本为2.2.32的http镜像来运行容器
参数说明:
l -i:交互式操作。
l -t:终端。
l -d:后台运行。
l httpd:2.2.31:镜像名,使用https:2.2.31镜像为基础来启动容器。
l /bin/bash:容器交互式Shell。
如果不指定镜像的版本标签,则默认使用latest标签的镜像。
(2)获取镜像
当本地主机上使用一个不存在的镜像时,Docker会自动下载这个镜像。如果需要预先下载这个镜像,可以使用docker pull命令来下载
# docker pull [OPTIONS] NAME[:TAG|@DIGEST]
OPTIONS说明:
l -a:拉取所有tagged镜像。
l --disable-content-trust:忽略镜像的校验,默认开启。
(3)查找镜像
查找镜像一般有两种方式,可以通过Docker Hub(https://hub.docker.com/)网站来搜索镜像,也可以使用docker search命令来搜索镜
# docker search [OPTIONS] TERM
OPTIONS说明:
l --automated:只列出automated build类型的镜像。
l --no-trunc:显示完整的镜像描述。
l --filter=stars:列出收藏数不小于指定值的镜像。
需要一个httpd镜像作Web服务时,使用docker search命令搜索httpd来寻找适合的镜像
参数说明:
l NAME:镜像仓库源的名称。
l DESCRIPTION:镜像的描述。
l OFFICIAL:是否是Docker官方发布。
l stars:类似GitHub里面的star,表示点赞、喜欢的意思。
l AUTOMATED:自动构建。
(4)删除镜像
镜像删除使用docker rmi命令
# docker rmi [OPTIONS] IMAGE [IMAGE...]
OPTIONS说明:
l -f:强制删除。
l --no-prune:不移除该镜像的过程镜像,默认移除。
强制删除本地镜像busybox
2.容器的基本管理和使用
容器是一种轻量级的、可移植的、自包含的软件打包技术,使应用程序几乎可以在任何地方以相同的方式运行。开发人员在自己笔记本上创建并测试好的容器,无需任何修改就能够在生产系统的虚拟机、物理服务器或公有云主机上运行。
容器由应用程序本身和依赖两部分组成。容器在宿主机操作系统的用户空间中运行,与操作系统的其他进程隔离。这一点显著区别于的虚拟机。
传统的虚拟化技术,比如VMWare、KVM、Xen,目标是创建完整的虚拟机。为了运行应用,除了部署应用本身及其依赖(通常几十MB),还得安装整个操作系统(几十GB)。
容器使软件具备了超强的可移植能力。
(1)运行容器
运行第一个容器
参数说明:
l -i:交互式操作。
l -t:终端。
l -rm:容器退出后随之将其删除,可以避免浪费空间。
l -p:端口映射。
l -d:容器在后台运行。
其过程可以简单的描述为:
①下载Nginx镜像。
②启动容器,并将容器的80端口映射到宿主机的80端口。
当使用docker run来创建容器时,Docker在后台运行的标准流程如下:
①检查本地是否存在指定的镜像,不存在就从公有仓库下载。
②利用镜像创建并启动一个容器。
③分配一个文件系统,并在只读的镜像层外面挂载一层可读写层。
④从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去。
⑤从地址池配置一个IP地址给容器。
⑥执行用户指定的应用程序。
接下来可以通过浏览器验证容器是否正常工作。在浏览器中输入地址http://172.16.51.35
启动容器
# docker start [CONTAINER ID]
启动所有的Docker容器
(2)操作容器
列出运行中的容器。
# docker ps
# docker container ls
列出所有容器(包含终止状态)。
查看具体容器的信息。
# docker inspect [container ID or NAMES]
查看容器的使用资源状况。
# docker stats [container ID or NAMES]
查看容器日志。
# docker logs [OPTIONS] [container ID or NAMES]
OPTIONS说明:
l --details:显示更多的信息。
l -f,--follow:跟踪实时日志。
l --sincestring:显示自某个timestamp之后的日志,或相对时间,如42分钟。
l --tailstring:从日志末尾显示多少行日志,默认是all。
l -t,--timestamps:显示时间戳。
l --until string:显示自某个timestamp之前的日志,或相对时间,如42分钟。
进入容器。
# docker exec -it [CONTAINER ID] bash
进入容器后,输入exit或者按Crtl+C键即可退出容器
(3)终止容器
删除终止状态的容器。
# docker rm [CONTAINER ID]
删除所有处于终止状态的容器。
# docker container prune
删除未被使用的数据卷。
# docker volume prune
删除运行中的容器。
# docker rm -f [CONTAINER ID]
批量停止所有的容器。
# docker stop $(docker ps -aq)
批量删除所有的容器。
# docker rm $(docker ps -aq)
终止容器进程,容器进入终止状态。
# docker container stop [CONTAINER ID]
(4)导入/导出容器
将容器快照导出为本地文件
# docker export [CONTAINER ID] > [tar file]
同样的,也可以把容器快照文件再导入为镜像,
# cat [tar file] | docker import - [name:tag]
使用docker import命令导入一个容器快照到本地镜像库时,将丢弃所有的历史记录和元数据信息,即仅保存容器当时的快照状态。
3.构建自定义镜像
Docker Hub提供了很多镜像,但在实际工作中,Docker Hub中的镜像并不能满足工作的需要,往往需要构建自定义镜像。构建自定义镜像主要有两种方式:docker commit和Dockerfile
可以将docker commit视为在以往版本控制系统里提交变更,然后进行变更的提交即可。docker commit、docker export和docker add类似都可以输出image,但是最好的生成image的方法还是使用Dockerfile。
Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。它们简化了从头到尾的流程并极大地简化了部署工作。Dockerfile从FROM命令开始,紧接着跟随各种方法、命令和参数,其产出为一个新的可以用于创建容器的镜像。
(1)docker commit
docker commit命令用于从容器创建一个新的镜像
# docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
OPTIONS说明:
l -a:提交的镜像作者。
l -c:使用Dockerfile指令来创建镜像。
l -m:提交时的说明文字。
l -p:在commit时,将容器暂停。
查看已有的容器,将容器ee84ee51a2e2保存为新的镜像,并添加提交人信息和说明信息
使用docker commit命令构建的镜像,除了制定镜像的人知道执行过什么命令,怎么生成的镜像,别人根本无从得知。建议使用Dockerfile来制作镜像,镜像的生成过程是透明的, docker commit可用于被入侵后保存现场等操作。
(2)Dockerfile
Dockerfile是一个文本文档,其中包含了组合映像的命令,可以使用在命令行中调用任何命令。Docker通过读取Dockerfile中的指令自动生成映像。
docker build命令用于从Dockerfile构建映像。可以在docker build命令中使用-f标志指向文件系统中任何位置的Dockerfile
# docker build -f /path/to/a/Dockerfile
Dockerfile一般分为4部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,“#”为Dockerfile中的注释。
Dockerfile主要指令如下:
l FROM:指定基础镜像,必须为第一个命令。
l MAINTAINER:维护者信息。
l RUN:构建镜像时执行的命令。
l ADD:将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget。
l COPY:功能类似ADD,但是是不会自动解压文件,也不能访问网络资源。
l CMD:构建容器后调用,也就是在容器启动时才进行调用。
l ENTRYPOINT:配置容器,使其可执行化。配合CMD可省去“application”,只使用参数。
l LABEL:用于为镜像添加元数据。
l ENV:设置环境变量。
l EXPOSE:指定与外界交互的端口。
l VOLUME:用于指定持久化目录。
l WORKDIR:工作目录,类似于cd命令。
l USER:指定运行容器时的用户名或UID,后续的RUN也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可通过该命令指定运行用户。
l ARG:用于指定传递给构建运行时的变量。
l ONBUILD:用于设置镜像触发器。
接下来以centos:latest为基础镜像,安装jdk1.8并构建新的镜像centos-jdk。
新建文件夹用于存放JDK安装包和Dockerfile文件
[root@master ~]# mkdir centos-jdk
[root@localhost ~]# mv jdk/jdk-8u141-linux-x64.tar.gz ./centos-jdk/
[root@master ~]# cd centos-jdk/
编写Dockerfile。
[root@master centos-jdk]# cat Dockerfile
# CentOS with JDK 8
# Author Guo
# 指定基础镜像
FROM centos
# 指定作者
MAINTAINER Guo
# 新建文件夹用于存放jdk文件
RUN mkdir /usr/local/java
# 将JDK文件复制到镜像内并自动解压
ADD jdk-8u141-linux-x64.tar.gz /usr/local/java/
# 创建软链接
RUN ln -s /usr/local/java/jdk1.8.0_141 /usr/local/java/jdk
# 设置环境变量
ENV JAVA_HOME /usr/local/java/jdk
ENV JRE_HOME ${JAVA_HOME}/jre
ENV CLASSPATH .:${JAVA_HOME}/lib:${JRE_HOME}/lib
ENV PATH ${JAVA_HOME}/bin:$PATH
使用docker build命令构建新镜像
查看构建的新镜像。
使用新构建的镜像运行容器验证JDK是否安装成功。