一、什么是Docker
docker是一个用来装应用的容器,就像杯子可以装水,笔筒可以放笔,书包可以放书,可以把hello word放在docker中,可以把网站放入docker中,可以把任何想得到的程序放在docker中。
二、 了解docker
2.1 docker 思想
1、集装箱
没有docker之前,我们需要把一个项目转移到另一个服务器上部署,可能遇到服务启动不了的问题,比如少一些配置文件什么的或者少了什么数据。 有了docker的集装箱,它会把项目所用的代码和配置文件等,都装在一起,可以保证我们的程序不管运行在哪不会缺东西。
2、 标准化
- 存储方式
我们在写项目的是时候,通常会将写好的代码通常会存储到一个代码仓库gitee,gitlab等,当别人在去写代码的时候,就不用那u盘去你电脑上拷贝了。docker也有一个这种仓库,他存储的都是docker镜像(也就是上文说的集装箱)
- 运输方式
我们要把台式机的应用部署到笔记本上,我们可能选择用QQ发过去或者用U盘拷过去,docker就标准化了这个过程。我们只需在台式机上执行一个docker命令,将应用打包成docker镜像放在仓库中,然后再笔记本上去下载这个镜像。
- API接口
docker提供了一系列rest api的接口,包含了对docker也就是对我们的应用的一个启动停止查看删除等等,如当我们要启动tomcat时我们要执行startup命令,当我们要停止时要执行shutdown命令,如果不是tomcat,我们可能还需要一些别的命令,有了docker我们记docker的命令就可以对其进行操作。
3、隔离
我们在使用虚拟机时有自己的cpu,硬盘,内存,完全感觉不到外面主机的存在,docker也差不多,不过它更轻量,我们创建虚拟机可能要几分钟,但是docker只需要一秒。就相当于Windows系统上安装了linux虚拟机,linux中又安装docker容器,docker不叫虚拟机它最底层的技术时linux一种内核的限制机制,叫做LXC,LXC是一种轻量级的容器虚拟化技术。最大效率的隔离了进程和资源。
2.2 docker能解决什么问题?
1、系统环境不一致
开发:我本地没问题。运维:服务器没问题. 这个问题就变成了皮球.
- 如果一个应用要正常的启动起来需要什么?比如java web应用。
- 需要一个操作系统,操作系统之上要jdk,tomcat,我们的代码,配置文件。
- 操作系统的改变可能会导致我们的应用开不起来,比如我们调用了某些系统命令.
- jdk版本也可能导致程序的运行失败。比如class文件需要1.7编译,我们装了个1.6的jdk。
- tomcat版本也能导致失败,比如旧的版本一些配置在新版本中不再支持。
- 代码的话就比如应用了C盘,D盘的一个文件,或者是用了系统的一些环境编码。
- 配置的话我们可能少了某个配置文件等等。
docker来了,它把操作系统,jdk,tomcat,代码,配置全部放到集装箱(镜像)里。再打包放到容器云上,从容器云给我们送到服务器上,在我的机器上怎么运行,在别的机器上也怎么运行。不会有任何的问题.一句话就是docker解决了运行环境不一致所带来的问题。
2、内存占满导致程序运行错误
docker在启动的时候就限定好了,它最大使用的CPU硬盘,如果超过了,就会杀掉对应进程。不会出现以为别人的程序是死循环疯狂吃CPU,还是封装疯狂打日志把硬盘占满,还是内存泄漏,把内存占满,都不会导致我们的程序运行错误。
3、部署多服务器
一些电商系统,每逢节日的时候就会提前扩展服务器,过完节再把多余的节点下线,这就给运维带来了非常大的工作量,一到过节就在各个机器上部署各种各样的服务,我们启动程序需要java,tocmat等等,并且还可能起不来还要调试,这是非常恶心的工作,有了docker一切都变得美好了,只要点一下服务器就可以从10台变成100台甚至1000,1W台,都是分分钟的事情。
为什么会这么快呢?都是用标准的方式把我们的程序运过来,下载过来,再用标准的方式把它运行起来,就可以做到只要在每台机器上都执行一两条命令,就可以让程序正常跑起来,并且不用担心有问题。
三、走进docker
docker运行程序的过程就是去仓库把镜像拉到本地,然后用一条命令把镜像运行起来变成容器。
- build: 构建,就是构建镜像。
- ship: 运输,运输镜像,从仓库和主机运输。
- run: 运行的镜像就是一个容器。
build,ship,run和镜像,仓库,容器是一一对应的。
1、安装Docker
1.下载关于Docker的依赖环境
yum -y install yum-utils device-mapper-persistent-data lvm2
2.设置下载Docker的镜像源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3.安装Docker
yum makecache fast
yum -y install docker-ce
4.启动Docker,并设置为开机自动启动,测试
#启动Docker服务
systemctl start docker
#设置开机自动启动
systemctl enable docker
#测试
docker run hello-world
Docker的中央仓库
Docker官方的中央仓库: 这个仓库是镜像最全的,但是下载速度较慢。
https://hub.docker.com/
国内的镜像网站:网易蜂巢、daoCloud。。。
https://c.163yun.com/hub#/home
https://hub.daocloud.io/ (推荐使用)
在公司内部会采用私服的方式拉取镜像。(添加配置)
需要在/etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"insecure-registries": ["ip:port]
}
#ip:port
公司私服的ip和port
重启两个服务
systemctl daemon-reload
systemctl restart docker
基础命令
#启动docker
systemctl start docker
#关闭docker
systemctl stop docker
#重启docker
systemctl restart docker
#查看docker 运行状态 ------如果是在运行中 输入命令后 会看到绿色的active
systemctl status docker
#查看docker 版本号信息
docker version
#查看docker 详细信息 --------此命令可以查看到docker 中容器运行个数以及镜像个数等等
docker info
2、docker基本操作命令
docker 帮助命令 忘记了某些命令便可使用此进行查看与回顾
docker --help
安装ps命令
apt-get update
apt-get install procps
2.1 镜像操作
1、拉取镜像到本地
# 拉取镜像到本地
docker pull 镜像名称
# 搜索镜像
docker search 镜像名称
# 举个例子 tomcat
docker pull daocloud.io/library/tomcat:8.5.15-jre8
2、查看全部本地的镜像
# 2. 查看全部本地的镜像
docker images
3、删除本地镜像
# 3. 删除本地镜像
docker rmi 镜像的标识
4、保存镜像到本地
将我们的镜像保存为tar压缩文件,这样方便镜像转移和保存 ,然后可以在任何一台安装了docker的服务器上,加载这个镜像
docker save 镜像名/镜像ID -o 镜像保存在哪个位置与名字
示例:
docker save tomcat -o /myiamge.tar
5、加载镜像
任何装 docker 的地方加载镜像保存文件,使其恢复为一个镜像
docker load -i 镜像保存文件位置
2.2 容器的操作
1、运行容器
# 简单操作
docker run 镜像的标识|镜像名称[tag]
# 常用的参数
docker run -d -p 宿主机端口:容器端口 --name 容器名称 镜像的标识|镜像名称[tag]
# -d: 代表后台运行容器
# -p: 宿主机端口:容器端口: 为了映射当前Linux的端口和容器的端口
# --name 容器名称: 指定容器的名称
2、查看正在运行的容器
# 查看正在运行的容器
docker ps [OPTIONS]
# OPTIONS说明:
# -a: 代表查看全部的容器,包括没有运行
# -q: 只查看容器的标识
# -f: 根据条件过滤显示的内容
# --format: 指定返回值的模板文件
# -l: 显示最近创建的容器
# -n: 列出最近创建的n个容器
# --no-trunc: 不截断输出
# -s: 显示总的文件大小
3、查看容器的日志
# 查看容器的日志
docker logs -f 容器id
# -f: 可以滚动查看日志的最后几行
4、进入容器内部
#进入到容器内部
docker exec -it 容器id bash
5、查看容器ip
docker inspect 容器id
6、删除和停止容器
# 删除容器(删除容器前,需要先停止容器)
# 停止指定的容器
docker stop 容器id
# 停止全部容器
docker stop $(docker ps -aq)
# 删除指定容器
docker rm 镜像id
# 删除全部容器
docker rm $(docker ps -aq)
输入exit即可退出返回原来的系统.
- docker run相当于执行了两步操作:将镜像放入容器中(docker create),然后将容器启动,使之变成运行时容器(docker start)。
- docker start的作用是,重新启动已存在的镜像。也就是说,如果使用这个命令,我们必须事先知道这个容器的ID,或者这个容器的名字,我们可以使用docker ps找到这个容器的信息
2.3、Docker 容器互联
docker 有一个连接系统允许将多个容器连接在一起,共享连接信息。
新建网络
下面先创建一个新的 Docker 网络。
docker network create -d bridge test-net
参数说明:
-d:参数指定 Docker 网络类型,有 bridge、overlay。
连接容器
运行两个容器并连接到新建的 test-net 网络:
docker run -itd --name test1 --network test-net rabbitmq-consumer /bin/bash
docker run -itd --name test2 --network test-net rabbitmq-provider /bin/bash
如果 test1、test2 容器内中无 ping 命令,则在容器内执行以下命令安装 ping
apt-get update
apt install iputils-ping
在 test1 容器输入以下命令:
相反在test2 容器输入以下命令,也会ping通
这样,test1 容器和 test2 容器建立了互联关系。
如果你有多个容器之间需要互相连接,推荐使用 Docker Compose。
四、Dockerfile和Springboot项目构建镜像
1、Dockerfile
使用Dockerfile来实现快速构建镜像,Dockerfile是一个文件,它由构建镜像的指令组成,指令由Docker镜像构建者自上而下排列,能够被用来修改镜像的任何信息。
注意事项:
- Dockerfile文件需放置在一个目录中,这个目录中有构建镜像的所有文件,可以创建子目录。
- 在Dockerfile文件中,"#“号开头表示注释,每行为"INSTRUCTION arguments”,习惯大写表示关键字(但并不区分大小写),后面小写表示值。
- 每个Dockerfile的第一行(注释行除外),必须使用"FROM"关键字。
- 当我们在docker build构建镜像时,会将我们的指定的上下文目录(即Dockerfile所在目录)打包传递给docker 引擎,而这个上下文中并非所有文件都会在Dockerfile中使用,这样就会使传送给docker引擎的目录过大,影响构建速度,所以可以在此目录中,定义.dockerignore文件,将不使用的文件文件名写入到该文件即可,且支持通配符。
- 最小化镜像的层数,Dockerfile中每一行命令就是一层,层数过多影响构建效率。
- Dockerfile文件中命令从上往下逐行执行。
2、Dockerfile 命令
Dockerfile分为四个部分: 基础镜像信息、维护者信息、镜像操作指令和容器启动指令。 即FROM、MAINTAINER、RUN、CMD四个部分
FROM 指定所创建镜像的基础镜像
MAINTAINER 制定维护者信息
RUN 运行命令
CMD 容器启动是默认执行的命令
LABEL 指定生成镜像的元数据标签信息
EXPOSE 声明镜像内服务所监听的端口
ENV 指定环境变量
ADD 复制指定src路径的内容到容器的dest路径下,如果src为tar文件,则自动解压到dest路径下
copy 复制指定src路径的内容到镜像的dest路径下
ENTERPOINT 指定镜像的默认入口
VOLUME 创建数据卷挂载点
USER 指定运行容器是的用户名或UID
WORKDIR 配置工作目录
ARG 指定镜像内使用的参数
ONBUILD 配置当所创建的镜像作为其他镜像的基础镜像时,所执行创建操作指令
STOPSIGAL 容器退出信号值
HEALTHCHECK 如何进行健康检查
SHELL 指定使用shell的默认shell类型
1、FROM: FROM 指令是最重的一个且必须为 Dockerfile 文件开篇的第一个非注释行,用于为映像文件构建过程指定基准镜像,后续的指令运行于此基准镜像所提供的运行环境。实践中,基准镜像可以是任何可用镜像文件,默认情况下,docker build 会在 docker 主机上查找指定的镜像文件,在其不存在时,则会从Docker Hub Registry 上拉取所需的镜像文件如果找不到指定的镜像文件,docker build 会返回一个错误信息。
Syntax:
FROM <image>[:<tag>]
FROM <image>@<digest>
<image> :指定作为base image的名称,默认从dockerhub拉取镜像,若使用其他仓库可在镜像前指定;
<tag> :base image的标签,为可选项,省略时默认为latest;
示例:
FROM java:latest
**2、MAINTAINER:**用于让镜像制作者提供本人的详细信息,Dockerfile 并不限制 MAINTAINER 指令可在出现的位置,但推荐将其放置于 FROM 指令之后,已经被 LABEL 取代,但仍可使用。
Syntax:
MAINTAINER <authtor's detail>
<author's detail>:可是任何文本信息,但约定俗成地使用作者名称及邮件地址
3、LABEL: 效果同上,指定多个元数据
Syntax:
LABEL <key>=<value> [<key>=<value> ...]
示例:
LABEL name=test mail=test@163.com
4、COPY: 用于从 Docker 主机复制文件至创建的新映像文件
Syntax:
COPY <src> ... <dest>
COPY ["<src>",... "<dest>"]
<src> :要复制的源文件或目录,支持使用通配符
<dest> :目标路径,即正在创建的image的文件系统路径;
建议为<dest>使用绝对路径否则,COPY指定则以WORKDIR为其起始路径;
文件复制准则:
1.<src>必须是build上下文中的路径,不能是其父目录中的文件
2.如果<src>是目录,则其内部文件或子目录会被递归复制,但<src>目录自身不会被复制
3.如果指定了多个<src>,或在<src>中使用了通配符,则<dest>必须是一个目录,且必须以/结尾
4.如果<dest>事先不存在,它将会被自动创建,这包括其父目录路径
示例:
COPY index.html /data/web/ #最后不加斜线会改名为web
COPY src/ /data/web #src/* 被拷贝到/data/web目录下
COPY test1 test2 /data/web/ #多文件最后必须加/
5、ADD: ADD指令类似于 COPY 指令,ADD 支持使用 TAR 文件和 URL 路径
Syntax:
ADD <src> ... <dest>
ADD ["<src>",... "<dest>"]
操作准则:同COPY指令
1.如果<src>为URL且<dest>不以/结尾,则<src>指定的文件将被下载并直接被创建为<dest>;
如果<dest>以/结尾,则文件名URL指定的文件将被直接下载并保存为<dest>/<filename>。
2.如果<src>是一个本地系统上的压缩格式的tar文件,它将被展开为一个目录,其行为类似于“tar -x”命令;
然而,通过URL获取到的tar文件将不会自动展开;
3.如果<src>有多个,或其间接或直接使用了通配符,则<dest>必须是一个以/结尾的目录路径;
如果<dest>不以/结尾,则其被视作一个普通文件,<src>的内容将被直接写入到<dest>;
示例:
ADD http://nginx.org/download/nginx-1.14.2.tar.gz /data/ #nginx-1.14.2.tar.gz会放在/data/目录下,不会解压
ADD nginx-1.14.2.tar.gz /date #nginx-1.14.2目录会放在/data/目录下,会解压
6、WORKDIR: 用于为 Dockerfile 中所有的 RUN、CMD、ENTRYPOINT、COPY 和 ADD 指定设定工作目录,其生效范围为本次定义workdir到下一次定义之间,且还会影响到进入容器时的目录
Syntax:
WORKDIR <dirpath>
注:在Dockerfile文件中,WORKDIR指令可出现多次,其路径也可以为相对路径,不过,其是相对此前一个WORKDIR指令指定的路径另外,
WORKDIR也可调用由ENV指定定义的变量
示例:
WORKDIR /var/log
WORKDIR $STATEPATH
7、VOLUME: 用于在 image 中创建一个挂载点目录,以挂载 Docker host 上的卷或其它容器上的卷,但需要注意的是此选项只能创建容器管理的卷,即在宿主机上随机挂载一个目录,而不能指定目录挂载
Syntax:
VOLUME <mountpoint>
VOLUME ["<mountpoint>"]
注:如果挂载点目录路径下此前有文件存在,docker run 命令会在卷挂载完成后将此前的所有文件复制到新挂载的卷中。
eg:
VOLUME /data #不能指定宿主机目录,随机挂载在 /var/lib/docker/volumes/...
8、EXPOSE: 用于为容器打开指定要监听的端口以实现与外部通信,但不能指定宿主机的端口绑定,并且即使在 Dockerfile 中定义了 EXPOSE ,也必须要在启动容器时手动加上 -P 选项才会生效。
Syntax:
EXPOSE <port>[/<protocol>] [<port>[/<protocol>] ...]
<protocol>用于指定传输层协议,可为tcp或udp二者之一,默认为TCP协议
示例:
EXPOSE 11211/udp 11211/tcp #EXPOSE指令可一次指定多个端口
9、ENV: 用于为镜像定义所需的环境变量,并可被 Dockerfile 文件中位于其后的其它指令(如ENV、ADD、COPY等)所调用,调用格式为 $variable_name 或 ${variable_name}。
Syntax:
ENV <key> <value> 或
ENV <key>=<value> ...
注:
1.第一种格式中,<key>之后的所有内容均会被视作其<value>的组成部分,因此,一次只能设置一个变量;
2.第二种格式可用一次设置多个变量,每个变量为一个"<key>=<value>"的键值对,如果<value>中包含空格,可以以反斜线(\)进行转义,
也可通过对<value>加引号进行标识;另外,反斜线也可用于续行;
3.定义多个变量时,建议使用第二种方式,以便在同一层中完成所有功能
4.docker run时可以使用 -e 参数指定环境变量,相同环境变量会覆盖Dockerfile中的值
示例:
ENV name=zhang \
age=15 \
sex=N
10、ARG: 此参数和 ENV 有些相似,都是指定变量值,但是在使用 ENV 时,若要动态的传递变量值,只能在 docker run 时才能传递,而 ARG 可以在 docker build 过程中,通过–build-arg 来进行动态传递参数值。除此之外,ENV 的值会保留在镜像的环境变量中,但 ARG 的值不会保存。所以若想在 build 镜像的过程中修改变量的值,推荐使用 ARG
用法同上,下图说明了构建过程,RUN 与 CMD 指令见下面介绍
11.RUN: 用于指定 docker build 过程中运行的命令,其可以是基础镜像中存在的任何命令,见下图所示。
Syntax:
RUN <command>
RUN ["<executable>", "<param1>", "<param2>"]
注:
1.第一种格式中,<command>通常是一个shell命令,且以“/bin/sh -c”来运行它,这意味着此进程在容器中的PID不为1,不能接收Unix信号,
因此,当使用docker stop <container>命令停止容器时,此进程接收不到SIGTERM信号;即在运行该命令前会先起一个sh进程,然后运行此命令。
2.第二种语法格式中的参数是一个JSON格式的数组,其中<executable>为要运行的命令,后面的<paramN>为传递给命令的选项或参数;
然而,此种格式指定的命令不会以“/bin/sh -c”来发起,因此常见的shell操作如变量替换以及通配符(?,*等)替换将不会运行;
不过,如果要运行的命令依赖于此shell特性的话,可以将其替换为类似的格式:RUN ["/bin/bash", "-c", "<executable>", "<param1>"]
示例:
RUN ls /data #将会在构建的时候执行 "ls /data"命令
RUN ["/bin/sh","-c","mkdir -p /data/hello"]
12、CMD: 类似于RUN指令,CMD 指令也可用于运行任何命令或应用程序,不过,二者的运行时间点不同,RUN指令运行于映像文件构建过程中(docker build),而CMD指令运行于基于 Dockerfile 构建出的新映像文件启动一个容器时(docker run),CMD 指令的首要目的在于为启动的容器指定默认要运行的程序,且其运行结束后,容器也将终止;不过,CMD 指定的命令其可以被 docker run 的命令行选项所覆盖,在 Dockerfile 中可以存在多个 CMD 指令,但仅最后一个会生效。
Syntax:
CMD <command>
CMD ["<executable>","<param1>","<param2>"]
CMD ["<param1>","<param2>"]
注:前两种语法格式的意义同RUN,第一种用法虽然会先起sh进程,但是执行完command后,sh进程会退出,并由command的进程替代为1号进程,第三种则用于为ENTRYPOINT指令提供默认参数。
示例:
CMD /bin/httpd -f -h $DOC_ROOT #如下可见在运行命令之前会预先运sh命令
~]# docker image inspect -f {{.Config.Cmd}} test
[/bin/sh -c /bin/httpd -f -h $DOC_ROOT]
~]# docker container run --name NAME -it --rm IMAGE_NAME /bin/bash #CMD 指定的命令可在 docker run 时指定命令修改
13、ENTRYPOINT: 类似 CMD 指令的功能,用于为容器指定默认运行程序,从而使得容器像是一个单独的可执行程序,与 CMD 不同的是,由 ENTRYPOINT 启动的程序不会被 docker run 命令行指定的参数所覆盖,而且,这些命令行参数会被当作参数传递给 ENTRYPOINT 指定指定的程序。不过,docker run 命令的 --entrypoint 选项的参数可覆盖 ENTRYPOINT 指令指定的程序。
Syntax:
ENTRYPOINT <command>
ENTRYPOINT ["<executable>", "<param1>", "<param2>"]
注:
1.docker run命令传入的命令参数会覆盖CMD指令的内容并且附加到ENTRYPOINT命令最后做为其参数使用。
2.Dockerfile文件中也可以存在多个ENTRYPOINT指令,但仅有最后一个会生效。
示例:
CMD ["/bin/ls","/etc"]
ENTRYPOINT ["/bin/bash","-c"] #会先启动sh进程,CMD指定的命令会被当做参数传给 /bin/bash -c
~]# docker container run --name NAME -it --rm IMAGE_NAME /bin/bash #使用entrypoint时,docker run时动态指定的命令将会被当做参数传递给entrypoint定义的命
~]# docker container run --name NAME -it --rm --entrypoint "/bin/bash" IMAGE_NAME #entrypoint指定的命令可以在docker run时添加的 --entrypoint 后的命令所覆盖
14、USER: 用于指定运行image时的或运行 Dockerfile 中任何 RUN、CMD 或 ENTRYPOINT 指令指定的程序时的用户名或 UID,默认情况下,container 的运行身份为root用户。
Syntax:
USER <UID>|<UserName>
注:需要注意的是,<UID>可以为任意数字,但实践中其必须为/etc/passwd中某用户的有效UID,否则,docker run命令将运行失败。
。
15、HEALTHCHECK: 对容器进行健康状态检测。
Syntax:
HEALTHCHECK [OPTIONS] CMD command
OPTIONS:
--interval:多长时间检测一次,默认30s
--timeout:超时时长,默认30s
--start-period:容器启动后多久开始检测,默认30s
--retries:重试次数:默认3次
响应码:
0:success
1:unhealthy
2:reserved
示例:
HEALTHECK --interval=5m --timeout=30s CMD curl -f http://localhost/ || exit 1
16、SHELL: 在使用 RUN、CMD 等命令时,有些格式在运行命令前会先启动一个sh进程,默认使用的是 /bin/sh,但在有些时候我们需要改变默认的 SHELL。
Syntax: SHELL ["executable","parameters"]
17、STOPSIGAL: 默认的 stop-signal 是 SIGTERM,在 docker stop 的时候会给容器内 PID 为1的进程发送这个 signal,通过 --stop-signal 可以设置自己需要的 signal,主要的目的是为了让容器内的应用程序在接收到 signal 之后可以先做一些事情,实现容器的平滑退出,如果不做任何处理,容器将在一段时间之后强制退出,会造成业务的强制中断,这个时间默认是10s。这个命令很少用到。
18、ONBUILD: 用于在 Dockerfile 中定义一个触发器,Dockerfile 用于 build 映像文件,此映像文件亦可作为 base imag 被另一个 Dockerfile 用作 FROM 指令的参数,并以之构建新的映像文件,在后面的这个 Dockerfile 中的 FROM 指令在 build 过程中被执行时,将会“触发”创建其 base image 的 Dockerfile 文件中的 ONBUILD 指令定义的触发器。简单来说,就是别人基于你的镜像重新制作镜像时才会触发此命令。
Syntax:
ONBUILD <INSTRUCTION>
注:
1.尽管任何指令都可注册成为触发器指令,但ONBUILD不能自我嵌套,且不会触发FROM和MAINTAINER指令
2.使用包含ONBUILD指令的Dockerfile构建的镜像应该使用特殊的标签,例如ruby:2.0-onbuild
3.在ONBUILD指令中使用ADD或COPY指令应该格外小心,因为新构建过程的上下文在缺少指定的源文件时会失败
3、示例:
容器运行nginx,新建目录编写Dockerfile
FROM centos:7 #指定基础镜像,你也可以不用指定小版本
ENV TZ=Asia/Shanghai #时区
RUN yum -y install epel* \
yum -y install gcc openssl openssl-devel pcre-devel zlib-devel
# nginx环境安装
ADD nginx-1.14.0.tar.gz /opt/ #解压tar包到容器的/opt/
WORKDIR /opt/nginx-1.14.0 #指定工作目录,在没有下一个WORKDIR出现之前,一直都是在这个目录里面
RUN ./configure --prefix=/opt/nginx --http-log-path=/opt/nginx/logs/access.log --error-log-path=/opt/nginx/logs/error.log --http-client-body-temp-path=/opt/nginx/client/ --http-proxy-temp-path=/opt/nginx/proxy/ --with-http_stub_status_module --with-file-aio --with-http_flv_module --with-http_gzip_static_module --with-stream --with-threads --user=www --group=www
# 编译安装所指定的一些目录
RUN make && make install
RUN groupadd www && useradd -g www www #创建用户
WORKDIR /opt/nginx
RUN rm -rf /opt/nginx-1.14.0
ENV NGINX_HOME=/opt/nginx
ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/nginx/sbin
EXPOSE 80 443 #指定监听端口
CMD /bin/sh -c 'nginx -g "daemon off;"' #后台守护进程的方式
[root@localhost dockers]# ls #将nginx的tar包放在跟Dockerfile同一目录下
Dockerfile nginx-1.14.0.tar.gz
# 注意:看好版本号,如果你的版本号跟我的不一样,上面Dockerfile中的版本号也需要改。
[root@localhost dockers]# docker pull centos:7 #拉取基础镜像
[root@localhost dockers]# docker build -t nginx_docker:v1 . #构建镜像
4、SpringBoot制作镜像
在虚拟机上新建文件夹,将SpringBoot项目打包成jar包放进去,
然后vim新建Dockerfile文件,内容如下
FROM java:latest
VOLUME /tmp
ADD yiyun-0.0.1-SNAPSHOT.jar app.jar
RUN bash -c 'touch /app.jar'
EXPOSE 9400
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
FROM :表示使用哪个基础镜像去构建新的镜像。
ADD :赋值文件并重命名
EXPOSE:表示对外开放端口,我使用的是9400. 项目中的端口就是9400
RUN bash -c 'touch /app.jar' :它的作用等同于拷贝文件到容器. 使用 shell编程,执行一个 touch 命令,更新文件的访问和修改时间 -c 如果文件不存在,则不要进行创建。具体参考liunx 的 touch 命令和shell编程。
ENTRYPOINT :入口点, 表示容器运行后默认执行的命令。。
# 构建镜像 yiyun-docker为镜像名,可随便取
docker build -t yiyun-docker .
# 使用名称查看镜像
docker images
# 通过image ID去运行容器,也可以使用名字
docker run -d -p 9900:9400 yiyun-docker
-d参数是让容器后台运行
-p 是做端口映射,宿主机端口:容器端口
我们访问这个项目的时候,访问的端口是9900这个端口,它会映射到这个项目的9400端口,从而访问应用,例:
http://39.107.14.61:9900/role/list
# 查看正在运行的容器
docker ps
# 通过容器id查看项目启动日志
docker logs -f --tail=100 5439a1a4bf4a