zoukankan      html  css  js  c++  java
  • Docker


    参考:
    https://www.cnblogs.com/reasonzzy/p/11127296.html

    Docker 三大组件

    • Images(镜像):

      Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统

    • Containers(容器):

      镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

    • Repository(仓库):

      仓库可看成一个代码控制中心,用来保存镜像。

    安装

    通过whereis docker查看docker的安装目录

    官网

    1. 按照官网步骤安装
      注意国内需要使用阿里云的docker镜像否则安装docker非常慢
      sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
      如果出现无法安装
      yum clean all && yum makecache

    2. 如果无法运行

      docker run hello-world
      

      配置镜像加速

      sudo mkdir -p /etc/docker
      sudo tee /etc/docker/daemon.json <<-'EOF'
      {
        "registry-mirrors": ["https://u6p3j4k6.mirror.aliyuncs.com"]
      }
      EOF
      sudo systemctl daemon-reload
      sudo systemctl restart docker
      
    3. 重启docker

      systemctl restart docker //重启
      systemctl start docker  //启动
      
    4. 验证

      docker run hello-world     
      
    5. 设置开机自启

      systemctl enable docker
      

    镜像命令

    https://www.runoob.com/docker/docker-tutorial.html

    镜像下载位置

    usr/local/docker

    • docker --help

    • docker -v
      显示版本

    • docker info
      查看docker 具体信息

    • docker images

      列出本地镜像

    • docker search [IMAGENAME]
      搜索dockerHub上的资源

    • docker pull [IMAGENAME]:[TAG]
      默认拉取最新的,如果需要指定版本,例如docker pull mysql:5.7

    • docker rmi (-f) [IMAGENAME]:[latest]
      删除镜像
      -f 强制删除
      使用docker rmi -f $(docker images -qa) 删除所有镜像,$()复合命令

    容器命令

    容器其实就是一个精简的linux系统

    容器重启后不会保留数据,如需要保留数据使用容器卷

    如果返回container id,表示操作成功

    如果没用和容器交互docker会自动关闭容器,可以通过ctrl+p+q挂起当前容器

    • docker run [option] IMAGE:[TAG]
      运行容器
      -it :容器终端交互
      docker run -it centos /bin/bash (/bin/bash可以省略)
      -d :以守护线程的模式运行
      --name: 给运行的容器起一个别名
      -p:指定外部端口对应容器中的端口

      -v: 挂载容器卷

    • docker attach CONTAINERID
      进入容器内部, 如果以这种方式退出容器,容器就会自动关闭

    • docker exec -it CONTAINERID /bin/bash

      docker exec -it redis /bin/bash redis-cli容器运行成功后,容器运行redis-cli命令

      推荐使用

      进入容器内部,如果以这种方式退出容器,容器不会自动关闭

    • docker ps [option]
      查看正在运行的容器
      -a: 列出所有正在运行的和历史上运行过的
      -l: 显示最近运行的容器
      -n :显示最近n个运行过的容器
      -q :静默模式,只显示正在运行的容器编号

      docker ps CONTAINERID查看具体的容器

    • docker start CONTAINERID
      启动container

    • docker restart CONTAINERID
      重启container

    • docker stop CONTAINERID
      正常停止container

    • docker kill CONTAINERID
      强制停止container

    • docker rm [option] CONTAINERID
      删除停止运行的container
      -f :强制删除

      docker rm -f $(docker ps -q) 删除所有运行的container

      docker rm -f $(docker ps -qa) 删除所有container

    • docker logs [option] CONTAINERID
      查看docker日志
      -t :加入时间戳
      -f :跟随最新的日志打印,不停追加日志
      --tail: 显示最后多少条
      docker logs -tf --tail 3 1b69245f0f61 不停追加显示倒数三行日志

    • docker inspect CONTAINERID
      查看容器内部细节(json串显示)

      注意新版的镜像挂载点的映射在Mounts中

    • docker cp [OPTIONS] container:src_path dest_path
      docker cp [OPTIONS] dest_path container:src_path

      容器与宿主机之间文件拷贝

      将主机/www/runoob目录拷贝到容器96f7f14e99ab的/www目录下。
      docker cp /www/runoob 96f7f14e99ab:/www/
      
      将主机/www/runoob目录拷贝到容器96f7f14e99ab中,目录重命名为www。
      docker cp /www/runoob 96f7f14e99ab:/www
      
      将容器96f7f14e99ab的/www目录拷贝到主机的/tmp目录中。
      docker cp  96f7f14e99ab:/www /tmp/
      
    • docker history CONTAINTERID

      查看镜像变更记录

    自定义镜像commit

    注意容器不能退出,否则容器会还原,需要使用ctrl+p+q挂起容器

    • docker commit -m"" -a"" CONTAINERID [name]:[version]
      提交修改过的docker image到本地仓库
      -m :消息message
      -a :作者author
      name: 自定义新容器的image名字
      version: 自定义新容器的version

    运行自定义的镜像要指定版本

    数据容器卷

    数据卷

    将容器中的指定文件挂载到宿主机

    容器与宿主机数据共享,容器重启后,宿主机中的数据同样会与容器共享

    docker run -it -v [HOST PATH]:[COTAINER PATH]  [CONTAINERID]
    -v volume 创建数据容器卷
    docker run -it -v /mydata:/data:ro [CONTAINERID]表示容器内的文件只允许read
    

    通过docekr inspect CONTAINERID查看是否挂载

    容器卷

    docker run -it --volumes-form [parentcontainerid] --name [alis]
    

    只要是同一个镜像创建的容器通过--volumes-form, 容器之间数据共享,类似于Maven的组合

    只要容器没有关闭完,即使一个容器退出,并不影响容器间数据共享

    DockFile

    参考:

    https://www.cnblogs.com/edisonchou/p/dockerfile_inside_introduction.html

    在当前目录下创建一个名为Dockerfile的文件,并写入

    #基于centos镜像
    FROM centos
    
    #维护人的信息
    MAINTAINER The CentOS Project <303323496@qq.com>
    
    #安装httpd软件包
    RUN yum -y update
    RUN yum -y install httpd
    
    #开启80端口
    EXPOSE 80
    
    #复制网站首页文件至镜像中web站点下
    ADD index.html /var/www/html/index.html
    
    #复制该脚本至镜像中,并修改其权限
    ADD run.sh /run.sh
    RUN chmod 775 /run.sh
    
    #当启动容器时执行的脚本文件
    CMD ["/run.sh"]
    

    通过Docker创建一个本地的镜像

    docker build -t [IMAGENAME] PATH
    -t 指定Dockfile生成镜像的名字
    -f 默认Dockerfile
    PATH Dockerfile所在位置
    

    ​ As Follow

    docekr -t [tom:hiton] .
    

    通过当前目录下名为Dockerfile的配置文件,创建一个名为tom,版本为hiton的镜像

    Dockefile常用命令

    • FORM

      指明构建的新镜像是来自于哪个基础镜像,例如:

      FROM centos
      
    • LABEL

      LABEL maintainer指定镜像作者

      LABEL maintainer="edisonzhou.cn"
      
    • RUN

      构建镜像时容器中运行的Shell命令,例如

      RUN ["yum", "install", "httpd"]
      RUN yum install httpd
      

      又如,我们在使用微软官方ASP.NET Core Runtime镜像时往往会加上以下RUN命令,弥补无法在默认镜像下使用Drawing相关接口的缺憾:

      FROM microsoft/dotnet:2.2.1-aspnetcore-runtime
      #并列的RUN可以化简为&&
      RUN apt-get update
      	&& apt-get install -y libgdiplus
      	&& apt-get install -y libc6-dev
      	&& ln -s /usr/lib/libgdiplus.so /lib/x86_64-linux-gnu/libgdiplus.so
      
    • CMD

      启动容器时执行宿主机Shell命令,一般采用 CMD /bin/bash, 这样通过docker run 就不需要添加/bin/bash命令

      CMD ["-D", "/usr/sbin/sshd"] 
      CMD ["/usr/sbin/sshd", "-D"] 
      CMD /usr/sbin/sshd -D
      CMD ["curl","-s","http://ip.cn"]
      

      如果有多个CMD只会运行最后一个CMD,且会被命令行覆盖例如:

      FROM tomcat
      ...
      CMD ["catalina.sh","run"]
      --------
      $ docker run -it tomcat ls -l
      

      docker run命令行中的ls -l覆盖了Dockerfile中最后一个CMD命令

    • ENTRYPOINT

      启动容器时执行的Shell命令,同CMD类似,只是由ENTRYPOINT启动的程序不会被docker run命令行指定的参数所覆盖,而且,这些命令行参数会被当作参数传递给ENTRYPOINT指定指定的程序,例如:

      ENTRYPOINT ["/bin/bash", "-C", "/start.sh"]
      ENTRYPOINT /bin/bash -C '/start.sh'
      
      FROM centos
      RUM yum install -y curl
      ENTRYPOINT ["curl", "-s", "http://ip.cn"]
      --------
      $docker run -it tomcat -i #会将参数拼接 ["curl","-si","http://ip.cn"]
      

    CMD和ENTYPOINT会在docker ps中显示

    • EXPOSE

      声明容器运行的服务端口,例如:

      EXPOSE 8080
      
    • ADD

      拷贝文件或目录到镜像中,例如:

      如果是URL或压缩包,会自动下载或自动解压。

      ADD <src>...<dest>
      ADD html.tar.gz /var/www/html
      ADD https://xxx.com/html.tar.gz /var/www/html
      
    • COPY

      拷贝文件或目录到镜像中,用法同ADD,只是不支持自动下载和解压,例如:

      COPY ./start.sh /start.sh
      
    • VOLUME

      指定容器挂载点到宿主机(自动生成的目录,通过docker inspect 查看)或其他容器,例如:

      VOLUME ["/var/lib/mysql"] #容器内的路径
      
    • ENV

      设置环境内环境变量,例如:

      在Dockerfile中可以使用定义变量

      ENV MYSQL_ROOT_PASSWORD 123456
      ENV JAVA_HOME /usr/local/jdk1.8.0_45
      ENV <key1>=<value1> <key2>=<value2>...
      WORKDIR $JAVA_HOME #$表示引用变量
      

      As Follow

      ENV NODE_VERSION 7.2.0
      #可以在引号内使用
      RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" 
        && curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc"
      
    • WORKDIR

      为RUN、CMD、ENTRYPOINT以及COPY和AND设置工作目录, 进入容器后的目录

      WORKDIR /data
      
    • ONBUILD

      用于延迟构建命令的执行。简单的说,就是 Dockerfile 里用 ONBUILD 指定的命令,在本次构建镜像的过程中不会执行(假设镜像为 test-build)。当有新的 Dockerfile 使用了之前构建的镜像 FROM test-build ,这是执行新镜像的 Dockerfile 构建时候,会执行 test-build 的 Dockerfile 里的 ONBUILD 指定的命令。

      格式:

      #father
      FROM tomcat
      ...
      ONBUILD echo "hello world" 
      $docker buidl -t father .
      -------
      #son 
      FROM father #使用父容器
      ...
      $docker build -t son #创建镜像时会触发父容器的ONBUILD
      
  • 相关阅读:
    How to disable daily upgrade and clean on Ubuntu 16.04
    跟李沐学Ai 03 安装【动手学深度学习v2】
    When using 'npm' it requires me to login to github
    Wrong detect of Parsing error: invalid-first-character-of-tag-name in expression.
    18.04: a stop job is running for unattended upgrades shutdown
    NCSC recommend against forcing regular password expiry,
    OWASP Testing for Weak Password Policy--> When must a user change their password
    NIST Special Publication 800-63: Digital Identity Guidelines Frequently Asked Questions
    Mo Tu We Th Fr Sa Su
    工程变更-ECN,ECO,ECR,ECA
  • 原文地址:https://www.cnblogs.com/kikochz/p/13527732.html
Copyright © 2011-2022 走看看