产品能力|云原生能力知识体系构建-Docker学习笔记Part4

系列文章目录

第一节:Docker的介绍 第二节:Docker的安装 第三节:Docker的常用命令 第四节:Docker镜像 第五节:Docker 容器连接 其他后续完善

文章目录

  • 系列文章目录
  • 前言
  • 一、镜像是什么?
  • 二、使用镜像
    • 2.1 获取一个新的镜像
    • 2.2 读入数据
    • 2.3 拖取镜像
    • 2.4 构建镜像
    • 2.5 设置镜像标签
  • 三、 总结及扩展
    • 3.1busybox
    • 3.2 openjdk

前言

在学习之前我们,需要搞懂什么是镜像,下面我们来学习:

1、管理和使用本地 Docker 主机镜像 2、创建镜像


提示:以下是本篇文章正文内容,下面案例可供参考

一、镜像是什么?

简单介绍一下 Docker 镜像是什么。

要理解 Docker 镜像,我们不妨先看另外一组概念:程序和进程。在《深入理解计算机系统》中对程序和进程的关系描述有一句话非常好:进程是程序的一个运行实例。程序是打包好的静态文件,而进程相当于把这些静态文件加载到计算机内存中运行起来。相应的,容器也可以说是镜像的一个运行实例。

不过这两组概念之间还有一个重大的区别就是:程序运行还依赖于一些操作系统的文件,但是镜像相当于把操作系统的文件也一起打包进了静态文件中。我们看一个简单的镜像,busybox,镜像界的 hello world。

代码语言:javascript
复制
docker pull busybox:latest

启动容器:

代码语言:javascript
复制
docker run -ti busybox:latest sh

图片描述

在这里插入图片描述

通过 ls 可以看到镜像中确实包含了很多操作系统的文件,而且细心的同学会发现 busybox 镜像中包含的操作系统的文件只是一个精简版的,并不是全量的。值得注意的是,镜像中也只是包含了操作系统的必要的文件,在容器启动之后,容器进程还是去和宿主机的操作系统进行交互的。

二、使用镜像

2.1 获取一个新的镜像

当我们在本地主机上使用一个不存在的镜像时 Docker 就会自动下载这个镜像。如果我们想预先下载这个镜像,我们可以使用 docker pull 命令来下载它。

代码如下(示例): root@dockerdemo:~$ docker pull ubuntu:13.10 13.10: Pulling from library/ubuntu 6599cadaf950: Pull complete 23eda618d451: Pull complete f0be3084efe9: Pull complete 52de432f084b: Pull complete a3ed95caeb02: Pull complete Digest: sha256:15b79a6654811c8d992ebacdfbd5152fcf3d165e374e264076aa435214a947a3 Status: Downloaded newer image for ubuntu:13.10

下载完成后,我们可以直接使用这个镜像来运行容器。

2.2 读入数据

查找镜像 我们可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址为:https://hub.docker.com/ 我们也可以使用 docker search 命令来搜索镜像。比如我们需要一个httpd的镜像来作为我们的web服务。我们可以通过 docker search 命令搜索 httpd 来寻找适合我们的镜像。

代码语言:javascript
复制
root@dockerdemo:~$  docker search httpd
在这里插入图片描述

名称

描述

NAME:

镜像仓库源的名称

DESCRIPTION:

镜像的描述

OFFICIAL:

是否docker官方发布

2.3 拖取镜像

我们决定使用上图中的httpd 官方版本的镜像,使用命令 docker pull 来下载镜像。

代码语言:javascript
复制
root@dockerdemo:~$ docker pull httpd
Using default tag: latest
latest: Pulling from library/httpd
8b87079b7a06: Pulling fs layer 
a3ed95caeb02: Download complete 
0d62ec9c6a76: Download complete 
a329d50397b9: Download complete 
ea7c1f032b5c: Waiting 
be44112b72c7: Waiting
//下载完成后,我们就可以使用这个镜像了。

root@dockerdemo:~ docker run httpd</code></pre></div></div><h3 id="cafqi" name="2.4-%E6%9E%84%E5%BB%BA%E9%95%9C%E5%83%8F">2.4 构建镜像</h3><p>我们使用命令 docker build , 从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。</p><div class="rno-markdown-code"><div class="rno-markdown-code-toolbar"><div class="rno-markdown-code-toolbar-info"><div class="rno-markdown-code-toolbar-item is-type"><span class="is-m-hidden">代码语言:</span>javascript</div></div><div class="rno-markdown-code-toolbar-opt"><div class="rno-markdown-code-toolbar-copy"><i class="icon-copy"></i><span class="is-m-hidden">复制</span></div></div></div><div class="developer-code-block"><pre class="prism-token token line-numbers language-javascript"><code class="language-javascript" style="margin-left:0">root@dockerdemo:~ cat Dockerfile
FROM centos:6.7
MAINTAINER Fisher "fisher@sudops.com"

RUN /bin/echo 'root:123456' |chpasswd
RUN useradd youj
RUN /bin/echo 'youj:123456' |chpasswd
RUN /bin/echo -e "LANG=&#34;en_US.UTF-8&#34;" &gt; /etc/default/local
EXPOSE 22
EXPOSE 80
CMD /usr/sbin/sshd -D

每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。
第一条FROM,指定使用哪个镜像源
RUN 指令告诉docker 在镜像内执行命令,安装了什么。。。
然后,我们使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像。

代码语言:javascript
复制
root@dockerdemo:$ docker build -t youj/centos:6.7 .
Sending build context to Docker daemon 17.92 kB
Step 1 : FROM centos:6.7
---&gt; d95b5ca17cc3
Step 2 : MAINTAINER Fisher "fisher@sudops.com"
---&gt; Using cache
---&gt; 0c92299c6f03
Step 3 : RUN /bin/echo 'root:123456' |chpasswd
---&gt; Using cache
---&gt; 0397ce2fbd0a
Step 4 : RUN useradd youj

参数说明:
-t :指定要创建的目标镜像名
. :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径
使用docker images 查看创建的镜像已经在列表中存在,镜像ID为860c279d2fec

代码语言:javascript
复制
root@dockerdemo:$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
demo/centos 6.7 860c279d2fec About a minute ago 190.6 MB
dockerdemo/ubuntu v2 70bf1840fd7c 17 hours ago 158.5 MB
ubuntu 14.04 90d5884b1ee0 6 days ago 188 MB
php 5.6 f40e9e0f10c8 10 days ago 444.8 MB
nginx latest 6f8d099c3adc 12 days ago 182.7 MB
mysql 5.6 f2e8d6c772c0 3 weeks ago 324.6 MB
httpd latest 02ef73cf1bc0 3 weeks ago 194.4 MB
ubuntu 15.10 4e3b13c8a266 5 weeks ago 136.3 MB
hello-world latest 690ed74de00f 6 months ago 960 B
centos 6.7 d95b5ca17cc3 6 months ago 190.6 MB
training/webapp latest 6fae60ef3446 12 months ago 348.8 MB

我们可以使用新的镜像来创建容器

代码语言:javascript
复制
root@dockerdemo:~$ docker run -t -i youj/centos:6.7  /bin/bash
[root@41c28d18b5fb /]# id demo
uid=500(demo) gid=500(youj) groups=500(demo)

从上面看到新镜像已经包含我们创建的用户demo

2.5 设置镜像标签

我们可以使用 docker tag 命令,为镜像添加一个新的标签。

代码语言:javascript
复制
root@dockerdemo:~ docker tag 860c279d2fec youj/centos:dev</code></pre></div></div><p>docker tag 镜像ID,这里是 860c279d2fec ,用户名称、镜像源名(repository name)和新的标签名(tag)。</p><p>使用 docker images 命令可以看到,ID为860c279d2fec的镜像多一个标签。</p><div class="rno-markdown-code"><div class="rno-markdown-code-toolbar"><div class="rno-markdown-code-toolbar-info"><div class="rno-markdown-code-toolbar-item is-type"><span class="is-m-hidden">代码语言:</span>javascript</div></div><div class="rno-markdown-code-toolbar-opt"><div class="rno-markdown-code-toolbar-copy"><i class="icon-copy"></i><span class="is-m-hidden">复制</span></div></div></div><div class="developer-code-block"><pre class="prism-token token line-numbers language-javascript"><code class="language-javascript" style="margin-left:0">root@dockerdemo:~ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
demo/centos 6.7 860c279d2fec 5 hours ago 190.6 MB
demo/centos dev 860c279d2fec 5 hours ago 190.6 MB
demo/ubuntu v2 70bf1840fd7c 22 hours ago 158.5 MB
ubuntu 14.04 90d5884b1ee0 6 days ago 188 MB
nginx latest 6f8d099c3adc 13 days ago 182.7 MB
mysql 5.6 f2e8d6c772c0 3 weeks ago 324.6 MB
httpd latest 02ef73cf1bc0 3 weeks ago 194.4 MB
ubuntu 15.10 4e3b13c8a266 5 weeks ago 136.3 MB
hello-world latest 690ed74de00f 6 months ago 960 B
centos 6.7 d95b5ca17cc3 6 months ago 190.6 MB
training/webapp latest 6fae60ef3446 12 months ago 348.8 MB

三、 总结及扩展

提示:今天学习了Docker镜像相关的概念和使用,下面分享一个实际应用过程的扩展点

基础镜像
虽然说镜像解决了容器所谓的一致性:无论在本地、云端,用户只需要解压打包好的容器镜像,那么这个容器的运行环境就被重现出来了。这里又出现了另外一个问题:如果我们每一个应用都自己打包我们的容器依赖的镜像,过程还是很繁琐的,那么这个过程能不能做到复用呢?

当然是可以的。首先官方镜像仓库中心提供了很多操作系统镜像,比如 ubuntu,centos 等。这样我们的应用就可以基于这些操作系统基础镜像来构建了。

其次,对于同一个公司内部,多个 Java 应用的开发人员对于环境的依赖都是一致的,比如 JDK,tomcat 等等。我们可以每个人都基于 centos 基础镜像来构建我们的应用镜像,但是还有一种更好的方式是我们构建出一个 Java 应用基础镜像,然后大家复用这个基础镜像。

3.1busybox

很多 Docker 教程都使用 busybox 镜像来举例子,而且很多应用镜像都使用 busybox 镜像来作为基础镜像,那么 busybox 是什么呢?

简单来说 busybox 是一个集成了一百多个最常用的 Linux 命令和工具的软件工具箱,它在单一的可执行文件中提供了精简的 Unix 工具集。busybox 既包含了一些简单使用的工具,如 cat 和 echo,也包含了一些更大,更复杂的工具,如 grep,find,mount 以及 telnet 等。可以说 busybox 是 Linux 系统的瑞士军刀。另外 busyBox 可运行于多款 Posix 环境的操作系统中。

3.2 openjdk

Java 语言作为目前使用最广泛的编程语言,这里有必要介绍一下 Docker 的 Java 基础镜像:docker 官方提供的 openjdk。

代码语言:javascript
复制
FROM openjdk:7
COPY . /usr/src/myapp
WORKDIR /usr/src/myapp
RUN javac Main.java
CMD ["java", "Main"]

下一篇:Docker 容器连接