作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注作者,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。
我们在上一章,讲了虚拟化,虚拟化是把硬件虚拟化,然后创建出来的虚拟机完全隔离,而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.
由于这里面参数较多,而且有些参数比较抽象,所以我们多节来讲解,下小节我们继续讲解其他参数。
运维小路
一个不会开发的运维!一个要学开发的运维!一个学不会开发的运维!欢迎大家骚扰的运维!
关注微信公众号《运维小路》获取更多内容。