Docker构建自定义镜像

利用dockerfile定制镜像

FROM scratch #制作base image 基础镜像,尽量使用官方的image作为base image
FROM centos #使用base image
FROM ubuntu:14.04 #带有tag的base image

LABEL version=“1.0” #容器元信息,帮助信息,Metadata,类似于代码注释
LABEL maintainer=“yc_uuu@163.com"

#对于复杂的RUN命令,避免无用的分层,多条命令用反斜线换行,合成一条命令!
RUN yum update && yum install -y vim \
    Python-dev #反斜线换行
RUN /bin/bash -c "source $HOME/.bashrc;echo $HOME”

WORKDIR /root #相当于linux的cd命令,改变目录,尽量使用绝对路径!!!不要用RUN cd
WORKDIR /test #如果没有就自动创建
WORKDIR demo #再进入demo文件夹
RUN pwd     #打印结果应该是/test/demo

ADD and COPY 
ADD hello /  #把本地文件添加到镜像中,吧本地的hello可执行文件拷贝到镜像的/目录
ADD test.tar.gz /  #添加到根目录并解压

WORKDIR /root
ADD hello test/  #进入/root/ 添加hello可执行命令到test目录下,也就是/root/test/hello 一个绝对路径
COPY hello test/  #等同于上述ADD效果

ADD与COPY
   - 优先使用COPY命令
    -ADD除了COPY功能还有解压功能
添加远程文件/目录使用curl或wget

ENV #环境变量,尽可能使用ENV增加可维护性
ENV MYSQL_VERSION 5.6 #设置一个mysql常量
RUN yum install -y mysql-server=“${MYSQL_VERSION}” 

------这里需要稍微理解一下了-------中级知识---先不讲

VOLUME and EXPOSE 
存储和网络

RUN and CMD and ENTRYPOINT
RUN:执行命令并创建新的Image Layer
CMD:设置容器启动后默认执行的命令和参数
ENTRYPOINT:设置容器启动时运行的命令

Shell格式和Exec格式
RUN yum install -y vim
CMD echo ”hello docker”
ENTRYPOINT echo “hello docker”

Exec格式
RUN [“apt-get”,”install”,”-y”,”vim”]
CMD [“/bin/echo”,”hello docker”]
ENTRYPOINT [“/bin/echo”,”hello docker”]


通过shell格式去运行命令,会读取$name指令,而exec格式是仅仅的执行一个命令,而不是shell指令
cat Dockerfile
    FROM centos
    ENV name Docker
    ENTRYPOINT [“/bin/echo”,”hello $name”]#这个仅仅是执行echo命令,读取不了shell变量
    ENTRYPOINT  [“/bin/bash”,”-c”,”echo hello $name"]

CMD
容器启动时默认执行的命令
如果docker run指定了其他命令(docker run -it [image] /bin/bash ),CMD命令被忽略
如果定义多个CMD,只有最后一个执行

ENTRYPOINT
让容器以应用程序或服务形式运行
不会被忽略,一定会执行
最佳实践:写一个shell脚本作为entrypoint
COPY docker-entrypoint.sh /usr/local/bin
ENTRYPOINT [“docker-entrypoint.sh]
EXPOSE 27017
CMD [“mongod”]

[root@master home]# more Dockerfile
FROm centos
ENV name Docker
#CMD ["/bin/bash","-c","echo hello $name"]
ENTRYPOINT ["/bin/bash","-c","echo hello $name”]

 

构建一个Flask程序的镜像

# 1.创建flask的py文件
vim app.py

```内容如下```
from flask import Flask
app=Flask(__name__)

@app.route('/')
def hello():
    return "hello docker"

if __name__=="__main__":
    app.run(host='0.0.0.0',port=9000)


# 2.创建Dockerfile文件
vim Dockerfile

```内容如下```
FROM centos                                      # FROM 使用centos的基础镜像
LABEL maintainer="my flask app"        # LABEL 代码注释
RUN yum install python-setuptools -y   # RUN 指定命令
RUN easy_install flask                         # RUN 指定命令
COPY app.py /opt                                # COPY 将文件加载到指定目录
WORKDIR /opt                                   # 切换到指定目录
EXPOSE 9000                                     # 指定容器运行服务的端口
CMD ["python","app.py"]                     # CMD 容器启动时默认执行的命令

# 3.构建镜像
docker build -t flask-web .

# . 是当前目录

# 4.查看本地所有镜像
docker image ls

# 5.后台启动基于该镜像的容器
docker run -d -p 9999:9000 5db

参数:
    
-d           #后台运行
-p           #宿主机的端口:容器的端口

# 6.查看容器运行状态
docker container ls
docker ps 

 

posted @ 2019-01-17 20:42  st--st  阅读(303)  评论(0编辑  收藏  举报