Docker-Dockerfile讲解(一)

作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注作者,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

我们在上一章,讲了虚拟化,虚拟化是把硬件虚拟化,然后创建出来的虚拟机完全隔离,而Docker则是软件(内核)虚拟化,他的隔离性会低于虚拟机。我们将通过3-4周来讲解Docker相关内容,由于涉及到内容较多,就不一一列出来具体的细节,主要从以下几个方面来讲解:

Docker基本情况

Docker基本命令

Dockerfile(本小节属于)

Docker镜像

Docker仓库

Docker原理

Docker网络&存储&日志

Docker-Compose

Docker番外篇

我们前面讲解了很多docker的操作命令,也使用了几个镜像,但是这些镜像都是我们从仓库里面下载的,具有通用性。如果要满足自己的业务需求,所以我们需要根据自己的需要制作自己的镜像,下面我将讲解下如何制作自己的镜像。

Docker可以通过读取Dockerfile中的指令自动构建镜像。Dockerfile是一个文本文档,它包含用户可以在命令行上调用来组装镜像的所有命令。下面先通过一个最简单的案例来体验这个功能。

Dockerfile案例

1.新建Dockerfile文件

touch Dockerfile

2.写入Dockerfile内容

#编辑文件,具体使用的镜像需要可用的nginx镜像才可以
#没有可以私信我提供
vi Dockerfile

FROM 192.168.31.43:5000/nginx
RUN echo 'build nginx is successful' > /usr/share/nginx/html/index.html

3.构建镜像

# 需要在Dockerfile文件里面对应的目录,末尾有个点

[root@localhost test]# docker build -t nginx:v1.2.3 .
[+] Building 0.2s (6/6) FINISHED                                                                                               docker:default
 => [internal] load .dockerignore                                                                                                        0.0s
 => => transferring context: 2B                                                                                                          0.0s
 => [internal] load build definition from Dockerfile                                                                                     0.0s
 => => transferring dockerfile: 139B                                                                                                     0.0s
 => [internal] load metadata for 192.168.31.43:5000/nginx:latest                                                                         0.0s
 => CACHED [1/2] FROM 192.168.31.43:5000/nginx                                                                                           0.0s
 => [2/2] RUN echo 'build nginx is successful' > /usr/share/nginx/html/index.html                                                        0.1s
 => exporting to image                                                                                                                   0.1s
 => => exporting layers                                                                                                                  0.0s
 => => writing image sha256:5032c471e1b6c75cf588dfd2ce68f9ffe24dd38dbe598f23ac30b145df874213                                             0.0s
 => => naming to docker.io/library/nginx:v1.2.3                                                                                          0.0s

4、查看镜像

[root@localhost test]# docker images
REPOSITORY                              TAG       IMAGE ID       CREATED         SIZE
nginx                                   v1.2.3    5032c471e1b6   8 seconds ago   192MB

5、运行容器

[root@localhost test]# docker run -p 3456:80 -d nginx:v1.2.3
f5df75a75a0b7081d18a52673a724b4ae225a057c1c0b8ff194cc60854fda265

6、访问验证

#访问的内容就是我们刚才手工注入到容器里面的,功能已经符合预期
[root@localhost test]# curl localhost:3456
build nginx is successful

通过以上案例,我们把这个nginx的容器输入了自己的网页内容,然后访问这个镜像创建的容器就可以访问到我们注入的内容,当然这里只是功能演示,下面我们将详细讲解这里涉及到的参数。

参数讲解

FROM

构建镜像都是基于 FROM 的镜像,这里的 centos 就是我们的基础镜像,后续的操作都会基于这个基础镜像。

FROM centos:7

MAINTAINER

作者,一般用户告诉别人这个镜像是谁在维护,私有镜像一般都不写,如果你想发布到公网让其他人使用,则可以填写。

MAINTAINER xxx@xxx.com

RUN

用于执行后面跟着的命令行命令。比如我们可以用这个命令安装软件等linux的基本操作(容器的基础镜像是裁剪过的,所以基本的命令都有,复制的命令则没有)。

有以下俩种格式:

•shell 格式:RUN <命令行命令>        

# <命令行命令> 等同于,在终端操作的 shell 命令。

RUN  yum install -y nginx

•exec 格式:RUN [“可执行文件”,“参数1”, “参数2”]  

# RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline

RUN ["yum", "install", "-y", "nginx"]

大多数时候没有区别,前者等于是封装在一个shell脚本里面执行,如果有信号则被shell接受,不会被命令接受;而exec等于没有shell这一层,可以接收到信号。

EXPOSE

仅仅只是声明端口。

帮助镜像使用者理解这个镜像服务的守护端口,只起指导作用。

在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。

#默认不写协议是tcp
EXPOSE 8080/tcp 53/udp

WORKDIR

指定工作目录。用 WORKDIR 指定的工作目录,后续指令都基于该目录,也是运行容器以后通过exec进入以后的默认目录。

可以简单理解后续操作和命令就会以此目录为当前目录,如果不指定则这个默认是根目录"/"。

#如果不指定这个目录则会创建到/abc
#如果指定则这个目录会/root/abc
WORKDIR /root
RUN mkdir A
#这个就只指定了工作目录是WORKDIR /A
#另外一个用途是通过exec 进入以后默认的目录
#如果没指定也默认就在根分区'/'
[root@localhost test]# docker run -it centos 
[root@833fb159565f A]# pwd
/A

​​​​​​​​​​​​USER

用于指定执行后续命令的用户和用户组(和WORKDIR类似)账号必须存在,否则后续无法操作,还有就是exec进入以后的默认账号。默认不指定都是容器里面的root,无论我们在里面安装软件及启动服务还是exec默认都是使用root。

虽然容器里面的root权限是受限的root,并不等于宿主机的root权限。但是由于docker的隔离性本来就相对较弱,如果出现了逃逸,则存在安全风险,所以对应容器里面应该用什么用户一直都存在争议。

[root@localhost test]# docker run -it centos 
docker: Error response from daemon: unable to find user abc: no matching entries in passwd file.

由于这里面参数较多,而且有些参数比较抽象,所以我们多节来讲解,下小节我们继续讲解其他参数。

运维小路

一个不会开发的运维!一个要学开发的运维!一个学不会开发的运维!欢迎大家骚扰的运维!

关注微信公众号《运维小路》获取更多内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值