手记

【金秋打卡】第22天 Docker 系统性入门+进阶实践(最新版) -prat4

课程名称: Docker 系统性入门+进阶实践(最新版)
课程章节:第3章 镜像的创建管理和发布
课程讲师: 麦兜搞IT
课程目标:掌握 镜像的创建管理和发布
课程内容:
第3章 镜像的创建管理和发布
3-1 镜像的获取方式最近学习
3-2 镜像的registry介绍
3-3 镜像的获取查看和删除
3-4 docker镜像的导入导出
3-5 Dockerfile的介绍
3-6 镜像的构建和分享
3-7 通过commit创建镜像
3-8 聊聊scratch这个镜像

前言

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

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


一、镜像是什么?

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

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

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

docker pull busybox:latest

启动容器:

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 来寻找适合我们的镜像。

root@dockerdemo:~$  docker search httpd

名称 描述
NAME: 镜像仓库源的名称
DESCRIPTION: 镜像的描述
OFFICIAL: 是否docker官方发布

2.3 拖取镜像

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

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

2.4 构建镜像

我们使用命令 docker build , 从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。

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=\"en_US.UTF-8\"" > /etc/default/local
EXPOSE  22
EXPOSE  80
CMD     /usr/sbin/sshd -D

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

root@dockerdemo:~$ docker build -t youj/centos:6.7 .
Sending build context to Docker daemon 17.92 kB
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
Step 4 : RUN useradd youj

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

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

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

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 命令,为镜像添加一个新的标签。

root@dockerdemo:~$ docker tag 860c279d2fec youj/centos:dev

docker tag 镜像ID,这里是 860c279d2fec ,用户名称、镜像源名(repository name)和新的标签名(tag)。

使用 docker images 命令可以看到,ID为860c279d2fec的镜像多一个标签。

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。

FROM openjdk:7
COPY . /usr/src/myapp
WORKDIR /usr/src/myapp
RUN javac Main.java
CMD ["java", "Main"]


总结

容器中和核心就是镜像的构建,需要花大量的时间实验,并在生产环境中应用。

0人推荐
随时随地看视频
慕课网APP