hugo-teek is loading...

Dockerfile

最后更新于:

Dockerfile

img

目录

[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(测试成功)

img

  • 实验环境
1docker 20.10.12
  • 实验软件

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

img

前言

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

img

可以看到,容器正常启动了,nginx的版本是1.15.5

⚠️ 需要注意的是,上面构建时的Dockerfile里,我们nginx的工作目录是/usr/local/nginx

img

因此,我们这里可以使用-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

img

测试结束。😘

(2)yum安装

💘 实战:构建Nginx镜像-2023.1.7(测试成功)

img

  • 实验环境
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

img

测试结束。😘

构建Tomcat镜像

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

img

  • 实验环境
1docker 20.10.12
  • 实验软件

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

img

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

img

我们进到这个容器里修改下内容,再次测试下

 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

img

再次用-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

img

测试结束。😘

构建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

一条命令一个文件编译打包镜像构建推送

img

img

案例:把宿主机某个目录挂载到容器下

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 中:

  1. FROM nginx:latest:使用最新版本的 Nginx 镜像作为基础镜像。
  2. COPY cert /etc/nginx/cert:将当前目录下的 cert 目录及其内容复制到容器的 /etc/nginx/cert 目录。
  3. CMD ["nginx", "-g", "daemon off;"]:以前台模式启动 Nginx 服务。

关于我

我的博客主旨:

  • 排版美观,语言精炼;
  • 文档即手册,步骤明细,拒绝埋坑,提供源码;
  • 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!

🍀 微信二维码

x2675263825 (舍得), qq:2675263825。

img

🍀 微信公众号

《云原生架构师实战》

img

🍀 语雀

https://www.yuque.com/xyy-onlyone

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

img

🍀 csdn

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

img

🍀 知乎

https://www.zhihu.com/people/foryouone

img

最后

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

img

1

推荐使用微信支付
微信支付二维码
推荐使用支付宝
支付宝二维码
最新文章

文档导航