1、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、构建镜像 命令
构建镜像命令
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(测试成功)
- 实验环境
docker 20.10.12
- 实验软件
链接:https://pan.baidu.com/s/1m2dtWTyRcJwuSdq1kZyy5g?pwd=bjbw
提取码:bjbw
2022.2.28-Dockerfile实验软件
前言:
nginx:一般可以部署一些前端的静态文件;
tomcat:一般可以部署一些java的war包;(tomcat也可以处理静态程序的;)
1、准备测试软件
[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
[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、构建镜像
[root@docker nginx]#docker build -t nginx:v1.15.5 .
4、查看构建好的镜像
[root@docker nginx]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v1.15.5 e7c217225044 16 seconds ago 379MB
5、利用构建好的镜像跑一个容器并测试
[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
可以看到,容器正常启动了,nginx的版本是1.15.5
⚠️ 需要注意的是,上面构建时的Dockerfile里,我们nginx的工作目录是/usr/local/nginx
因此,我们这里可以使用-v
选项进行挂载我们本地的index.html文件进行再次测试:
[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
测试结束。😘
(2)yum安装
💘 实战:构建Nginx镜像-2023.1.7(测试成功)
- 实验环境
docker 20.10.12
- 实验软件(无)
1、编写Dockerfile文件
[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;"]
说明:
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、构建镜像
[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、测试
#查看刚才构建好的镜像
[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
测试结束。😘
构建Tomcat镜像
💘 实战:构建Tomcat镜像-2023.1.7(测试成功)
- 实验环境
docker 20.10.12
- 实验软件
链接:https://pan.baidu.com/s/1m2dtWTyRcJwuSdq1kZyy5g?pwd=bjbw
提取码:bjbw
2022.2.28-Dockerfile实验软件
1、准备测试软件
[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
[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、构建镜像
[root@docker tomcat]###docker build -t tomcat:v1 .
4、测试
###查看构建好的镜像
[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
我们进到这个容器里修改下内容,再次测试下
[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
再次用-v选项
测试
[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
测试结束。😘
构建java/php
镜像
次案例测试省略。
[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
一条命令一个文件编译打包镜像构建推送
案例:把宿主机某个目录挂载到容器下
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 中这样写:
# 使用一个基础镜像(这里以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 中:
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