• Docker---dockerfile


    容器端口映射

    通过一条命令,运行一个python web容器。
    
    docker run -d -P trainging/webapp python app.py
    	-d 后台运行参数
    	-P 随机端口映射,宿主机的一个随机端口:映射到容器内暴露的端口
    	trainging/webapp 运行的镜像名
    	python app.py 运行容器内的一个app.py脚本文件
    

    dockerfile介绍

    ​ 镜像是容器的基础,每次执行docker run的时候都会指定哪个镜像作为容器运行的基础。直接使用来自docker hub的镜像只能满足一定的需求,当镜像无法满足我们的需求时,需要自定制镜像。

    ​ 镜像的定制就是定制每一层所添加的配置、文件。如果可以把每一层修改、安装、构建、操作的命令都写入到一个脚本中,用脚本来构建、定制镜像,这个脚本就是dockerfile。dockerfile是一个文本文件,其内容是一条条的指令,每一条指令构建一层,因此每一条指令的内容就是描述该层如何构建的。

    dockerfile指令

    # FROM指令是指定哪一个系统作为基础镜像
    # 制作base image基础镜像,尽量使用官方的image作为base image
    FROM centos
    FROM ubuntu:14:04	# 带有tag的base image
    
    # 容器元信息,帮助信息,类似于代码注释
    LABEL version="1.0"
    LABEL maintainer="user"
    
    # RUN这个指令是万能指令,写什么,docker构建时就执行什么
    # 对于复杂的RUN指令,避免无用的分层,多条命令用反斜线换行,合成一条命令
    RUN yum update && yum install -y vim 
    	Python-dev		# 反斜线换行
    RUN /bin/bash -c "source $HOME/.bashrc;echo $HOME"
    
    WORKDIR /root # 相当于linux的cd命令,改变目录,尽量使用绝对路径
    WORKDIR /test # 如果没有就自动创建
    WORKDIR demo # 再进入demo文件夹
    RUN pwd # 打印结果应该是/test/demo
    
    ADD hello / # 把本地文件添加到镜像中,把本地的hello可执行文件拷贝到镜像的/目录
    ADD test.tar.gz # ADD指令不仅有拷贝资料到容器的作用,还有解压的作用
    
    COPY hello test/ # 等同于上述ADD效果
    
    # ADD与COPY
    #	- 优先使用COPY命令
    #	- ADD除了COPY功能还有解压功能
    # 添加远程文件/目录使用curl或wget
    
    # ENV指令用于定义一个变量
    ENV # 环境变量,尽可能使用ENV来增加可维护性
    ENV MYSQL_VERSION 5.6 # 设置一个mysql常量
    RUN yum install -y mysql-server="${MYSQL_VERSION}"
    
    # 例子
    ENV django_version="1.5"
    pip3 install django==django_version
    
    # dockerfile的expose参数,暴露容器的8080端口,提供给外部机器访问
    EXPOSE 8080 
    

    dockerfile练习

    • 构建一个dockerfile与flask web应用,且外部客户端可以访问。

      1. 创建一个flask代码文件

        #coding:utf8
        from flask import Flask
        app = Flask(__name__)
        @app.route('/')
        def hello():
            return "<h1>这是一个dockerfile构建的flask web应用</h1>"
        if __name_ == "__main__":
            app.run(host='0.0.0.0', port=8080)
        
      2. 创建dockerfile,内容如下

        FROM centos
        COPY Centos-Base.repo /etc/yum.repos.d/
        COPY epel.repo /etc/yum.repos.d/
        RUN yum clean all
        RUN yum install python-setuptools -y
        RUN easy_install flask
        COPY s16-flask.py /opt/
        WROKDIR /opt
        EXPOSE 8080
        CMD ["python", "s16-flask.py"]
        
      3. 构建打包dockerfile,生成一个自己的镜像

        docker build -t yuchao163/s16-flask-docker .
            -t 指定镜像的版本名
            。 找到当前路径的Dockerfile
        
      4. 基于这个自己构建的镜像,运行一个flask web容器

        docker run -d -p 8888:8080 77b
            -d 后台运行
            -p 指定端口映射 宿主机的8888映射到容器的8080
            77b 自己构建的镜像id
        
      5. 查看容器的端口转发情况

        docker port 容器id
        
    • docker私有仓库的搭建

      1. 下载一个私有仓库的镜像,基于这个镜像生成docker仓库容器

        docker run -d 
        	-p 5000:5000 
        	-v /opt/data/registry:/var/lib/registry 
        	registry
        # 参数解释
        -v 数据卷挂载,目录映射
        -p 端口映射
        
      2. 修改docker的配置文件,支持http方式的推送

        vim /etc/docker/daemon.json
        # 修改如下参数
        {"registry-mirrrors":["http://f1361db2.m.daocloud.io"],
        "insecure-registries":["宿主机IP:5000"]
        }
        
      3. 修改docker的启动服务命令,支持读取/etc/docker/deamon.json文件

        # 编辑文件 /lib/systemd/system/docker.service
        vim /lib/systemd/system/docker.service
        
        # 找到[service]这一行,添加如下参数
        EnvironmentFile=-/etc/docker/daemon.json
        
      4. 重新读取docker配置文件

        systemctl daemon-reload
        
      5. 重启docker服务

        systemctl restart docker
        
      6. 由于重启了我docker,docker进程都挂掉了

        # 重新运行一个新的私有仓库,命令如下
        docker run --privileged=true -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry
        	--privileged=true docker容器的安全机制:设置特权级运行的容器
        
      7. 推送本地镜像到私有仓库中

        1. 修改本地镜像的tag标记号,指定私有仓库的地址传输
        	docker tag docker.io/hello-world 宿主机IP:端口/s16-old-docker
        2. 推送到私有仓库
        	docker push 宿主机IP:端口/s16-old-docker
        
      8. 通过私有仓库的api,检查镜像数据

        可以通过浏览器访问api数据,http://192.168.15.71:5000/v2/_catalog

      9. 此时可以通过私有仓库下载公司内部的镜像

        docker pull 宿主机IP:端口/s16-old-docker-heheheheh
        
    作者:凯旋.Lau
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    2020年7月15日Java学习日记
    2020年7月14日Java学习日记
    2020年7月13日Java学习日记
    2020年7月12日Java学习日记
    2020年7月11日Java学习日记
    2020年7月10日Java学习日记
    2020年7月9日Java学习日记
    2020年7月8日Java学习日记
    链式栈(Chain stack)
    Codeforces-1375-D-Replace by MEX
  • 原文地址:https://www.cnblogs.com/KX-Lau/p/11422079.html
Copyright © 2020-2023  润新知