zoukankan      html  css  js  c++  java
  • 记录Ubuntu下使用docker使用

    关键词:docker、Dockerfile等等。

    这里主要记录Ubuntu下docker使用细节。

    首先是如何安装,然后如何创建docker镜像、搭建docker服务器、运行使用docker。

    1. docker安装

    sudo apt install docker-ce

    2. 创建docker镜像

    创建docker镜像文件,可以通过docker build,则读取PATH目录下Dockerfile创建名称为new_image,tag为v1.0的docker镜像文件。

    docker build -t new_image:v1.0 PATH

    更多细节:

    Build an image from a Dockerfile
    
    Options:
          --add-host list           Add a custom host-to-IP mapping (host:ip)
          --build-arg list          Set build-time variables
          --cache-from strings      Images to consider as cache sources
          --cgroup-parent string    Optional parent cgroup for the container
          --compress                Compress the build context using gzip
          --cpu-period int          Limit the CPU CFS (Completely Fair Scheduler) period
          --cpu-quota int           Limit the CPU CFS (Completely Fair Scheduler) quota
      -c, --cpu-shares int          CPU shares (relative weight)
          --cpuset-cpus string      CPUs in which to allow execution (0-3, 0,1)
          --cpuset-mems string      MEMs in which to allow execution (0-3, 0,1)
          --disable-content-trust   Skip image verification (default true)
      -f, --file string             Name of the Dockerfile (Default is 'PATH/Dockerfile')
          --force-rm                Always remove intermediate containers
          --iidfile string          Write the image ID to the file
          --isolation string        Container isolation technology
          --label list              Set metadata for an image
      -m, --memory bytes            Memory limit
          --memory-swap bytes       Swap limit equal to memory plus swap: '-1' to enable unlimited swap
          --network string          Set the networking mode for the RUN instructions during build (default
                                    "default")
          --no-cache                Do not use cache when building the image
          --pull                    Always attempt to pull a newer version of the image
      -q, --quiet                   Suppress the build output and print image ID on success
          --rm                      Remove intermediate containers after a successful build (default true)
          --security-opt strings    Security options
          --shm-size bytes          Size of /dev/shm
      -t, --tag list                Name and optionally a tag in the 'name:tag' format
          --target string           Set the target build stage to build.
          --ulimit ulimit           Ulimit options (default [])

    通过docker image rm <REPOSITORY>则可删除镜像文件。

    下面分别介绍Dockerfile语法规则,如何创建镜像文件?以及如何保存镜像更新。

    2.1 如何编写Dockerfile文件

    Dockerfile reference中详细介绍了编写Dockerfile的语法:

    FROM:指定基础镜像,必须为第一个命令
    
    格式:
      FROM <image>
      FROM <image>:<tag>
      FROM <image>@<digest>
    示例:
      FROM mysql:5.6
    注:
      tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像
    
    
    MAINTAINER: 维护者信息
    
    格式:
        MAINTAINER <name>
    示例:
        MAINTAINER Jasper Xu
        MAINTAINER sorex@163.com
        MAINTAINER Jasper Xu <sorex@163.com>
    
    
    RUN:构建镜像时执行的命令
    
    RUN用于在镜像容器中执行命令,其有以下两种命令执行方式:
    shell执行
    格式:
        RUN <command>
    exec执行
    格式:
        RUN ["executable", "param1", "param2"]
    示例:
        RUN ["executable", "param1", "param2"]
        RUN apk update
        RUN ["/etc/execfile", "arg1", "arg1"]
    注:
      RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如:docker build --no-cache
    
    
    ADD:将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget
    
    格式:
        ADD <src>... <dest>
        ADD ["<src>",... "<dest>"] 用于支持包含空格的路径
    示例:
        ADD hom* /mydir/          # 添加所有以"hom"开头的文件
        ADD hom?.txt /mydir/      # ? 替代一个单字符,例如:"home.txt"
        ADD test relativeDir/     # 添加 "test" 到 `WORKDIR`/relativeDir/
        ADD test /absoluteDir/    # 添加 "test" 到 /absoluteDir/
    
    
    COPY:功能类似ADD,但是是不会自动解压文件,也不能访问网络资源
    
    
    CMD:构建容器后调用,也就是在容器启动时才进行调用。
    
    格式:
        CMD ["executable","param1","param2"] (执行可执行文件,优先)
        CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)
        CMD command param1 param2 (执行shell内部命令)
    示例:
        CMD echo "This is a test." | wc -
        CMD ["/usr/bin/wc","--help"]
    注:
       CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。
    
    
    ENTRYPOINT:配置容器,使其可执行化。配合CMD可省去"application",只使用参数。
    
    格式:
        ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先)
        ENTRYPOINT command param1 param2 (shell内部命令)
    示例:
        FROM ubuntu
        ENTRYPOINT ["top", "-b"]
        CMD ["-c"]
    注:
       ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。
    
    
    LABEL:用于为镜像添加元数据
    
    格式:
        LABEL <key>=<value> <key>=<value> <key>=<value> ...
    示例:
      LABEL version="1.0" description="这是一个Web服务器" by="IT笔录"
    注:
      使用LABEL指定元数据时,一条LABEL指定可以指定一或多条元数据,指定多条元数据时不同元数据之间通过空格分隔。推荐将所有的元数据通过一条LABEL指令指定,以免生成过多的中间镜像。
    
    
    ENV:设置环境变量
    
    格式:
        ENV <key> <value>  #<key>之后的所有内容均会被视为其<value>的组成部分,因此,一次只能设置一个变量
        ENV <key>=<value> ...  #可以设置多个变量,每个变量为一个"<key>=<value>"的键值对,如果<key>中包含空格,可以使用来进行转义,也可以通过""来进行标示;另外,反斜线也可以用于续行
    示例:
        ENV myName John Doe
        ENV myDog Rex The Dog
        ENV myCat=fluffy
    
    
    EXPOSE:指定于外界交互的端口
    
    格式:
        EXPOSE <port> [<port>...]
    示例:
        EXPOSE 80 443
        EXPOSE 8080
        EXPOSE 11211/tcp 11211/udp
    注:
      EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口
    
    
    VOLUME:用于指定持久化目录
    
    格式:
        VOLUME ["/path/to/dir"]
    示例:
        VOLUME ["/data"]
        VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"
    注:
      一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:
    1 卷可以容器间共享和重用
    2 容器并不一定要和其它容器共享卷
    3 修改卷后会立即生效
    4 对卷的修改不会对镜像产生影响
    5 卷会一直存在,直到没有任何容器在使用它
    
    
    WORKDIR:工作目录,类似于cd命令
    
    格式:
        WORKDIR /path/to/workdir
    示例:
        WORKDIR /a  (这时工作目录为/a)
        WORKDIR b  (这时工作目录为/a/b)
        WORKDIR c  (这时工作目录为/a/b/c)
    注:
      通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。
    
    
    USER:指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户
    
     格式:
      USER user
      USER user:group
      USER uid
      USER uid:gid
      USER user:gid
      USER uid:group
    
     示例:
      USER www
    
     注:
    
      使用USER指定用户后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都将使用该用户。镜像构建完成后,通过docker run运行容器时,可以通过-u参数来覆盖所指定的用户。
    
    
    ARG:用于指定传递给构建运行时的变量
    
    格式:
        ARG <name>[=<default value>]
    示例:
        ARG site
        ARG build_user=www
    
    
    ONBUILD:用于设置镜像触发器
    
    格式:
      ONBUILD [INSTRUCTION]
    示例:
      ONBUILD ADD . /app/src
      ONBUILD RUN /usr/local/bin/python-build --dir /app/src
    注:
      当所构建的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被钥触发
    Dockerfile语法简介

     参考文档:《Dockerfile语法简介

    2.2 docker镜像创建示例

    创建Dockerfile:

    FROM ubuntu:16.04
    MAINTAINER Lu Baoquan
    RUN apt update
    RUN apt -y --force-yes install git make automake autoconf libtool g++ patch wget cpio python unzip rsync bc bzip2

    创建一个新的docker镜像:

    docker build --rm --force-rm -t image_name:tag <Dockerfile_path>

    通过docker images即可查看新创建的镜像:

    REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
    build_machine_ubuntu_1604   v1.0                fd3aa2b241c6        4 seconds ago       121MB
    ubuntu                      16.04               657d80a6401d        31 hours ago        121MB

    2.3 保存/恢复docker镜像(export/import)

    通过docker export导出docker镜像文件:

    docker export <CONTAINER ID>/<NAMES> -o <output_file_name>

    通过docker image import <output_file_name> <REPOSITORY>:<TAG>,即可将docker image save保存的文件导入到docker image中。

    docker image import <output_file_name> <REPOSITORY>:<TAG> --change 'CMD /bin/bash'

    注意:docker镜像文件在export的时候会丢失image layers和meta data,这就造成丢失了启动init进程的入口。

    详细解释见《“No command specified” from re-imported docker image/container

    2.4 保存/恢复docker镜像(save/load)

    在启动docker镜像后,在docker容器中所做的修改需要docker commit才能保存下来。

    docker commit -a author_name -m "comment" <container_id> <new_image_name>

    其中container_id通过docker ps -l获取。

    然后通过docker image save,择新commit的image名称或者image id

    docker image save <REPOSITORY> -o <output_file_name>

    则可将commit之后的镜像保存下来。

    然后通过load命令加载:

    docker load -i <output_file_name>

    则可将保存的镜像加载。

    3. 搭建docker镜像服务器

    通过创建Harbor可以搭建存储Docker镜像的企业级Registry服务,搭建方法参考《Docker Harbor》或者官方的《Installation and Configuration Guide》。

    进入Harbor,选择“新建项目”:

    然后在“推送镜像”中有推送镜像的命令。

    具体命令如下:

    docker tag SOURCE_IMAGE[:TAG] 192.168.33.171:8091/runtime/IMAGE[:TAG]
    docker push 192.168.33.171:8091/runtime/IMAGE[:TAG]

    执行结果如下:

    al@al-B250-HD3:~/docker$ docker tag build_machine:v1.0 192.168.33.171:8091/runtime/build_machine:v1.0
    al@al-B250-HD3:~/docker$ docker push 192.168.33.171:8091/runtime/build_machine:v1.0
    The push refers to repository [192.168.33.171:8091/runtime/build_machine]
    e4f9585af1cb: Pushed 
    9acfe225486b: Pushed 
    90109bbe5b76: Pushed 
    cb81b9d8a6c9: Pushed 
    ea69392465ad: Pushed 
    v1.0: digest: sha256:143374e4032af644e6d69797f85dff644335d4a156a323357b54613ae9e33f0d size: 1363

    4. 拉取docker进行并运行

    配置本地docker,然后通过sudo docker restart重启docker服务:

    {
      "insecure-registries": ["192.168.33.171:8091","192.168.33.171" ]
    }

     注册到docker进行服务器:

    docker login xxx

    然后就是输入用户名和密码。

    4.1 下载docke镜像

    从docker服务器拉取docker镜像:

    docker pull 192.168.33.171:8091/runtime/build_machine:v1.0

    显示docker镜像列表:

    docker images

    更多的操作docker镜像的命令:

    Usage:    docker image COMMAND
    
    Manage images
    
    Commands:
      build       Build an image from a Dockerfile
      history     Show the history of an image
      import      Import the contents from a tarball to create a filesystem image
      inspect     Display detailed information on one or more images
      load        Load an image from a tar archive or STDIN
      ls          List images
      prune       Remove unused images
      pull        Pull an image or a repository from a registry
      push        Push an image or a repository to a registry
      rm          Remove one or more images
      save        Save one or more images to a tar archive (streamed to STDOUT by default)
      tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE

    4.2 docker container使用

    启动新的docker容器:

    docker run -it --name deepeye -v 本地目录绝对路径:docker目录绝对路径 docker仓库名/镜像ID

    其中docker仓库名可以通过docker images查看。

    删除docker容器运行实例:

    docker rm docker仓库名

    其他命令包括:

    docker start-------------------------启动一个docker容器。
    docker restart-----------------------重启docker容器。
    docker attach------------------------附着到一个启动的docker容器上。

    在docker容器运行起来后,就可以在里面执行新环境操作。

    4.3 docker修改上传

    首先将当前容器changed_container_id的修改提交到新的镜像new_image_name[:tag]中。

    然后将保存的镜像new_image_name[:tag]打tag到server_ip:port/path_to_image[:tag],然后用docker push提交到Harbor服务器。

    docker commit -a author_name -m "comment" changed_container_id new_image_name[:tag]
    docker tag new_image_name[:tag] server_ip:port/path_to_image[:tag]
    docker push server_ip:port/path_to_image[:tag]

    比如:

    docker commit -a lubaoquan -m "Add pip packages for desdk python" 2ba9ecbd53eb build_machine:20200319
    docker tag build_machine:20200319 192.168.33.171:8091/runtime/build_machine:latest
    docker push 192.168.33.171:8091/runtime/build_machine:latest
  • 相关阅读:
    Java集合详解1:一文读懂ArrayList,Vector与Stack使用方法和实现原理
    初探Java设计模式5:一文了解Spring涉及到的9种设计模式
    初探Java设计模式4:一文带你掌握JDK中的设计模式
    初探Java设计模式3:行为型模式(策略,观察者等)
    初探Java设计模式2:结构型模式(代理模式,适配器模式等)
    初探Java设计模式1:创建型模式(工厂,单例等)
    [转] <context-param>与<init-param>的区别与作用
    [转]servlet配置中init-param
    [转]Spring 中的p标签
    [转]Spring Security学习总结二
  • 原文地址:https://www.cnblogs.com/arnoldlu/p/11556990.html
Copyright © 2011-2022 走看看