Dockerfile
Dockerfile

目录
[toc]
1、Dockerfile概述
Docker通过Dockerfile自动构建镜像,Dockerfile是一个包含用于组建镜像的文本文件,由一条一条的指令组成。
2、Dockerfile常用指令
| 指令 | 描述 |
|---|---|
| FROM | 构建新镜像是基于哪个镜像 |
| LABEL | 标签 (LABEL 打标签,写不写都行的;) |
| RUN | 构建镜像时运行的Shell命令 (通过 换行符:&& \,可以运行多行shell命令) |
| COPY | 拷贝文件或目录到镜像中 |
| ADD | 解压压缩包并拷贝 |
| ENV | 设置环境变量 |
| USER | 为RUN、CMD和ENTRYPOINT执行命令指定运行用户 |
| EXPOSE | 声明容器运行的服务端口(EXPOSE 80 :事声明一个80端口,不是实际暴露;) 声明容器监听的端口号为 12445。这主要是为了文档和开发目的,实际暴露端口是在运行容器时通过 docker run -p 参数来实现的。 |
| WORKDIR | 为RUN、CMD、ENTRYPOINT、COPY和ADD设置工作目录; |
| CMD | 运行容器时默认执行,如果有多个CMD指令,最后一个生效。 |
3、构建镜像命令
1构建镜像命令
2Usage: docker build [OPTIONS] PATH | URL | - [flags]
3Options:
4-t, --tag list ### 镜像名称
5-f, --file string ### 指定Dockerfile文件位置
6
7
8docker build -t shykes/myapp . #.代表当前路径,如果你的dockerfile文件名默认为Dockerfile,那也是可以不用指定-f的;
9docker build -t shykes/myapp -f /path/Dockerfile
10docker build -t shykes/myapp http://www.example.com/Dockerfile
4、案例
构建Nginx镜像
(1)源码编译
💘 实战:构建Nginx镜像-2023.1.7(测试成功)

- 实验环境
1docker 20.10.12
- 实验软件
链接:https://pan.baidu.com/s/1m2dtWTyRcJwuSdq1kZyy5g?pwd=bjbw
提取码:bjbw
2022.2.28-Dockerfile实验软件

前言:
nginx:一般可以部署一些前端的静态文件;
tomcat:一般可以部署一些java的war包;(tomcat也可以处理静态程序的;)
1、准备测试软件
1[root@docker ~]###ll -h dockerfile.zip
2-rw-r--r-- 1 root root 46M Aug 13 2021 dockerfile.zip
3[root@docker ~]###unzip dockerfile.zip
4[root@docker ~]###cd dockerfile
5[root@docker dockerfile]###ls
6java nginx php tomcat
7[root@docker dockerfile]###ls nginx/
8Dockerfile nginx-1.15.5.tar.gz nginx.conf php.conf
9[root@docker dockerfile]###ls tomcat/
10apache-tomcat-8.5.43.tar.gz Dockerfile ROOT.war
2、编写Dockerfile
1[root@docker dockerfile]#cd nginx/
2[root@docker nginx]#cat Dockerfile
3FROM centos:7
4LABEL maintainer www.ctnrs.com
5RUN yum install -y gcc gcc-c++ make \
6openssl-devel pcre-devel gd-devel \
7iproute net-tools telnet wget curl && \
8yum clean all && \
9rm -rf /var/cache/yum/*
10
11ADD nginx-1.15.5.tar.gz /
12RUN cd nginx-1.15.5 && \
13./configure --prefix=/usr/local/nginx \
14--with-http_ssl_module \
15--with-http_stub_status_module && \
16make -j 4 && make install && \
17mkdir /usr/local/nginx/conf/vhost && \
18cd / && rm -rf nginx* && \
19ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
20
21ENV PATH $PATH:/usr/local/nginx/sbin
22COPY nginx.conf /usr/local/nginx/conf/nginx.conf
23WORKDIR /usr/local/nginx
24EXPOSE 80
25CMD ["nginx", "-g", "daemon off;"]
3、构建镜像
1[root@docker nginx]#docker build -t nginx:v1.15.5 .
4、查看构建好的镜像
1[root@docker nginx]#docker images
2REPOSITORY TAG IMAGE ID CREATED SIZE
3nginx v1.15.5 e7c217225044 16 seconds ago 379MB
5、利用构建好的镜像跑一个容器并测试
1[root@docker nginx]###docker run -d --name web -p 90:80 nginx:v1.15.5
2be3545d300b0dcaf25004d693f1bd7d460a4b0e4f0937d4a5494a59aa5f16c16
3[root@docker nginx]###docker ps
4CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5be3545d300b0 nginx:v1.15.5 "nginx -g 'daemon of…" 4 seconds ago Up 3 seconds 0.0.0.0:90->80/tcp, :::90->80/tcp web

可以看到,容器正常启动了,nginx的版本是1.15.5
⚠️ 需要注意的是,上面构建时的Dockerfile里,我们nginx的工作目录是/usr/local/nginx

因此,我们这里可以使用-v选项进行挂载我们本地的index.html文件进行再次测试:
1[root@docker ~]###docker run -d --name web2 -p 91:80 -v /opt/wwwroot/:/usr/local/nginx/html nginx:v1.15.5
28863661b6378beb85c80a00e805aa7dd828ec3be62766cd9082f9173567d444c
3[root@docker ~]###docker ps
4CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
58863661b6378 nginx:v1.15.5 "nginx -g 'daemon of…" 4 seconds ago Up 2 seconds 0.0.0.0:91->80/tcp, :::91->80/tcp web2
6be3545d300b0 nginx:v1.15.5 "nginx -g 'daemon of…" 7 minutes ago Up 7 minutes 0.0.0.0:90->80/tcp, :::90->80/tcp web

测试结束。😘
(2)yum安装
💘 实战:构建Nginx镜像-2023.1.7(测试成功)

- 实验环境
1docker 20.10.12
- 实验软件(无)
1、编写Dockerfile文件
1[root@docker ~]#mkdir dockerfile
2[root@docker ~]#cd dockerfile/
3[root@docker dockerfile]#vim Dockerfile
4FROM centos:7
5RUN yum install -y epel-release && \
6 yum install -y nginx
7
8CMD ["nginx", "-g", "daemon off;"]
说明:
1centos:latest ###这里centos默认是8版本了
2
3通过 换行符:&& \,可以运行多行shell命令
4\ 表示换行输入
5
6在容器里面我们不会直接使用systemctl start nginx这个命令的,因为systemctl 在容器里用不了,除非在docker run时使用特权模式。
7
8可以参考nginx官方里面是如何下CMD的:
9
10 CMD ["nginx" "-g" "daemon off;"]
11-g是用来设置全局参数的
12daemon off这个命令意思是让nginx关闭后台启动,让它放在前台启动
13
14->你就记住这一点就好了:将你的项目打包到镜像中,任何应用程序都是以前台去启动的,你记住这一原则就行了。
15
16默认源里不包含nginx,因此需要先安装epel-release源;
2、构建镜像
1[root@docker dockerfile]#docker build -t nginx:v1 .
2Sending build context to Docker daemon 2.048kB
3Step 1/3 : FROM centos:7
47: Pulling from library/centos
52d473b07cdd5: Pull complete
6Digest: sha256:9d4bcbbb213dfd745b58be38b13b996ebb5ac315fe75711bd618426a630e0987
7Status: Downloaded newer image for centos:7
8 ---> eeb6ee3f44bd
9Step 2/3 : RUN yum install -y epel-release && yum install -y nginx
10 ---> Running in 794db4e7cd48
11……
12Installed:
13 epel-release.noarch 0:7-11
14
15Complete!
16……
17 Installed:
18 nginx.x86_64 1:1.20.1-9.el7
19Complete!
20Removing intermediate container 794db4e7cd48
21 ---> 2801c711323d
22Step 3/3 : CMD ["nginx" "-g" "daemon off;"]
23 ---> Running in e8924270560a
24Removing intermediate container e8924270560a
25 ---> 16240f02952c
26Successfully built 16240f02952c
27Successfully tagged nginx:v1
3、测试
1#查看刚才构建好的镜像
2[root@docker dockerfile]#docker images
3REPOSITORY TAG IMAGE ID CREATED SIZE
4nginx v1 3d50b4f28bb0 23 seconds ago 470MB
5
6#创建index.html测试文件
7[root@docker dockerfile]#mkdir /opt/wwwroot
8[root@docker dockerfile]#echo loveyou > /opt/wwwroot/index.html
9
10#此时启动刚才那个镜像,进行访问测试
11[root@docker dockerfile]#docker run -d --name web -p 90:80 -v /opt/wwwroot/:/usr/share/nginx/html nginx:v1
1294e95711e146f7f1ae0435ce4b95b0a556624032ae77408d59f5af00b01cfe52
13[root@docker dockerfile]#docker ps
14CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1594e95711e146 nginx:v1 "nginx -g 'daemon of…" 6 seconds ago Up 4 seconds 0.0.0.0:90->80/tcp, :::90->80/tcp web

测试结束。😘
构建Tomcat镜像
💘 实战:构建Tomcat镜像-2023.1.7(测试成功)

- 实验环境
1docker 20.10.12
- 实验软件
链接:https://pan.baidu.com/s/1m2dtWTyRcJwuSdq1kZyy5g?pwd=bjbw
提取码:bjbw
2022.2.28-Dockerfile实验软件

1、准备测试软件
1[root@docker ~]###ll -h dockerfile.zip
2-rw-r--r-- 1 root root 46M Aug 13 2021 dockerfile.zip
3[root@docker ~]###unzip dockerfile.zip
4[root@docker ~]###cd dockerfile
5[root@docker dockerfile]###ls
6java nginx php tomcat
7[root@docker dockerfile]###ls nginx/
8Dockerfile nginx-1.15.5.tar.gz nginx.conf php.conf
9[root@docker dockerfile]###ls tomcat/
10apache-tomcat-8.5.43.tar.gz Dockerfile ROOT.war
2、编写Dockerfile
1[root@docker ~]###cd dockerfile/tomcat/
2[root@docker tomcat]###ls
3apache-tomcat-8.5.43.tar.gz Dockerfile ROOT.war
4[root@docker tomcat]###cat Dockerfile
5FROM centos:7
6MAINTAINER www.ctnrs.com
7
8ENV VERSION=8.5.43
9
10RUN yum install java-1.8.0-openjdk wget curl unzip iproute net-tools -y && \
11yum clean all && \
12rm -rf /var/cache/yum/*
13
14ADD apache-tomcat-${VERSION}.tar.gz /usr/local/
15RUN mv /usr/local/apache-tomcat-${VERSION} /usr/local/tomcat && \
16sed -i '1a JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"' /usr/local/tomcat/bin/catalina.sh && \
17ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
18
19ENV PATH $PATH:/usr/local/tomcat/bin
20
21WORKDIR /usr/local/tomcat
22
23EXPOSE 8080
24CMD ["catalina.sh", "run"]
3、构建镜像
1[root@docker tomcat]###docker build -t tomcat:v1 .
4、测试
1###查看构建好的镜像
2[root@docker tomcat]###docker images
3REPOSITORY TAG IMAGE ID CREATED SIZE
4tomcat v1 7e71034c3c6e 45 seconds ago 460MB
5
6###启动一个容器
7[root@docker tomcat]###docker ps
8CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
96227fe6fedeb tomcat:v1 "catalina.sh run" 2 seconds ago Up 1 second 0.0.0.0:8081->8080/tcp, :::8081->8080/tcp naughty_lumiere
108863661b6378 nginx:v1.15.5 "nginx -g 'daemon of…" 12 minutes ago Up 12 minutes 0.0.0.0:91->80/tcp, :::91->80/tcp web2
11be3545d300b0 nginx:v1.15.5 "nginx -g 'daemon of…" 19 minutes ago Up 19 minutes 0.0.0.0:90->80/tcp, :::90->80/tcp web

我们进到这个容器里修改下内容,再次测试下
1[root@docker tomcat]###docker exec -it 6227fe6fedeb bash
2[root@6227fe6fedeb tomcat]### cd webapps/ROOT/
3[root@6227fe6fedeb ROOT]### pwd
4/usr/local/tomcat/webapps/ROOT
5[root@6227fe6fedeb ROOT]### ls
6RELEASE-NOTES.txt asf-logo-wide.svg bg-middle.png bg-upper.png index.jsp tomcat.css tomcat.png
7WEB-INF bg-button.png bg-nav.png favicon.ico tomcat-power.gif tomcat.gif tomcat.svg
8[root@6227fe6fedeb ROOT]### echo "<h1>loveer</h1>" > index.jsp
9[root@6227fe6fedeb ROOT]### exit
10exit

再次用-v选项测试
1[root@docker tomcat]###docker run -d -p 8082:8080 -v /opt/wwwroot/:/usr/local/tomcat/webapps/ROOT tomcat:v1
2794a9532d1a5f44506ac259f295dfb6e3715ca530f34332e70244e7c81a98044
3[root@docker tomcat]###docker ps
4CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5794a9532d1a5 tomcat:v1 "catalina.sh run" 3 seconds ago Up 2 seconds 0.0.0.0:8082->8080/tcp, :::8082->8080/tcp condescending_vaughan
66227fe6fedeb tomcat:v1 "catalina.sh run" 5 minutes ago Up 5 minutes 0.0.0.0:8081->8080/tcp, :::8081->8080/tcp naughty_lumiere
78863661b6378 nginx:v1.15.5 "nginx -g 'daemon of…" 18 minutes ago Up 18 minutes 0.0.0.0:91->80/tcp, :::91->80/tcp web2
8be3545d300b0 nginx:v1.15.5 "nginx -g 'daemon of…" 25 minutes ago Up 25 minutes 0.0.0.0:90->80/tcp, :::90->80/tcp web

测试结束。😘
构建java/php镜像
次案例测试省略。
1[root@docker ~]###cd dockerfile
2[root@docker dockerfile]###ls
3java nginx php tomcat
4[root@docker dockerfile]###ls java/
5Dockerfile hello.jar
6[root@docker dockerfile]###ls php/
7Dockerfile php-5.6.36.tar.gz php-fpm.conf php.ini
一条命令一个文件编译打包镜像构建推送


案例:把宿主机某个目录挂载到容器下
Dockerfile里如何复制当前cert目录 到容器内/etc/nginx目录下呢?
在 Dockerfile 中,你可以使用 COPY 指令将当前目录(或指定目录)的内容复制到容器内的指定目录。以下是一个详细示例,展示了如何将当前目录下的 cert 目录复制到容器的 /etc/nginx 目录下。
假设你的项目结构如下:
1myproject/
2├── Dockerfile
3├── cert/
4│ ├── blog.onedayxyy.cn.pem
5│ ├── blog.onedayxyy.cn.key
6└── other_files/
你希望将 myproject/cert 目录下的所有文件复制到容器内的 /etc/nginx/cert 目录。你可以在 Dockerfile 中这样写:
1# 使用一个基础镜像(这里以nginx为例)
2FROM nginx:latest
3
4# 复制当前目录下的cert目录 到容器的 /etc/nginx 目录下
5COPY cert /etc/nginx/cert
6
7# 如果有其他配置文件需要复制,可以继续添加 COPY 指令
8# 例如复制nginx.conf文件
9# COPY nginx.conf /etc/nginx/nginx.conf
10
11# 启动 Nginx 服务
12CMD ["nginx", "-g", "daemon off;"]
在这个 Dockerfile 中:
FROM nginx:latest:使用最新版本的 Nginx 镜像作为基础镜像。COPY cert /etc/nginx/cert:将当前目录下的cert目录及其内容复制到容器的/etc/nginx/cert目录。CMD ["nginx", "-g", "daemon off;"]:以前台模式启动 Nginx 服务。
关于我
我的博客主旨:
- 排版美观,语言精炼;
- 文档即手册,步骤明细,拒绝埋坑,提供源码;
- 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!
🍀 微信二维码
x2675263825 (舍得), qq:2675263825。

🍀 微信公众号
《云原生架构师实战》

🍀 语雀
https://www.yuque.com/xyy-onlyone
https://www.yuque.com/xyy-onlyone/exkgza?# 《语雀博客》

🍀 csdn
https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421

🍀 知乎
https://www.zhihu.com/people/foryouone

最后
好了,关于本次就到这里了,感谢大家阅读,最后祝大家生活快乐,每天都过的有意义哦,我们下期见!

1

