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.312.2.32等多个不同的版本,可以使用REPOSITORY:TAG命令来定义不同的镜像。

使用版本为2.2.31http镜像来运行容器

使用版本为2.2.32http镜像来运行容器

 

参数说明:

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 Hubhttps://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.容器的基本管理和使用

容器是一种轻量级的、可移植的、自包含的软件打包技术,使应用程序几乎可以在任何地方以相同的方式运行。开发人员在自己笔记本上创建并测试好的容器,无需任何修改就能够在生产系统的虚拟机、物理服务器或公有云主机上运行。

容器由应用程序本身和依赖两部分组成。容器在宿主机操作系统的用户空间中运行,与操作系统的其他进程隔离。这一点显著区别于的虚拟机。

传统的虚拟化技术,比如VMWareKVMXen,目标是创建完整的虚拟机。为了运行应用,除了部署应用本身及其依赖(通常几十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 commitDockerfile

可以将docker commit视为在以往版本控制系统里提交变更,然后进行变更的提交即可。docker commitdocker exportdocker add类似都可以输出image,但是最好的生成image的方法还是使用Dockerfile

Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。它们简化了从头到尾的流程并极大地简化了部署工作。DockerfileFROM命令开始,紧接着跟随各种方法、命令和参数,其产出为一个新的可以用于创建容器的镜像。

1docker 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可用于被入侵后保存现场等操作。

2Dockerfile

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指定用户时,可以使用用户名、UIDGID,或是两者的组合。当服务不需要管理员权限时,可通过该命令指定运行用户。

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是否安装成功。

 

原文地址:https://www.cnblogs.com/lzp123/p/13769768.html