• docker


    docker安装

    1.卸载旧版本
    sudo yum remove docker 
                      docker-client 
                      docker-client-latest 
                      docker-common 
                      docker-latest 
                      docker-latest-logrotate 
                      docker-logrotate 
                      docker-selinux 
                      docker-engine-selinux 
                      docker-engine
    
    2.设置存储库
    sudo yum install -y yum-utils 
      device-mapper-persistent-data 
      lvm2
    
    sudo yum-config-manager 
        --add-repo 
        https://download.docker.com/linux/centos/docker-ce.repo
    
    3.安装docker社区版
    sudo yum install docker-ce
    4.启动关闭docker
    systemctl status/start/stop docker  #看状态/启动/停止
    

    DaoCloud 加速器 是广受欢迎的 Docker 工具,解决了国内用户访问 Docker Hub 缓慢的问题。DaoCloud 加速器结合国内的 CDN 服务与协议层优化,成倍的提升了下载速度。

    一键命令:curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://95822026.m.daocloud.io

    然后重启:systemctl restart docker

    容器三大基本概念

    镜像 image

    Docker镜像就是一个只读的模板。镜像可以用来创建Docker容器。

    docker是把应用程序和其依赖打包在image文件里面,只有通过这个镜像文件才能生成docker容器。
    一个image文件可以生成多个容器实例。

    容器 container

    容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的,保证安全的平台。

    仓库 repository

    仓库是集中存放镜像文件的场所。有时候把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。Docker仓库的概念跟Git类似,注册服务器可以理解为GitHub这样的托管服务。最大的公开仓库是Docker Hub,存放了数量庞大的镜像供用户下载。

    docker命令

    从docker registry获取镜像的命令是docker pull。命令格式是:
    docker pull [选项][docker registry地址] 仓库名:标签
    docker register地址:地址的格式一般是 域名:端口,默认地址是docker hub
    仓库名:仓库名是两段格式,用户名/软件名,如果不写用户,默认docker hub用户名是library,也就是官方镜像

    下载镜像创建实例
    docker pull 镜像文件名 #下载docker镜像
    docker run hello-world

    运行镜像文件,生成docker容器实例,会自动下载不存在的镜像
    容器是随时创建,随时删除的,轻量级,每次docker run 都会生成新的容器记录
    docker容器进程,如果没有在后台运行的话,就会立即挂掉, (容器中必须有正在工作的进程)

    运行一个活着的容器进程
    docker run -d centos /bin/sh -c "while true;do echo 'hello'; sleep 1;done"

    • -d 后台运行的意思
    • centos 指的是镜像文件名
    • /bin/sh 要在这个容器内运行的命令,指定的解释器 shell解释器
    • -c 指定一段shell代码

    进入容器空间内的命令
    docker exec -it 容器id /bin/bash #进入一个活着的容器空间内
    -i 交互式命令操作
    -t 开启一个新的终端

    运行一个centos容器
    docker run -it centos

    默认会进入容器空间内

    查
    docker search  镜像文件名字   #搜索镜像文件
    docker images  		 #列出当前所有的镜像文件 
    docker ps   		 #列出当前记录正在运行的容器进程 
    docker ps -a 		 #列出所有的容器进程,以及挂掉的  
    docker logs 容器id    #查看容器内的日志信息 
    docker logs -f 容器id   #实时查看容器内的日志
    
    删
    docker rmi  镜像名字/镜像id   #删除镜像文件
    docker rmi -f  #强制删除镜像文件 
    docker rm  容器id/容器进程名字   #删除容器记录
    docker rm  `docker ps -aq`   #批量删除容器记录
    
    改
    #docker容器进程的启停命令
    docker start  容器id 
    docker stop  容器id  
    
    镜像制作导出导入
    
    

    镜像制作导出导入

    运行出容器实例=> 二次修改容器实例=> 提交容器实例为新的镜像=>导出镜像 =>发给别人导入

    docker run -it centos /bin/bash
    yum install vim
    docker commit 059 yhp/centos-vim #提交这个容器,创建新的image
    docker save yhp/centos-vim > /opt/centos.tar.gz  #导出docker镜像至本地
    docker load < /opt/centos.tar.gz   #导入本地镜像到docker镜像库
    

    端口映射

    docker run -d -P

    ​ -d 后台运行
    ​ -P 随机端口映射 随机的宿主机的端口:容器内的端口(自动指定的,由代码指定)
    ​ -p 指定端口映射 宿主机的9000:5000(小写p)

    1.下载一个flask的docker镜像
    docker pull training/webapp 
    2.端口映射
    docker run -d -P training/webapp python app.py  #创建一个容器空间,然后在里面执行 python app.py 命令
    docker run -d -p  9000:5000 training/webapp python app.py  #创建一个容器空间,然后在里面执行 python app.py 命令
    3.访问这个容器应用 
    服务器ip:宿主机的映射端口 
    127.0.0.1:9000
    

    查看指定容器的端口映射

    docker port c0b

    5000/tcp -> 0.0.0.0:9000
    

    查看容器内的进程

    UID    PID    PPID       C     STIME    TIME       CMD
    root   3926   3912       0     16:46     00:00:00   python app.py
    

    Dockerfile

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

    1.FROM指令用于  指定容器用什么发行版
    FROM scratch #制作base image 基础镜像,尽量使用官方的image作为base image
    FROM centos #使用base image
    FROM ubuntu:14.04 #带有tag的base image
    
    2.定义标签变量的
    LABEL version=“1.0” #容器元信息,帮助信息,Metadata,类似于代码注释
    LABEL maintainer=“yhp@163.com"
    
    3.万能RUN指令,让容器自己去做些什么事 
    对于复杂的RUN命令,避免无用的分层,多条命令用反斜线换行,合成一条命令!
    RUN yum update && yum install -y vim 
        Python-dev #反斜线换行
    RUN /bin/bash -c "source $HOME/.bashrc;echo $HOME”
    RUN yum install redis  #自动安装redis
     
    4.WORKDIR
    WORKDIR /root #相当于linux的cd命令,改变目录,尽量使用绝对路径!!!不要用RUN cd
    
    WORKDIR /test #如果没有就自动创建
    WORKDIR demo #再进入demo文件夹
    RUN pwd     #打印结果应该是/test/demo
    
    WORKDIR   /opt
    WORKDIR /tmp  
    WORKDIR  ../
    
    5.ADD COPY将宿主机的文件添加到容器空间内 
    ADD存在压缩文件解压的功能,因此,仅仅添加文件到容器内,用COPY而不是ADD  
    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
    
    6.环境变量
    ENV #环境变量,尽可能使用ENV增加可维护性
    ENV MYSQL_VERSION 5.6 #设置一个mysql常量
    RUN yum install -y mysql-server=“${MYSQL_VERSION}” 
    
    7.CMD
    容器启动时默认执行的命令
    如果docker run指定了其他命令(docker run -it [image] /bin/bash ),CMD命令被忽略
    如果定义多个CMD,只有最后一个执行
    

    dockerfile构建一个flask web app

    1. flask_demo.py

      #coding:utf8
      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=8080)
      
    2. 准备Dockerfile (名字必须叫做 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 flask_demo.py /opt/
      WORKDIR /opt
      EXPOSE 8080
      CMD ["python","flask_demo.py"]
      

      在Dockerfile同级目录,准备好其他环境文件,代码文件

      CentOS-Base.repo Dockerfile epel.repo flask_demo.py

    3. 构建docker镜像

      docker build -t yhp/flask_demo-docker .

      docker build 编译Dockerfile

      -t 给镜像加上名字 ,镜像名字,以仓库地址开头,则可以推送到仓库中管理

      . 找到当前的Dockefile文件

    4. 构建完毕之后,查看镜像文件

      docker images

    5. 运行这个flask镜像文件,生成容器实例,代码就跑在容器中了
      docker run -d -p 5000:8080 yhp/flask_demo-docker

    发布docker image到仓库registry

    推送本地镜像到dockerhub

    1. 登录docker账户

      docker提供了一个类似于github的仓库dockerhub,网址https://hub.docker.com/需要注册使用。注册docker id后,在linux中登录dockerhub。

      docker login

    2. 修改docker镜像文件名字,以docker hub账号开头

      docker tag docker.io/hello-world yinhaiping105/my_hello

    3. 推送镜像到dockerhub仓库中,(注意这个是公共仓库)

      docker push yinhaiping105/my_hello

    私有仓库

    1. 下载私有仓库镜像文件

      docker run -d 
          -p 5000:5000 
          -v /opt/data/registry:/var/lib/registry 
          registry
      

      私有仓库会被创建在容器的/var/lib/registry下,因此通过-v参数将镜像文件存储到宿主的/opt/data/registry下

      端口映射容器中的5000端口到宿主机的5000端口

    2. 修改docker的配置文件,支持推送非https的私有镜像

      vim /etc/docker/daemon.json
      在字典中添加"insecure-registries":["192.168.182.130:5000"]
      [root@yhp win]# cat /etc/docker/daemon.json
      {"registry-mirrors": ["http://95822026.m.daocloud.io"], "insecure-registries":["192.168.182.130:5000"]}
      
    3. 修改docker的启动文件,加载第二步,修改的配置文件

      vim /lib/systemd/system/docker.service  #找到如下的[Service]  代码块,添加参数
      
      [Service]
      EnvironmentFile= -/etc/docker/daemon.json 
      
    4. 重新加载配置,重启docker,重启registry

      systemctl daemon-reload
      systemctl restart docker
      docker run --privileged=true -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry
      
      --privileged=true  docker容器的安全机制:设置特权级运行的容器
      
    5. 推送本地镜像

      docker push 192.168.119.10:5000/hello-world

      [root@yhp win]# docker push 104.199.159.34:5000/my_hello
      Using default tag: latest
      The push refers to repository [104.199.159.34:5000/my_hello]
      2653d992f4ef: Pushed 
      

      API查看地址:http://104.199.159.34:5000/v2/_catalog,是一个json。

      [root@yhp win]# curl http://104.199.159.34:5000/v2/_catalog
      {"repositories":["my_hello"]}
      
    6. 下载镜像

      [root@yhp win]# docker pull 104.199.159.34:5000/my_hello
      Using default tag: latest
      latest: Pulling from my_hello
      Digest: sha256:dbbacecc49b088458781c16f3775f2a2ec7521079034a7ba499c8b0bb7f86875
      Status: Image is up to date for 104.199.159.34:5000/my_hello:latest
      104.199.159.34:5000/my_hello:latest
      
  • 相关阅读:
    如何根据工单状态判断订单状态
    jquery移除click事件
    mysql字符串相关函数(并与sql server对比)
    bootstrap-table api
    js调用jquery的function函数
    Bootstrap table设置th,td内容水平、垂直居中
    Error:java: 无法访问javax.servlet.Servlet 找不到javax.servlet.Servlet的类文件
    html常用表单元素,按钮
    点击重置按钮,清空表单所有内容
    bootstrap table设置列宽
  • 原文地址:https://www.cnblogs.com/yinhaiping/p/14153046.html
Copyright © 2020-2023  润新知