Dockerfile构建编译安装nginx
docker build -t own_nginx:v8.0 . -f ./own_nginx.dockerfile
FROM centos:7
LABEL maintainer="zane" version="V1"
ENV PATH /usr/local/nginx/sbin:$PATH
ADD nginx-1.24.0.tar.gz /usr/local/
ADD epel.repo /etc/yum.repos.d
RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all
RUN useradd -s /sbin/nologin -M www
WORKDIR /usr/local/nginx-1.24.0
RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-pcre && make && make install
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf
RUN chown -R www:www /usr/local/nginx/
RUN sed -i '/80/s/80/8000/' /usr/local/nginx/conf/nginx.conf
USER www:www
EXPOSE 8000
VOLUME [ "/usr/local/nginx/conf/" ]
CMD [ "nginx" ]
Dockerfile实例:容器化python的flask应用
目标: 用 Docker 部署一个用 Python 编写的 Web 应用。
首先部署整个流程:
基础镜像(python)-->flask-->部署python应用
web框架 flask django
代码功能:
如果当前环境中有"NAME"这个环境变量,就把它打印在"Hello"后,否则就打印"Hello world",最后再打印出当前环境的 hostname。
[root@yixuan ~]# mkdir python_app
[root@yixuan ~]# cd python_app/
[root@yixuan python_app]# vim app.py
from flask import Flask
import socket
import os
app = Flask(__name__)
@app.route('/')
def hello():
html = "<h3>Hello {name}!</h3>" \
"<b>Hostname:</b> {hostname}<br/>"
return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname())
if __name__ == "__main__":
app.run(host='0.0.0.0', port=80)
应用依赖:
定义在同目录下的 requirements.txt 文件里,内容如下:
[root@yixuan python_app]# vim requirements.txt
Flask
Dockerfile制作容器镜像:
# vim Dockerfile
FROM python:2.7-slim
WORKDIR /app
ADD . /app
RUN pip install --trusted-host pypi.python.org -r requirements.txt
EXPOSE 80
ENV NAME World
CMD ["python", "app.py"]
现在目录结构:
[root@yixuan python_app]# ls
Dockerfile app.py requirements.txt
构建镜像:
[root@yixuan python_app]# docker build -t testpython .
-t 给这个镜像加一个 Tag
Dockerfile 中的每个原语执行后,都会生成一个对应的镜像层。即使原语本身并没有明显地修改文件的操作(比如,ENV 原语),它对应的层也会存在。只不过在外界看来,这个层是空的。
查看结果:
[root@yixuan python_app]# docker images
REPOSITORY TAG IMAGE ID ...
testpython latest 16bc21f3eea3
启动容器:
[root@yixuan python_app]# docker run -it -p 4000:80 testpython /bin/bash
查看容器:
[root@yixuan python_app]# docker ps
CONTAINER ID IMAGE COMMAND CREATED
ce02568e64ce testpython "/bin/bash" About a minute ago
进入容器:
[root@yixuan python_app]# docker exec -it ce02568 /bin/bash
root@ce02568e64ce:/app# python app.py & #将python运行起来
访问容器内应用:
[root@yixuan ~]# curl http://localhost:4000
<h3>Hello World!</h3><b>Hostname:</b> f201f6855136<br/>
JAVA Springboot dockerfile示例
FROM 192.168.233.44:31904/cmcdcp/adoptopenjdk:8-jdk-ubuntu-cn
LABEL "author"="zane"
WORKDIR /home/app
COPY --chown=app:app onlinestore-order.jar ./
USER app
ENV JVM_ARGS="-Xms256m -Xmx2048m" CMD_LINE_ARGS=""
ENTRYPOINT java -server -Dfile.encoding=UTF-8 -Djava.security.egd=file:/dev/./urandom $JVM_ARGS -jar *.jar $CMD_LINE_ARGS
tomcat的dockerfile
FROM centos
RUN yum install wget -y
ADD jdk-8u45-linux-x64.rpm /usr/local/
ADD apache-tomcat-8.0.26.tar.gz /usr/local/
RUN cd /usr/local && rpm -ivh jdk-8u45-linux-x64.rpm
RUN mv /usr/local/apache-tomcat-8.0.26 /usr/local/tomcat8
ENTRYPOINT /usr/local/tomcat8/bin/startup.sh && tail -F /usr/local/tomcat8/logs/catalina.out
EXPOSE 8080
go的dockerfile
go代码
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/", hello)
http.ListenAndServe(":8080", nil)
}
func hello(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Web01 is running...")
}
编译二进制文件
SET CGO_ENABLED=0
SET GOOS=linux
SET GOARCH=amd64
go build web01.go
dockerfile
FROM alpine:latest
LABEL maintainer="zane" version="V1"
RUN adduser -s /sbin/nologin web -D
WORKDIR /home/web
ADD web01 /home/web
RUN chown web:web web01
USER web:web
EXPOSE 8080
CMD [ "./web01" ]
构建镜像:docker build -t goweb:v1.0 . -f ./web01.dockerfile
查看镜像
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
goweb v1.0 a77e24bc2584 11 minutes ago 21.8MB
goweb v2.0 345319e371cf 11 minutes ago 21.8MB
alpine latest 91ef0af61f39 7 weeks ago 7.8MB