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

案例 CentOS

FROM scratch
ADD centos-7-x86_64-docker.tar.xz /

LABEL \
org.label-schema.schema-version="1.0" \
org.label-schema.name="CentOS Base Image" \
org.label-schema.vendor="CentOS" \
org.label-schema.license="GPLv2" \
org.label-schema.build-date="20201113" \
org.opencontainers.image.title="CentOS Base Image" \
org.opencontainers.image.vendor="CentOS" \
org.opencontainers.image.licenses="GPL-2.0-only" \
org.opencontainers.image.created="2020-11-13 00:00:00+00:00"
RUN rm -rf /var/cache && rm -rf /tmp/*
CMD ["/bin/bash"]

Docker指令

基础知识:

  1. 每个保留关键字(指令)都必须是大写字母
  2. 从上到下顺序执行
  3. #表示注释
  4. 每一个指令都会创建一个新的镜像层,并提交!
命令 解释
FROM 基础镜像
MAINTAINER 镜像编写者,姓名+邮箱
RUN 运行
ADD 添加
WORKDIR 镜像工作目录
VOLUME 挂载的目录
EXPOSE 暴露端口
CMD 指定容器启动时要运行的命令,最后一个生效
ENTRYPOINT 指定容器启动时要运行的命令
ONBUILD 被继承时运行该指令,触发指令
COPY 类似ADD,将文件拷贝到镜像中
ENV 构建时设置环境变量

实战测试

Docker Hub中99%的镜像都是从这个基础镜像过来的 FROM scratch,然后添加需要的软件和配置来进行构建

构建CentOS

创建一个自己的CentOS

添加vimifconfig命令,编写DockerFile文件

FROM centos:7
MAINTAINER swcode<2627311935@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 "构建完成"
CMD /bin/bash

构建CentOS

docker build -f mydockerfile -t mycentos:0.1 .

成功之后会打印

Successfully built d2a4569364a1
Successfully tagged mycentos:0.1

测试运行

docker run -it mycentos:0.1
pwd
ifconfig
vim test.txt

查看镜像构建过程

docker history 

CMD和ENTRYPOINT

CMD 和 ENTRYPOINT 区别

命令 描述
CMD 指定容器启动时要运行的命令,最后一个生效
ENTRYPOINT 指定容器启动时要运行的命令,可追加

测试CMD

新建dockerfile

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

构建

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

尝试追加-l,无法执行,报错。

[root@swcode dockerfile]# docker run -it cmdtest -l
docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "-l": executable file not found in $PATH: unknown.
ERRO[0000] error waiting for container: context canceled

测试ENTRYPOINT

新建dockerfile

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

构建

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

追加-l,成功执行。

[root@swcode dockerfile]# docker run -it entrypoint-test -l
total 64
drwxr-xr-x 1 root root 4096 Feb 15 08:17 .
drwxr-xr-x 1 root root 4096 Feb 15 08:17 ..
-rwxr-xr-x 1 root root 0 Feb 15 08:17 .dockerenv
-rw-r--r-- 1 root root 12114 Nov 13 2020 anaconda-post.log
lrwxrwxrwx 1 root root 7 Nov 13 2020 bin -> usr/bin

构建Tomcat

1、准备镜像文件 tomcat 压缩包,jdk的压缩包

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

touch readme.txt
vim Dokcerfile

写入以下内容

FROM centos:7
MAINTAINER swcode<2627311935àqq.com>

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

ADD jdk-8u351-linux-x64.tar /usr/local
ADD apache-tomcat-9.0.71.tar.gz /usr/local

RUN yum -y install vim

ENV MYPATH /usr/local
WORKDIR $MYPATH

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

EXPOSE 8080

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

3、构建镜像

docker build -t diytomcat:1.0 .

4、启动镜像

docker run -d -p 9090:8080 --name swcode-tomcat -v /home/swcode/build/tomcat/test:/usr/local/apache-tomcat-9.0.71/webapps/test -v /home/swcode/build/tomcat/logs/:/usr/local/apache-tomcat-9.0.71/logs diytomcat:1.0

5、启动成功,访问ip:9090

6、发布项目

cd /home/swcode/build/tomcat/test
mkdir WEB-INF
vim web.xml

写入以下内容

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">


</web-app>

创建首页面index.jsp

cd /home/swcode/build/tomcat/test
vim index.jsp

写入以下内容

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Hello World</title>
</head>
<body>
Hello World!<br/>
<%
out.println("项目发布成功");
%>
</body>
</html>

访问ip:9090/test

发布镜像

发布到Docker Hub

Docker Hub:https://hub.docker.com

1、注册账号、登陆

[root@swcode 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

2、提交自己的镜像

docker push swcode/diytomcat:1.0

发布到阿里云

小结