Docker——Dockerfile(构建自己的tomcat镜像和node.js应用)

Dockerfile的概述

  • dockerfile是用来构建docker镜像的文件,写有命令参数的脚本
  • 构建步骤:
    1. 编写一个dockerfile 文件
    2. docker build 构建成为一个镜像
    3. docker run 运行镜像
    4. docker push 发布镜像

Dockerfile构建过程

  1. 每个保留关键字(指令)都必须是大写字母
  2. 从上到下顺序执行
  3. # 表示注释
  4. 每一个指令都会创建提交一个新的镜像层,并提交!

在这里插入图片描述

  • 以后要发布项目,就需要做镜像,通过编写dockerfile文件

语法要求

  • 执行docker build的目录为镜像创建的工作目录,所有被Dockerfile引用的文件都必须在此目录或者其子目录中,不可超出工作目录的边界
  • Dockerfile可以引用文件也可以引用目录,支持通配符,对于引用的目录中个别不需要的文件可以将路径写入.dockerignore文件中,该文件同样支持通配符
  • 注释以 # 开头,类似于shell 脚本
  • 非注释的非空行是指令行,指令不区分大小写,但是约定都是大写,一个指令是镜像的一个层,因此需要合理编排,尽可能减少层级
  • Dockerfile支持变量的引用,引用时与shell脚本一致: $var , ${var} , ${var:-default} , ${var:+word}

Dockerfile指令

  • FROM
    基础镜镜像,一切从这里开始构建
  • MAINTAINER
    镜像是谁写的,姓名+邮箱
  • RUN
    镜像构建的时候需要运行的命令
  • ADD
    步骤: tomcat镜像,这个tomcat压缩包!添加内容
  • WORKDIR
    镜像的工作目录
  • VOLUME
    挂载的目录
  • EXPOSE
    保留端口配置
  • CMD
    指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
  • ENTRYPOINT
    指定这个容器启动的时候要运行的命令,可以追加命令
  • ONBUILD
    当构建一个被继承DockerFile这个时候就会运行ONBUILD的指令,触发指令。
  • COPY
    类似ADD ,将我们文件拷贝到镜像中
  • ENV
    构建的时候设置环境变量
    在这里插入图片描述

构建自己的centos

mkdir /home/dockerfile

cd /home/dockerfile/

编写dockerfile文件
vim mydockerfile-centos

FROM centos
MAINTAINER  maomao<123@qq.com>

ENV MYPATH /usr/lcoal		# 进入容器的目录
WORKDIR MYPATH		# 工作目录

RUN yum -y install vim		# 安装
RUN yum -y install net-tools

EXPOSE 80		# 暴露的端口

CMD echo $MYPATH
CMD echo 'hello docker'
CMD /bin/bash

构建镜像
docker build -f dockerfile路径 -t 镜像名:[tag] 当前路径

docker build -f mydockerfile-centos -t maomao_centos:1.0 .

Successfully built 615fb441b479
Successfully tagged maomao_centos:1.0

运行容器
docker run -it --name=mao maomao_centos:1.0 /bin/bash
进入的工作目录 默认是local
[root@b3f0482461c6 lcoal]# vim zhu.txt	测试vim
[root@b3f0482461c6 lcoal]# ifconfig		测试 net-tools

查看镜像构建过程
docker history 615fb441b479

IMAGE          CREATED         CREATED BY                                      SIZE      COMMENT
615fb441b479   3 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B        
3979e4623648   3 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
646696a0b8ed   3 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
33c8c99450cd   3 minutes ago   /bin/sh -c #(nop)  EXPOSE 80                    0B        
bf38f30c0adf   3 minutes ago   /bin/sh -c yum -y install net-tools             23.4MB    
8b903774d8c6   3 minutes ago   /bin/sh -c yum -y install vim                   58.1MB    
2782f58eb979   4 minutes ago   /bin/sh -c #(nop) WORKDIR /usr/lcoal            0B        
92bfc67d1462   4 minutes ago   /bin/sh -c #(nop)  ENV MYPATH=/usr/lcoal        0B        
e4cc2e62cdc7   4 minutes ago   /bin/sh -c #(nop)  MAINTAINER maomao<123@qq.…   0B        
300e315adb2f   4 months ago    /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B        
<missing>      4 months ago    /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B        
<missing>      4 months ago    /bin/sh -c #(nop) ADD file:bd7a2aed6ede423b7…   209MB  

CMD和ENTRYPOINT的区别

  • CMD
    指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
  • ENTRYPOINT
    指定这个容器启动的时候要运行的命令,可以追加命令

测试cmd

vim dockerfile-cmd-test 

FROM centos
CMD ["ls","-a"]

docker build -f dockerfile-cmd-test -t cmdtest .

docker run cmdtest
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

我们追加一个参数
[root@docker dockerfile]# docker run cmdtest /
docker: Error response from daemon: OCI runtime create failed: container_linux.go:367: starting container process caused: exe
c: "/": permission denied: unknown.ERRO[0000] error waiting for container: context canceled

在后面加-l会报错
因为CMD的情况下 -l是替换了[“ls”,”-a”]命令,因为-l不是命令因此报错

如果把-l换成一个命令 就可以执行成功
docker run cmdtest ls -al

测试ENTRYPOINT

vim dockerfile-entrypoint-test

FROM centos
ENTRYPOINT ["ls","-a"]

docker build -f dockerfile-entrypoint-test -t entrypoint_test .

[root@docker dockerfile]# docker run entrypoint_test
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

我们追加命令,是直接拼接在 ENTRYPOINT 命令的后面
[root@docker dockerfile]# docker run entrypoint_test -l
total 0
drwxr-xr-x   1 root root   6 Apr 23 08:31 .
drwxr-xr-x   1 root root   6 Apr 23 08:31 ..
-rwxr-xr-x   1 root root   0 Apr 23 08:31 .dockerenv
lrwxrwxrwx   1 root root   7 Nov  3 15:22 bin -> usr/bin
drwxr-xr-x   5 root root 340 Apr 23 08:31 dev
drwxr-xr-x   1 root root  66 Apr 23 08:31 etc
drwxr-xr-x   2 root root   6 Nov  3 15:22 home
lrwxrwxrwx   1 root root   7 Nov  3 15:22 lib -> usr/lib
lrwxrwxrwx   1 root root   9 Nov  3 15:22 lib64 -> usr/lib64
drwx------   2 root root   6 Dec  4 17:37 lost+found
drwxr-xr-x   2 root root   6 Nov  3 15:22 media
drwxr-xr-x   2 root root   6 Nov  3 15:22 mnt
drwxr-xr-x   2 root root   6 Nov  3 15:22 opt
dr-xr-xr-x 142 root root   0 Apr 23 08:31 proc
dr-xr-x---   2 root root 162 Dec  4 17:37 root
drwxr-xr-x  11 root root 163 Dec  4 17:37 run
lrwxrwxrwx   1 root root   8 Nov  3 15:22 sbin -> usr/sbin
drwxr-xr-x   2 root root   6 Nov  3 15:22 srv
dr-xr-xr-x  13 root root   0 Apr 23 03:55 sys
drwxrwxrwt   7 root root 145 Dec  4 17:37 tmp
drwxr-xr-x  12 root root 144 Dec  4 17:37 usr
drwxr-xr-x  20 root root 262 Dec  4 17:37 var

然后在后面加-l 	和CMD就有不一样的地方出现
ENTRYPOINT后面加-l 不会报错
而是相当于追加了一条命令 CMD是替换命令

ENTRYPOINT后面加-l 是 ls -a 变成了ls -la

Dockerfile制作tomcat镜像

准备好镜像文件
[root@docker tomcat]# ls
apache-tomcat-7.0.78.tar.gz  jdk-8u171-linux-x64.tar.gz

编写dockerfile文件,官方命名Dockerfile,build 会自动寻找这个文件,就不需要 -f 指定了!

FROM centos
MAINTAINER maomao<123@qq.com>

COPY readme.txt /usr/local/readme.txt

ADD jdk-8u171-linux-x64.tar.gz /usr/local	# ADD 会自动解压文件
ADD apache-tomcat-7.0.78.tar.gz /usr/local

RUN yum -y install vim

ENV MYPATH /usr/lcoal
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_171	# 设置环境变量
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-7.0.78
ENV CATALINA_BASH /usr/local/apache-tomcat-7.0.78
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080

CMD /usr/local/apache-tomcat-7.0.78/bin/startup.sh && tail -F /usr/local/apache-tomcat-7.0.78/bin/logs/catalina.out

创建镜像

docker build -t mytomcat .

Successfully built d02031863791
Successfully tagged mytomcat:latest

启动容器

docker run -d -p 9090:8080 --name mytomcat -v /home/tomcat/test:/usr/local/apache-tomcat-7.0.78/webapps/test -v/home/tomcat/tomcatlogs:/usr/local/apache-tomcat-7.0.78/logs mytomcat

测试
curl localhost:9090

在这里插入图片描述

发布项目

由于做了卷挂载,我们直接在本地编写项目就可以发布了,将自己的网页放入/home/test测试

[root@docker test]# ls
contact.html  hunsha.zip  index.html  locations.html  news.html      sence.html
css           image       js          loveshow.html   news_sec.html  showcase.html

在这里插入图片描述

部署简单的Node.js应用

mkdir /home/node

编写一个简单的Node.js应用
vim app.js

const http = require('http');
const os = require('os');

console.log("Kubia server starting...");

var handler = function(request, response) {
  console.log("Received request from " + request.connection.remoteAddress);
  response.writeHead(200);
  response.end("You are hit " + os.hostname() + "\n");
};

var www = http.createServer(handler);
www.listen(8080);


编写Dockerfile
FROM node:7
ADD app.js /app.js
ENTRYPOINT ["node", "app.js"]

构建镜像
[root@docker node]# docker build -t kubia .
Sending build context to Docker daemon  3.072kB
Step 1/3 : FROM node:7
 ---> d9aed20b68a4
Step 2/3 : ADD app.js /app.js
 ---> 3cae9f18a21d
Step 3/3 : ENTRYPOINT ["node", "app.js"]
 ---> Running in 7c87dc602255
Removing intermediate container 7c87dc602255
 ---> 0b1130f7dd54
Successfully built 0b1130f7dd54
Successfully tagged kubia:latest


运行镜像
docker run -d -p 8080:8080 --name kubia01 kubia

[root@docker node]# curl localhost:8080
You are hit d5eabb77b230

在这里插入图片描述

发布镜像到DockerHub和阿里云服务

官方注册账号
确定自己的账号可以登录
在服务器上进行镜像提交

登陆账号
docker login -u 账号
输入密码
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

docker tag d02031863791 maomao/tomcat:1.0

push就可以上传镜像了
docker push maomao/tomcat:1.0
  1. 登录阿里云

  2. 找到容器镜像服务

  3. 创建命名空间
    在这里插入图片描述

  4. 创建容器镜像

在这里插入图片描述
5. 上传镜像的步骤

退出之前的账号
[root@docker ~]# docker logout
Removing login credentials for https://index.docker.io/v1/

登录阿里云的账号
[root@docker ~]# docker login --username=账号 registry.cn-chengdu.aliyuncs.com
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

生成镜像版本号
docker tag d02031863791 maomao/tomcat:1.0

将镜像推送到Registry
docker push maomao/tomcat:1.0

然后在阿里云自己的镜像仓库可以查看到上传的镜像
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值