一、基于Dockerfile去制作image
1、FROM
# 从头制作baseImage
FROM scratch
# 使用自己的baseImage
FROM centos
# 指定使用的版本
FROM ubuntu:14.04
2、LABEL:定义一些说明信息
LABEL maintainer="1019213039@qq.com"
LABEL version="1.0"
LABEL description="xxx"
3、RUN:执行命令,每执行一条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'
4、WORKDIR:进入或创建目录
# 进入容器root目录
WORKDIR /root
# 如果没有会自动创建
WORKDIR /test
# 在上文进入/test目录后在创建并进入demo目录
WORKDIR demo
# 输出当前所在目录路径:/test/demo
RUN pwd
5、ADD和COPY:将本地的文件,添加到image里
# 将hello.txt文件添加到根目录下
ADD hello.txt /
# 将tar包直接解压到根目录
ADD test.tar.gz /
# 最终hello.txt文件会被复制到 /root/test/hello.txt
WORKDIR /root
COPY hello.txt test/
6、ENV:增加Dockerfile的可读性,比如当前镜像的版本号
# 设置场景,例如输出MYSQL_MAJOR=5.5
ENV MYSQL_MAJOR 5.5
# 例如输出name=Docker
ENV name Docker
ENTRYPOIONT echo "hello $name"
7、CMD和ENTRYPOINT,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:设置容器启动时运行的命令,一定会执行,不会被忽略
8、 EXPOSE:暴露端口
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