Dockerfile

Posted CSR-kkk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dockerfile相关的知识,希望对你有一定的参考价值。

文章目录

Dockerfile

Dockerfile 就是用来构建 docker 镜像的构建文件。命令脚本

通过这个脚本可以生成镜像,镜像是一层一层的,脚本是一个个的命令,每个命令都是一层

# 创建一个dockerfile 文件,建议Dockerfile
# 文件中的内容
[root@localhost docker-test-volume]# pwd
/home/docker-test-volume
[root@localhost docker-test-volume]# vim dockerfile1

FROM centos

VOLUME ["volume01","volume02"]

CMD echo "----end----"

CMD /bin/bash

# 这里的每个命令,就是镜像的一层

[root@localhost docker-test-volume]# docker build -f /home/docker-test-volume/dockerfile1 -t antony/centos:1.0 .

启动我们自己的镜像



构建步骤

  1. 编写一个 dockerfile 文件
  2. docker build 构建成为一个镜像
  3. docker run 运行镜像
  4. docker push 发布镜像(DockerHub、阿里云镜像仓库)



DockerFile 构建过程

基础

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

步骤: 开发,部署,运维

  1. DockerFile:构建文件,定义了一切的步骤,源代码
  2. DockerImages:通过 DockerFile 构建生成的镜像,最终发布和运行的产品
  3. Docker容器:容器就是镜像运行起来提供服务

DockerFile 指令

FROM		# 基础镜像
MAINTAINER	# 作者,姓名+邮箱
RUN			# 镜像构建需要运行命令
ADD			# 步骤:添加内容
WORKDIR		# 镜像工作目录
VOLUME		# 挂载的目录
EXPOSE		# 暴露端口配置
CMD			# 指定这个容器启动的时候要运行的命令 只有最后一个会生效,可被替代
ENTRYPOINT	# 指定这个容器启动的时候要运行的命令 可以追加命令
ONBUILE		# 当构建一个被继承 DockerFile ,会运行 ONBUILD 指令,触发指令
COPY		# 类似ADD ,将文件拷贝到镜像中
ENV			# 构建时设置环境变量

实战测试

Docker Hub 99% 的镜像都是从 FROM scratch ,然后配置需要的软件和配置来进行构建

创建 centos镜像

# 编写dockerfile的文件
[root@localhost dockerfile]# vim mydockerfile
[root@localhost dockerfile]# cat mydockerfile 
FROM centos
MAINTAINER kkk<2244200475@qq.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash

# 通过这个文件构建镜像
# 命令 docker build -f dockerfile文件路径 -t 镜像名:[tag]
[root@localhost dockerfile]# docker build -f mydockerfile -t mycentos:0.1 .

Successfully built 75f7e9077951
Successfully tagged mycentos:0.1

# 测试运行


centos官方

我们增加后创建的centos

列出本地镜像的变更历史

测试 cmd

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

CMD		# 
[root@localhost dockerfile]# vim dockerfile-cmd-test
FROM centos
CMD ["ls","-a"]

# 构建镜像
[root@localhost dockerfile]# docker build -f dockerfile-cmd-test -t cmdtest .

# run 运行 ,发现ls-a命令生效
[root@localhost dockerfile]# docker run 71ffe4bcd1a8
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

# 想追加一个命令 -l,期望:ls -al
root@localhost dockerfile]# docker run 71ffe4bcd1a8 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.

# cmd的情况下, -l 替换了CMD ["ls","-a"]命令,-l不是命令,所以报错

测试 ENTRYPOINT

[root@localhost dockerfile]# vim dockerfile-cmd-entrypoint
FROM centos
ENTRYPOINT ["ls","-a"]

[root@localhost dockerfile]# docker build -f dockerfile-cmd-entrypoint -t entrypoint-test .
Sending build context to Docker daemon  4.096kB
Step 1/2 : FROM centos
 ---> 300e315adb2f
Step 2/2 : ENTRYPOINT ["ls","-a"]
 ---> Running in 19e2d650bc3c
Removing intermediate container 19e2d650bc3c
 ---> 28f7b093e7a9
Successfully built 28f7b093e7a9
Successfully tagged entrypoint-test:latest
[root@localhost dockerfile]# docker run 28f7b093e7a9
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

# 追加命令,是直接拼接在 ENTRYPOINT命令的后面
[root@localhost dockerfile]# docker run 28f7b093e7a9 -l
total 0
drwxr-xr-x.   1 root root   6 Jun 13 06:21 .
drwxr-xr-x.   1 root root   6 Jun 13 06:21 ..
-rwxr-xr-x.   1 root root   0 Jun 13 06:21 .dockerenv
lrwxrwxrwx.   1 root root   7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x.   5 root root 340 Jun 13 06:21 dev
drwxr-xr-x.   1 root root  66 Jun 13 06:21 etc
drwxr-xr-x.   2 root root   6 Nov  3  2020 home
lrwxrwxrwx.   1 root root   7 Nov  3  2020 lib -> usr/lib
lrwxrwxrwx.   1 root root   9 Nov  3  2020 lib64 -> usr/lib64
drwx------.   2 root root   6 Dec  4  2020 lost+found
drwxr-xr-x.   2 root root   6 Nov  3  2020 media
drwxr-xr-x.   2 root root   6 Nov  3  2020 mnt
drwxr-xr-x.   2 root root   6 Nov  3  2020 opt
dr-xr-xr-x. 227 root root   0 Jun 13 06:21 proc
dr-xr-x---.   2 root root 162 Dec  4  2020 root
drwxr-xr-x.  11 root root 163 Dec  4  2020 run
lrwxrwxrwx.   1 root root   8 Nov  3  2020 sbin -> usr/sbin
drwxr-xr-x.   2 root root   6 Nov  3  2020 srv
dr-xr-xr-x.  13 root root   0 Jun 11 04:32 sys
drwxrwxrwt.   7 root root 145 Dec  4  2020 tmp
drwxr-xr-x.  12 root root 144 Dec  4  2020 usr
drwxr-xr-x.  20 root root 262 Dec  4  2020 var

Dockerfile中很多命令十分相似,对他们进行测试可以更好的进行区别


Tomcat镜像

  1. 准备镜像文件 tomcat 压缩包,jdk的压缩包
  2. 编写dockerfile 文件,官方命名 Dockerfile,build时会自动寻找这个文件,不需要-f 指定
[root@localhost tomcat]# vim Dockerfile

FROM centos
MAINTAINER kkk<2244200475@qq.com>

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

ADD jdk-8u181-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.46.tar.gz /usr/local/

RUN yum -y install vim

ENV MYPATH /usr/local
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_181
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.46
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.46
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080

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

  1. 构建镜像
docker build -t diytomcat .
  1. 启动镜像
docker run -d -p 9090:8080 --name kkktomcat -v /home/kkk/build/tomcat/test:/usr/local/apache-tomcat-9.0.46/webapps/test -v /home/kkk/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.46/logs diytomcat
  1. 访问测试
[root@localhost tomcat]# curl localhost:9090

外网访问:http://192.168.199.136:9090/

  1. 发布项目(配置卷挂载,可以直接在本地编写项目直接发布)
[root@localhost test]# pwd 
/home/kkk/build/tomcat/test
[root@localhost test]# mkdir WEB-INF
[root@localhost test]# cd WEB-INF/
[root@localhost WEB-INF]# vim web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
    xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
        http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
</web-app>
[root@localhost WEB-INF]# cd ..
[root@localhost test]# ls
WEB-INF
[root@localhost test]# vim index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>Hello kkk</title>
</head>
<body>
Hello World!<br/>
<% 
System.out.println("----my test web logs ----");
%>
</body>
</html>
  1. 访问test
    http://192.168.199.136:9090/test/

发布镜像

DockerHub

1.注册 dockerhub 账号

2.确定这个账号可以登录

3.在服务器上提交自己的镜像

# 登录需要 配置参数 -u username -p password
[root@localhost tomcat]# docker login --help

Usage:  docker login [OPTIONS] [SERVER]

Log in to a Docker registry.
If no server is specified, the default is defined by the daemon.

Options:
  -p, --password string   Password
      --password-stdin    Take the password from stdin
  -u, --username string   Username

[root@localhost tomcat]# docker login -u dhkkk
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

4.登录完毕可以提交镜像了,docker push

[root@localhost tomcat]# docker push diytomcat
Using default tag: latest
The push refers to repository [docker.io/library/diytomcat]
62234a017255: Preparing 
84d76c0b75c2: Preparing 
9c006be1663f: Preparing 
f68e4ea14ba7: Preparing 
2653d992f4ef: Preparing 
denied: requested access to the resource is denied 	# 拒绝

# 解决
[root@localhost tomcat]# docker tag 06e63e01c939 dhkkk/diytomcat:1.0

# docker push 使用版本号
[root@localhost tomcat]# docker push dhkkk/diytomcat:1.0

The push refers to repository [docker.io/dhkkk/diytomcat]
62234a017255: Pushed 
84d76c0b75c2: Pushed 
9c006be1663f: Pushed 
f68e4ea14ba7: Pushed 
2653d992f4ef: Pushed 
1.0: digest: sha256:1917e821bf4f16f9019196f823ad06163f50a5ee5274ff72f764a609fb277388 size: 1373

提交的时候也是按照镜像的层级进行提交

阿里云镜像服务

1、登录阿里云

2、找到容器镜像服务,进入个人实例

3、创建命名空间

4、创建容器镜像仓库

5、浏览信息
https://cr.console.aliyun.com/repository/cn-beijing/mykkk/kkk-test/details


总结

以上是关于Dockerfile的主要内容,如果未能解决你的问题,请参考以下文章

DockerFile指令

dockerfile解析过程

docke--Dockerfile构建docker镜像

Docker入门与应用系列Dockerfile

Docker篇章7:Docker-Dockerfile

Docker篇章7:Docker-Dockerfile