Skip to content

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、构建镜像命令

bash
构建镜像命令
Usage: docker build [OPTIONS] PATH | URL | - [flags]
Options:
-t, --tag list ### 镜像名称
-f, --file string ### 指定Dockerfile文件位置


docker build -t shykes/myapp . #.代表当前路径,如果你的dockerfile文件名默认为Dockerfile,那也是可以不用指定-f的;
docker build -t shykes/myapp -f /path/Dockerfile
docker build -t shykes/myapp http://www.example.com/Dockerfile

4、案例

构建Nginx镜像

(1)源码编译

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

img

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

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

img

前言

nginx:一般可以部署一些前端的静态文件;

tomcat:一般可以部署一些java的war包;(tomcat也可以处理静态程序的;)

1、准备测试软件

bash
[root@docker ~]###ll -h dockerfile.zip 
-rw-r--r-- 1 root root 46M Aug 13  2021 dockerfile.zip
[root@docker ~]###unzip dockerfile.zip 
[root@docker ~]###cd dockerfile
[root@docker dockerfile]###ls
java  nginx  php  tomcat
[root@docker dockerfile]###ls nginx/
Dockerfile  nginx-1.15.5.tar.gz  nginx.conf  php.conf
[root@docker dockerfile]###ls tomcat/
apache-tomcat-8.5.43.tar.gz  Dockerfile  ROOT.war

2、编写Dockerfile

dockerfile
[root@docker dockerfile]#cd nginx/
[root@docker nginx]#cat Dockerfile 
FROM centos:7
LABEL maintainer www.ctnrs.com
RUN yum install -y gcc gcc-c++ make \
openssl-devel pcre-devel gd-devel \
iproute net-tools telnet wget curl && \
yum clean all && \
rm -rf /var/cache/yum/*

ADD nginx-1.15.5.tar.gz /
RUN cd nginx-1.15.5 && \
./configure --prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_stub_status_module && \
make -j 4 && make install && \
mkdir /usr/local/nginx/conf/vhost && \
cd / && rm -rf nginx* && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

ENV PATH $PATH:/usr/local/nginx/sbin
COPY nginx.conf /usr/local/nginx/conf/nginx.conf
WORKDIR /usr/local/nginx
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

3、构建镜像

bash
[root@docker nginx]#docker build -t nginx:v1.15.5 .

4、查看构建好的镜像

bash
[root@docker nginx]#docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
nginx        v1.15.5   e7c217225044   16 seconds ago   379MB

5、利用构建好的镜像跑一个容器并测试

bash
[root@docker nginx]###docker run  -d --name web -p 90:80  nginx:v1.15.5
be3545d300b0dcaf25004d693f1bd7d460a4b0e4f0937d4a5494a59aa5f16c16
[root@docker nginx]###docker ps 
CONTAINER ID   IMAGE           COMMAND                  CREATED         STATUS         PORTS                               NAMES
be3545d300b0   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文件进行再次测试:

bash
[root@docker ~]###docker run  -d --name web2 -p 91:80 -v /opt/wwwroot/:/usr/local/nginx/html  nginx:v1.15.5
8863661b6378beb85c80a00e805aa7dd828ec3be62766cd9082f9173567d444c
[root@docker ~]###docker ps
CONTAINER ID   IMAGE           COMMAND                  CREATED         STATUS         PORTS                               NAMES
8863661b6378   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
be3545d300b0   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

  • 实验环境
bash
docker 20.10.12
  • 实验软件(无)

1、编写Dockerfile文件

bash
[root@docker ~]#mkdir dockerfile
[root@docker ~]#cd dockerfile/
[root@docker dockerfile]#vim Dockerfile
FROM centos:7 
RUN yum install -y epel-release && \
    yum install -y nginx
                                                                                                                                      
CMD ["nginx", "-g", "daemon off;"]

说明:

bash
centos:latest ###这里centos默认是8版本了

通过 换行符:&& \,可以运行多行shell命令
\ 表示换行输入

在容器里面我们不会直接使用systemctl start nginx这个命令的,因为systemctl 在容器里用不了,除非在docker run时使用特权模式。

可以参考nginx官方里面是如何下CMD的:

 CMD ["nginx" "-g" "daemon off;"]
-g是用来设置全局参数的
daemon off这个命令意思是让nginx关闭后台启动,让它放在前台启动

->你就记住这一点就好了:将你的项目打包到镜像中,任何应用程序都是以前台去启动的,你记住这一原则就行了。

默认源里不包含nginx,因此需要先安装epel-release源;

2、构建镜像

bash
[root@docker dockerfile]#docker build -t nginx:v1 .
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM centos:7
7: Pulling from library/centos
2d473b07cdd5: Pull complete 
Digest: sha256:9d4bcbbb213dfd745b58be38b13b996ebb5ac315fe75711bd618426a630e0987
Status: Downloaded newer image for centos:7
 ---> eeb6ee3f44bd
Step 2/3 : RUN yum install -y epel-release &&     yum install -y nginx
 ---> Running in 794db4e7cd48
……
Installed:
  epel-release.noarch 0:7-11                                                    

Complete!
……
 Installed:
  nginx.x86_64 1:1.20.1-9.el7                                                                                         
Complete!
Removing intermediate container 794db4e7cd48
 ---> 2801c711323d
Step 3/3 : CMD ["nginx" "-g" "daemon off;"]
 ---> Running in e8924270560a
Removing intermediate container e8924270560a
 ---> 16240f02952c
Successfully built 16240f02952c
Successfully tagged nginx:v1

3、测试

bash
#查看刚才构建好的镜像
[root@docker dockerfile]#docker images
REPOSITORY                           TAG               IMAGE ID       CREATED          SIZE
nginx                                v1                3d50b4f28bb0   23 seconds ago   470MB

#创建index.html测试文件
[root@docker dockerfile]#mkdir /opt/wwwroot
[root@docker dockerfile]#echo loveyou > /opt/wwwroot/index.html

#此时启动刚才那个镜像,进行访问测试
[root@docker dockerfile]#docker run  -d --name web -p 90:80 -v /opt/wwwroot/:/usr/share/nginx/html nginx:v1
94e95711e146f7f1ae0435ce4b95b0a556624032ae77408d59f5af00b01cfe52
[root@docker dockerfile]#docker ps
CONTAINER ID   IMAGE                  COMMAND                  CREATED         STATUS         PORTS                               NAMES
94e95711e146   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

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

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

img

1、准备测试软件

bash
[root@docker ~]###ll -h dockerfile.zip 
-rw-r--r-- 1 root root 46M Aug 13  2021 dockerfile.zip
[root@docker ~]###unzip dockerfile.zip 
[root@docker ~]###cd dockerfile
[root@docker dockerfile]###ls
java  nginx  php  tomcat
[root@docker dockerfile]###ls nginx/
Dockerfile  nginx-1.15.5.tar.gz  nginx.conf  php.conf
[root@docker dockerfile]###ls tomcat/
apache-tomcat-8.5.43.tar.gz  Dockerfile  ROOT.war

2、编写Dockerfile

dockerfile
[root@docker ~]###cd dockerfile/tomcat/
[root@docker tomcat]###ls
apache-tomcat-8.5.43.tar.gz  Dockerfile  ROOT.war
[root@docker tomcat]###cat Dockerfile 
FROM centos:7
MAINTAINER www.ctnrs.com

ENV VERSION=8.5.43

RUN yum install java-1.8.0-openjdk wget curl unzip iproute net-tools -y && \
yum clean all && \
rm -rf /var/cache/yum/*

ADD apache-tomcat-${VERSION}.tar.gz /usr/local/
RUN mv /usr/local/apache-tomcat-${VERSION} /usr/local/tomcat && \
sed -i '1a JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"' /usr/local/tomcat/bin/catalina.sh && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

ENV PATH $PATH:/usr/local/tomcat/bin

WORKDIR /usr/local/tomcat

EXPOSE 8080
CMD ["catalina.sh", "run"]

3、构建镜像

bash
[root@docker tomcat]###docker build -t tomcat:v1 .

4、测试

bash
###查看构建好的镜像
[root@docker tomcat]###docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
tomcat       v1        7e71034c3c6e   45 seconds ago   460MB

###启动一个容器
[root@docker tomcat]###docker ps
CONTAINER ID   IMAGE           COMMAND                  CREATED          STATUS          PORTS                                       NAMES
6227fe6fedeb   tomcat:v1       "catalina.sh run"        2 seconds ago    Up 1 second     0.0.0.0:8081->8080/tcp, :::8081->8080/tcp   naughty_lumiere
8863661b6378   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
be3545d300b0   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

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

bash
[root@docker tomcat]###docker exec -it 6227fe6fedeb bash
[root@6227fe6fedeb tomcat]### cd webapps/ROOT/
[root@6227fe6fedeb ROOT]### pwd
/usr/local/tomcat/webapps/ROOT
[root@6227fe6fedeb ROOT]### ls
RELEASE-NOTES.txt  asf-logo-wide.svg  bg-middle.png  bg-upper.png  index.jsp         tomcat.css  tomcat.png
WEB-INF            bg-button.png      bg-nav.png     favicon.ico   tomcat-power.gif  tomcat.gif  tomcat.svg
[root@6227fe6fedeb ROOT]### echo "<h1>loveer</h1>" > index.jsp 
[root@6227fe6fedeb ROOT]### exit
exit

img

再次用-v选项测试

bash
[root@docker tomcat]###docker run -d -p 8082:8080  -v /opt/wwwroot/:/usr/local/tomcat/webapps/ROOT tomcat:v1
794a9532d1a5f44506ac259f295dfb6e3715ca530f34332e70244e7c81a98044
[root@docker tomcat]###docker ps
CONTAINER ID   IMAGE           COMMAND                  CREATED          STATUS          PORTS                                       NAMES
794a9532d1a5   tomcat:v1       "catalina.sh run"        3 seconds ago    Up 2 seconds    0.0.0.0:8082->8080/tcp, :::8082->8080/tcp   condescending_vaughan
6227fe6fedeb   tomcat:v1       "catalina.sh run"        5 minutes ago    Up 5 minutes    0.0.0.0:8081->8080/tcp, :::8081->8080/tcp   naughty_lumiere
8863661b6378   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
be3545d300b0   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镜像

次案例测试省略。

bash
[root@docker ~]###cd dockerfile
[root@docker dockerfile]###ls
java  nginx  php  tomcat
[root@docker dockerfile]###ls java/
Dockerfile  hello.jar
[root@docker dockerfile]###ls php/
Dockerfile  php-5.6.36.tar.gz  php-fpm.conf  php.ini

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

img

img

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

Dockerfile里如何复制当前cert目录 到容器内/etc/nginx目录下呢?

在 Dockerfile 中,你可以使用 COPY 指令将当前目录(或指定目录)的内容复制到容器内的指定目录。以下是一个详细示例,展示了如何将当前目录下的 cert 目录复制到容器的 /etc/nginx 目录下。

假设你的项目结构如下:

myproject/
├── Dockerfile
├── cert/
│   ├── blog.onedayxyy.cn.pem
│   ├── blog.onedayxyy.cn.key
└── other_files/

你希望将 myproject/cert 目录下的所有文件复制到容器内的 /etc/nginx/cert 目录。你可以在 Dockerfile 中这样写:

Dockerfile
# 使用一个基础镜像(这里以nginx为例)
FROM nginx:latest

# 复制当前目录下的cert目录 到容器的 /etc/nginx 目录下
COPY cert /etc/nginx/cert

# 如果有其他配置文件需要复制,可以继续添加 COPY 指令
# 例如复制nginx.conf文件
# COPY nginx.conf /etc/nginx/nginx.conf

# 启动 Nginx 服务
CMD ["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

最近更新