• Dockerfile


    Dockerfile

    dockerfile主要组成部分

    1.创建一个所有项目的目录

    2.创建项目名称

    3.编辑dockerfile文件(必须是dockerfile,默认识别的)
    FROM :初始来自于哪个基础系统镜像 如: FROM centos:6.9
    RUN: 需要运行的命令,可以有多个run 如: RUN yum install openssh-server -y
    CMD:初始构建的命令,需要【 】括起来 如: CMD ["/bin/bash"]

    FROM  这个镜像的妈妈是谁?(指定基础镜像)
     
    MAINTAINER 告诉别人,谁负责养它?(指定维护者信息,可以没有)
     
    LABLE      描述,标签
     
    RUN 你想让它干啥(在命令前面加上RUN即可)
     
    ADD 给它点创业资金(会自动解压tar)  制作docker基础的系统镜像
     
    WORKDIR 我是cd,今天刚化了妆(设置当前工作目录)
     
    VOLUME 持久化,给它一个存放行李的地方(设置卷,挂载主机目录),很重要,将目录后面新增的文件(比如说用户上传的文件等)保持下来。设置好了之后,启动容器后,会随机生成一个数据卷
     
    EXPOSE 它要打开的门是啥(指定对外的端口)(-P 随机端口),默认指定,比如 EXPOSE 80 22 意思是随机跳转80 和22,每次随机指定的时候,都会为这2个指定,docker ps --no-trunc 查看全部内容
     
    CMD 奔跑吧,兄弟!(指定容器启动后的要干的事情)(容易被替换)
     
    dockerfile其他指令: 
     
    COPY 复制文件(不会解压)rootfs.tar.gz
     
    ENV  环境变量,在docker run --ENV “NAME=123” --ENV “NAME1=1234” 外部授权变量NAME,可以简写成-e
     
    在dockerfile里面也可以传参,但是优先级低。 
    ENV NAME1=1234 将参数传进去
     
    ENTRYPOINT  容器启动后执行的命令(无法被替换,启容器的时候指定的命令,会被当成参数),写一个脚本就不会被影响。/bin/bash 1.sh 
     
    

    持久化的应用

    VOLUME 持久化,给它一个存放行李的地方(设置卷,挂载主机目录),很重要,将目录后面新增的文件(比如说用户上传的文件等)保持下来。设置好了之后,启动容器后,会随机生成一个卷
    使用docker inspect 容器名|grep -i volume |grep -i source,可以看到目录文件
     
    docker inspect 8302ee4bc9a9|grep -i volume #可以根据查看到的目录改动数据卷,可以直接改动数据
    改动之后可以直接查看到网站内容的变化
     
    当容器损坏后,重新启动一个容器
    docker run -d -p 80:80 --volumes-from xiaoniao2(损坏的容器名) xiaoniao:v2
     
    [root@oldboy _data]# docker run -d -p 82:80 --volumes-from 8302ee4bc9a9 xiaoniao:v7
    

    原理

    1.将dockerfile发送给docker服务端

    2.加载FROM指定的镜像

    3.执行RUN的命令,启动一个临时的容器,运行RUN指定的命令,所以每个RUN都是启动一个临时容器,然后提交,删除多余的,再创建再提交,形成一个最终镜像.

    这个时候每次启动一个容器,都会初始化hosts文件,所以没法做hosts劫持。

    这个时候加入 --network=host,意思为使用宿主机网络,如果宿主机有hosts劫持,那么速度就快乐

    4.CMD 指定执行的初始命令

    制作dockerfile的流程

    1.手动制作一个镜像,文档一步一步整理好,方便dockfile调用

    这个步骤和手动制作镜像一样
    
    1. 根据文档来编写dockfile

    举个栗子:

    FROM centos:6.9  #指定基础目录
    RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
    RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
    RUN yum install nginx unzip -y
    WORKDIR /usr/share/nginx/html   #工作目录设定在/usr/share/nginx/html,不能使用cd,命令,这和RUN的原理有关
     
    ADD xiaoniao .     #把xiaoniao文件夹下的文件,覆盖到当前目录下(上条命令的workdir中,不会拷贝目录本身)
     
    #ADD xiaoniao /usr/share/nginx/html 和上面2条命令是一样的,注意:xiaoniao文件夹要放在项目目录下,还可以自动解压tar包到目录下,自动覆盖
     
    EXPOSE 80 22  #如果没有指定端口映射,自动给这个两个分配
    ENV NAME=123  #设置环境变量,当然可以在命令行-e 指定  
     
    CMD ["nginx","-g","daemon off;"]
    

    3.使用dockerfile命令来创建镜像

    [root@oldboy nginx]# docker image build --network=host -t centos_nginx:v2 /root/dockerfile/nginx
     
    # 后面路径要指定到docker当前的目录,系统会自动识别,-t为指定镜像姓名
    # --network=host 
    

    4.测试镜像

    [root@oldboy nginx]# docker run -d -p 80:80 centos_nginx:v2
    1.查看CMD命令有没有写错,能不能夯住
    要点:分开的命令需要使用“ ”,空格替换成, 以前的‘’ 整体命令,换成“ ”
     
    #需要将sysctl内核转发打开
    

    docker镜像的分层(dockerfile的书写规范)

    镜像分层的好处:复用,节省磁盘空间,相同的内容只需加载一份到内存。 修改dockerfile之后,再次构建速度快
     
    dockerfile 优化:
     
    1:尽可能选择体积小linux,alpine
     
    2:尽可能合并RUN指令,清理无用的文件(yum缓存,源码包)
     
    3:修改dockerfile,把变化的内容尽可能放在dockerfile结尾
     
    4: 使用.dockerignore,减少不必要的文件ADD . /html
    
    #启动运行镜像(最好定义名称,为下面的主机引用提供方便)
    docker run -d -p 80:80 nginx
    #启动第2个镜像,link到第一个镜像,获得了第一个容器的ip地址(指向为web01)
    docker run -it --link quirky_brown:web01 qstack/centos-ssh /bin/bash
    #直接ping web01,可以获取到第一个容器的ip
    ping 
     
    应用实列:
     
    #1.获取镜像包(做出的镜像)
     
    docker-mysql-5.7.tar.gz  
    zabbix-java-gateway.tar.gz  
    zabbix-server-mysql.tar.gz  
    zabbix-web-nginx-mysql.tar.gz
     
    #2.执行命令
    docker run --name mysql-server -t 
          -e MYSQL_DATABASE="zabbix" 
          -e MYSQL_USER="zabbix" 
          -e MYSQL_PASSWORD="zabbix_pwd" 
          -e MYSQL_ROOT_PASSWORD="root_pwd" 
          -d mysql:5.7 
          --character-set-server=utf8 --collation-server=utf8_bin
     
    docker run --name zabbix-java-gateway -t 
          -d zabbix/zabbix-java-gateway:latest
     
    docker run --name zabbix-server-mysql -t 
          -e DB_SERVER_HOST="mysql-server" 
          -e MYSQL_DATABASE="zabbix" 
          -e MYSQL_USER="zabbix" 
          -e MYSQL_PASSWORD="zabbix_pwd" 
          -e MYSQL_ROOT_PASSWORD="root_pwd" 
          -e ZBX_JAVAGATEWAY="zabbix-java-gateway" 
          --link mysql-server:mysql 
          --link zabbix-java-gateway:zabbix-java-gateway 
          -p 10051:10051 
          -d zabbix/zabbix-server-mysql:latest
     
    docker run --name zabbix-web-nginx-mysql -t 
          -e DB_SERVER_HOST="mysql-server" 
          -e MYSQL_DATABASE="zabbix" 
          -e MYSQL_USER="zabbix" 
          -e MYSQL_PASSWORD="zabbix_pwd" 
          -e MYSQL_ROOT_PASSWORD="root_pwd" 
          --link mysql-server:mysql 
          --link zabbix-server-mysql:zabbix-server 
          -p 80:80 
          -d zabbix/zabbix-web-nginx-mysql:latest
    

    docker的私有仓库

    当有几百台宿主机,需要到官方的仓库docker hub上拉取,那么每台机器都需要使用带宽拉。
    那么当有一台单独拉好之后,将它建立成私有仓库,其他的宿主机都到这上面来拉取,节省带宽。

    首先从官方上面将镜像拉下来

    docker pull registry (或者本地下载了,直接load )
    
    

    仓库服务封装成了镜像

    docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry registry #将/opt/myregistry 作为仓库
     
    --restart=always docker服务启动,容器自己启动
    
    

    为本地registry仓库加上basic认证(密码)

    为了仓库的安全性,可以使用basic认证的方式
    
    #安装basic,加密
    
    yum install httpd-tools -y 
    
    
    #创建密码目录
    
    mkdir /opt/registry-var/auth/ -p
    
    #将账号密码加密后放入指定密码文件
    
    htpasswd -Bbn girl 123456 >> /opt/registry-var/auth/htpasswd
    
     
    #运行registry仓库,以带密码的方式
    
    docker run -d -p 5000:5000 --restart=always -v /opt/registry-var/auth/:/auth/ -v /opt/myregistry:/var/lib/registry -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" registry 
    
     
    #设置好了以后,每次上传或者下载需要先登录
    
     
    docker login 10.0.0.11:5000 (会提示输出账号和密码,如果不带后面的ip,是登录官网)
    
    
  • 相关阅读:
    线程
    链表
    String 练习
    23种设计模式
    静态方法
    ASCII码及UTF-8概义
    java语法基础
    二进制、八进制、十进制、十六进制之间转换
    数组概意
    java程序安装 配置环境变量
  • 原文地址:https://www.cnblogs.com/longren/p/11896638.html
Copyright © 2020-2023  润新知