Dockerfile
- Dockerfile的概述
- Dockerfile构建过程
- 语法要求
- Dockerfile指令
- 构建自己的centos
- CMD和ENTRYPOINT的区别
- Dockerfile制作tomcat镜像
- 发布项目
- 部署简单的Node.js应用
- 发布镜像到DockerHub和阿里云服务
Dockerfile的概述
- dockerfile是用来构建docker镜像的文件,写有命令参数的脚本
- 构建步骤:
- 编写一个dockerfile 文件
- docker build 构建成为一个镜像
- docker run 运行镜像
- docker push 发布镜像
Dockerfile构建过程
- 每个保留关键字(指令)都必须是大写字母
- 从上到下顺序执行
- # 表示注释
- 每一个指令都会创建提交一个新的镜像层,并提交!
- 以后要发布项目,就需要做镜像,通过编写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
- 登录阿里云
- 找到容器镜像服务
- 创建命名空间
- 创建容器镜像
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
然后在阿里云自己的镜像仓库可以查看到上传的镜像