Dockerfile构建镜像详解与案例

一、基于Dockerfile去制作image

1FROM
	# 从头制作baseImage
	FROM scratch
	# 使用自己的baseImage
	FROM centos
	# 指定使用的版本
	FROM ubuntu:14.04
2LABEL:定义一些说明信息
	LABEL maintainer="1019213039@qq.com"
	LABEL version="1.0"
	LABEL description="xxx"
3RUN:执行命令,每执行一条RUN,多一个分层,一般用&&合并语句,反斜杠换行
	RUN yum -y update && yum -y install lrzsz \
		net-tools
	RUN apt-get -y update && apt-get -y install lrzsz \
	net-tools
	# 也可以使用RUN执行sh脚本
	RUN /bin/bash -c 'source $HOME/bashrc;echo $HOME'
4WORKDIR:进入或创建目录
	# 进入容器root目录
	WORKDIR /root
	# 如果没有会自动创建
	WORKDIR /test
	# 在上文进入/test目录后在创建并进入demo目录
	WORKDIR demo
	# 输出当前所在目录路径:/test/demo
	RUN pwd
5ADDCOPY:将本地的文件,添加到image里
	# 将hello.txt文件添加到根目录下
	ADD hello.txt /
	# 将tar包直接解压到根目录
	ADD test.tar.gz /
	
	# 最终hello.txt文件会被复制到 /root/test/hello.txt
	WORKDIR /root
	COPY hello.txt test/
6ENV:增加Dockerfile的可读性,比如当前镜像的版本号
	# 设置场景,例如输出MYSQL_MAJOR=5.5
	ENV MYSQL_MAJOR 5.5
	# 例如输出name=Docker
	ENV name Docker
  	ENTRYPOIONT echo "hello $name"
7CMDENTRYPOINT,CMD命令可能被覆盖,ENTRYPOINT命令一定会执行,在交互进入容器时CMD会被覆盖而进入容器,ENTRYPOINT则会先执行,不一定会进入容器
	#MD和ENTRYPOINT使用shell格式
	RUN apt-get -y install lrzsz
	CMD echo "hello docker"
	ENTRYPOINT echo "hello docker"
	
	#MD和ENTRYPOINT使用exec格式
	RUN ["apt-get","-y","install","lrzsz"]
	CMD ["/bin/echo”,”hello docker"]
	ENTRYPOINT ["/bin/bash","-c","echo hello $name"]

	ENTRYPOINT使用的比CMD多一些
	ENTRYPOINT:设置容器启动时运行的命令,一定会执行,不会被忽略
8EXPOSE:暴露端口
EXPOSE 5000

Dockerfile 中的 EXPOSE 指令用于声明容器运行时将监听的网络端口。它并不会实际打开这些端口或者将这些端口映射到主机上,而只是在容器运行时向外界展示哪些端口可以被使用。

换句话说,EXPOSE 指令指定容器内应用程序要监听的端口号,但并不会指定这些端口号在主机上映射的端口。要将容器内部的端口映射到主机上的端口,需要在运行容器的时候使用 -p 参数进行指定。
ENTRYPOINT使用shell格式,使用示例:

# 1.编写vi Dockerfile
FROM centos 
ENV name Docker 
ENTRYPOINT echo "hello $name"
# 2.构建镜像
docker build -t test1 .

ENTRYPOINT使用exec格式,使用示例:

# 1.编写vi Dockerfile
FROM centos 
ENV name Docker 
ENTRYPOINT ["/bin/bash","-c","echo hello $name"]
# 2.构建镜像
docker build -t test2 .

二、Dockerfile案例

在使用dockerfile前用py写一个web应用

1、编写一个py文件
vi app.py

from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
	return "hello docker"
if __name__ == '__main__':
	app.run()
2、安装pip
wget https://bootstrap.pypa.io/pip/2.7/get-pip.py --no-check-certificate
3、安装pip
python get-pip.py
4、用pip安装flask
pip install flask
5、运行py文件,搭建web服务成功
python app.py

127.0.0.1是本机内部的一个ip,外部无法访问
在这里插入图片描述

通过Dockerfile文件完成py服务

# 1、编辑一个Dockerfile文件vi Dockerfile

FROM python:2.7
LABEL maintainer="1019213039qq.com"
RUN pip install flask
# 将app.py复制到容器/app/目录下
COPY app.py /app/
# 设置工作目录
WORKDIR /app
# 暴露端口
EXPOSE 5000
CMD ["python","app.py"]

# 2、构建image
docker build -t liuyuanshan/flask-hello .
# 3、运行镜像
docker run liuyuanshan/flask-hello

在这里插入图片描述

php项目案例

案例一:

Dockerfile文件

# 基于PHP官方镜像构建Docker容器
FROM php:7.4-fpm

# 更换源
RUN sed -i 's#http://archive.ubuntu.com/#http://mirrors.tuna.tsinghua.edu.cn/#' /etc/apt/sources.list;
# 安装Nginx
RUN apt-get update --fix-missing && apt-get install -y nginx --fix-missing

# 安装MySQL
RUN docker-php-ext-install pdo_mysql && docker-php-ext-enable pdo_mysql

# 复制应用程序代码
COPY . /var/www/html

# 配置Nginx
COPY nginx.conf /etc/nginx/nginx.conf

# 暴露端口
EXPOSE 80

# 启动Nginx和PHP-FPM
CMD service nginx start && php-fpm

nginx.conf文件

server {
    listen 80;
    index index.php index.html;
    root /var/www/html;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

案例二:
# 拉取远程镜像仓库
FROM registry.cn-shenzhen.aliyuncs.com/xxxx:latest
# 在容器根下创建目录名为app
RUN mkdir /app
# 将当前宿主机目录下的所有文件拷贝到容器/app下
COPY . /app
# 设置容器的工作目录
WORKDIR /app
# 为容器设置php中的composer镜像仓库为国内镜像仓库
RUN composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
# 根据composer.json文件配置拉取代码
RUN composer install
# 删除指定目录下的文件
RUN rm -rf ./runtime/schema/*
# 拷贝指定文件
COPY ./nginx.conf /etc/nginx/nginx.conf
# 为start.sh文件授予x权限
RUN chmod +x start.sh
# 执行start.sh脚本文件
CMD ["./start.sh"]
# 设置对外暴露的端口
EXPOSE 80

start.sh脚本文件

#!/bin/bash
service nginx start

chmod -R 777 ./storage ./bootstrap/cache ./public
php artisan config:clear
php artisan config:cache
php artisan migrate --force     # 更新数据库表结构
php artisan module:migrate --force     # 更新数据库表结构
php artisan cache:clear         # 清除缓存
apidoc -i app/Http/Controllers -i modules/ -o public/apidoc

php-fpm -F
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值