精华内容
下载资源
问答
  • docker run 指定 entrypoint

    千次阅读 2021-04-21 17:19:26
    建议直接看官网文档 ...文章里详解了docker run 的以下参数作用: CMD (Default Command or Options) ENTRYPOINT (Default Command to Execute at Runtime) EXPOSE (Incoming Ports) ENV (Environm

    建议直接看官网文档

    https://docs.docker.com/engine/reference/run/#entrypoint-default-command-to-execute-at-runtime

    文章里详解了docker run 的以下参数作用:

    CMD (Default Command or Options)
    ENTRYPOINT (Default Command to Execute at Runtime)
    EXPOSE (Incoming Ports)
    ENV (Environment Variables)
    HEALTHCHECK
    VOLUME (Shared Filesystems)
    USER
    WORKDIR

    指定entrypiont

    错误的姿势

     docker run -itd -v /tmp/:/tmp/ jdk-ori 'java -jar /tmp/sms.jar'
    

    正确的姿势1

     docker run -itd -v /tmp/:/tmp/ jdk-ori java -jar '/tmp/sms.jar'
    

    正确姿势2:

    docker run -it -itd -v /tmp/:/tmp/ --entrypoint /srv/java/jdk/bin/java jdk-ori -jar /tmp/sms.jar
    
    
     --entrypoint "/srv/java/jdk/bin/java -jar"  这样是不支持的, 这个传参方式不能加参数 ,而dockerfile里则可以
    

    正确姿势3: 挂脚本方式

    $ cat /tmp/entry.sh
    #!/bin/bash
    java -jar $1
    
    docker run -it --rm -v /tmp/:/tmp/ --entrypoint "/tmp/entry.sh" jdk-ori /tmp/sms.jar
    

    如何在k8s里指定docker run -w 的workdir

    $ cat centos.yaml 
    apiVersion: v1
    kind: Pod
    metadata:
      name: my-centos
      labels:
        app: centos
    spec:
      containers:
      - name: my-centos
        image: centos:6.8
        imagePullPolicy: IfNotPresent
        command: ["top","-b"]
        env:
          - name: PWD
            value: "/tmp"
    展开全文
  • docker run 命令的 -i -t -d选项的作用

    万次阅读 多人点赞 2020-02-08 23:09:57
    记得第一次接触 docker 的时候,教程中写着 docker run -it 之类的命令,当时对这个 -it 选项是一知半解,本文就来分析一下这三个选项,尽量做到通俗易懂,这也是我写博客的目的。 一、选项说明 官方文档:...

    记得第一次接触 docker 的时候,教程中写着 docker run -it 之类的命令,当时对这个 -it 选项是一知半解,本文就来分析一下这三个选项,尽量做到通俗易懂,这也是我写博客的目的。

    一、选项说明

    官方文档:https://docs.docker.com/engine/reference/commandline/run/

    选项选项简写说明
    –detach-d在后台运行容器,并且打印容器id。
    –interactive-i即使没有连接,也要保持标准输入保持打开状态,一般与 -t 连用。
    –tty-t分配一个伪tty,一般与 -i 连用。

    “-”与“–”的区别请参考:Linux编程:命令行选项单横线“-”与双横线“–”的区别

    二、-it 选项

    使用 ubuntu:19.10 镜像创建并运行一个名称为 ubuntu1910 的容器,-i 选项指示 docker 要在容器上打开一个标准的输入接口,-t 指示 docker 要创建一个伪 tty 终端,连接容器的标准输入接口,之后用户就可以通过终端进行输入。由于 docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 命令的默认 COMMAND/bin/bash,因此用户的输入是基于 bash shell 执行的。

    示例中,在终端上输入了 exit 13 ,回车执行该命令,退出终端。该命令被传递到 docker run 的调用方,并且被记录到容器的 metadata 中。

    [root@iZ2ze6ogddtzz4dzyy00xwZ ~]# docker run --name ubuntu1910 -it ubuntu:19.10
    root@cd83bc3b0d3b:/# exit 13
    exit
    

    通过 docker ps -a 命令查看容器,Exited (13) 35 seconds ago 就是被回写的内容。

    [root@iZ2ze6ogddtzz4dzyy00xwZ ~]# docker ps -a | grep ubuntu1910
    cd83bc3b0d3b        ubuntu:19.10                                             "/bin/bash"              46 seconds ago      Exited (13) 35 seconds ago                                       ubuntu1910
    [root@iZ2ze6ogddtzz4dzyy00xwZ ~]# 
    

    容器的 metadata 在 /var/lib/docker/containers/containerId/ 目录下,其中 containerId-json.log 文件中记录了回写的内容。

    [root@iZ2ze6ogddtzz4dzyy00xwZ cd83bc3b0d3bb76fc9fc5df326235b3554c15455891d3b3aa0921fb16796322d]# cat cd83bc3b0d3bb76fc9fc5df326235b3554c15455891d3b3aa0921fb16796322d-json.log 
    {"log":"\u001b]0;root@cd83bc3b0d3b: /\u0007root@cd83bc3b0d3b:/# exit 13\r\n","stream":"stdout","time":"2020-02-08T14:35:22.509224333Z"}
    {"log":"exit\r\n","stream":"stdout","time":"2020-02-08T14:35:22.509286061Z"}
    [root@iZ2ze6ogddtzz4dzyy00xwZ cd83bc3b0d3bb76fc9fc5df326235b3554c15455891d3b3aa0921fb16796322d]# 
    

    三、-d 选项

    使用 docker run -d 在后台创建并启动名称为 ubuntu1 的容器,通过 docker ps 命令没有查找到处于运行状态的容器,通过 docker ps -a 命令查找到已经停止运行的 ubuntu1 容器。

    [root@iZ2ze6ogddtzz4dzyy00xwZ ~]# docker run -d --name ubuntu1 ubuntu:19.10
    315cc38afc2f06abb5a2fbb075ebca16455367b2de685cf0c5ba828ab62dd5a1
    [root@iZ2ze6ogddtzz4dzyy00xwZ ~]# docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
    c04afe750081        mysql:5.7           "docker-entrypoint.s…"   26 hours ago        Up 26 hours         0.0.0.0:3306->3306/tcp, 33060/tcp   mysql5.7
    [root@iZ2ze6ogddtzz4dzyy00xwZ ~]# docker ps -a | grep ubuntu1
    315cc38afc2f        ubuntu:19.10                                             "/bin/bash"              35 seconds ago      Exited (0) 34 seconds ago                                        ubuntu1
    cd83bc3b0d3b        ubuntu:19.10                                             "/bin/bash"              18 minutes ago      Exited (13) 18 minutes ago                                       ubuntu1910
    [root@iZ2ze6ogddtzz4dzyy00xwZ ~]# 
    

    于是疑惑产生了, -d 是保证容器在后台运行,为什么我的容器停止运行了呢?

    前面提到过, docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 中有一个 COMMAND 参数,容器启动后会执行 COMMAND命令,它的默认值为 /bin/bash。也就是说容器在后台启动成功后,执行了 COMMAND 命令后直接关闭了。

    docker命令请参考:https://blog.csdn.net/claram/article/details/103301942

    了解到该原理后,我们可以通过在 docker run -d 后增加一个驻留在进程中长期运行的命令就可以保证容器不关闭了。

    [root@iZ2ze6ogddtzz4dzyy00xwZ ~]# docker run -d --name ubuntu2 ubuntu:19.10 tail -f /dev/null 
    a0d3c58fc68b139f63355594dd91c2d047b84a3d56880418eedcd8fedb6307b6
    [root@iZ2ze6ogddtzz4dzyy00xwZ ~]# docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
    a0d3c58fc68b        ubuntu:19.10        "tail -f /dev/null"      5 seconds ago       Up 4 seconds                                            ubuntu2
    c04afe750081        mysql:5.7           "docker-entrypoint.s…"   26 hours ago        Up 26 hours         0.0.0.0:3306->3306/tcp, 33060/tcp   mysql5.7
    [root@iZ2ze6ogddtzz4dzyy00xwZ ~]# 
    

    文章内容仅代表个人观点,如有不正之处,欢迎批评指正,谢谢大家。

    展开全文
  • docker run 的基本用法

    千次阅读 2019-10-13 10:12:39
    docker run 命令用来创建并启动一个容器 语法:docker run [options] image [command] [args…] 示例:docker run -dit -v 别名:容器里面的volume的路径 [-P] [-p 端口:端口] --memory=200M --cpu-shares = 10 --...

    docker run 命令用来创建并启动一个容器

    语法:docker run [options] image [command] [args…]

    示例:docker run -dit -v 别名:容器里面的volume的路径 [-P] [-p 端口:端口] --memory=200M --cpu-shares = 10 --name 给容器起的名字 --net mynet --ip 172.18.0.2 --volumes-from 容器名 镜像名

    命令解释docker run 命令解释

    	• -d	后台运行
    	-i	交互式运行
    	-t	tty终端
    	--memory	限制容器可以使用的内存,如果没有指定 --memory-swap 那么默认和--memory一样大
    		eg:  --memory 200m 没有--memory-swap参数,那么容器可以使用的内存为400m
    	--memory-swap	设置swap区可以使用的内存大小,默认和--memory一样大,必须>=--memory
    	--cpu-shares	表示占有cpu的相对权重
    		eg:    
    		     假设在同一台物理主机上启动了如下2个容器,容器1占用的cpu是容器2占有的cpu的2倍。
    		同一台物理主机上
    		
    		容器1:
    		docker run -d  --cpu-shares 10  容器名 
    		容器2:
    		docker run  -d  --cpu-shares 5  容器名 
    	--name	给容器起的名字
    	--net	指定容器运行的网络(也可以是自己创建的网络 docker network create --subnet=172.18.0.0/24  mynet)
    	-v	指定volume的路径
    		data volume模式:
    		 别名:容器里面的路径
    		mysql:/var/lib/mysql
    		/var/lib/mysql 为Dockerfile 中的volume的值
    		使用  docker volume ls 命令查看
    		本地创建 mysql 数据卷:docker create volume --name mysql
    		bind mouting模式:
    		本地路径:容器路径 
    		/var/data:/var/容器目录
    		本地目录和容器目录中的文件修改都会实时同步。
    	--ip	指定容器的ip地址
    	-P	随机映射一个端口
    	-p	本地端口:容器端口。    将容器中的某个端口映射到本地的某个端口上
    	-e	设置环境变量
    	--volumes-from	参数用于连接某个指定容器的卷,从而可以访问到指定容器中的所有的卷。示例:blog_demo表示新容器中挂载了blog_demo容器中所有的卷。
    	--rm	表示容器运行完成后自动删除
    	-h	设置host主机的名称
    
    
    展开全文
  • docker run 命令详解

    万次阅读 2018-07-04 17:55:44
    Docker中,run应该是用户使用最多的命令了,很多读者反馈不是很明白run命令的用法,而且相关的书籍、中文资料中对run命令的描述也不是非常完整,所以DockerOne组织翻译了Docker官方的文档,以飨读者。注意,本文...
    在Docker中,run应该是用户使用最多的命令了,很多读者反馈不是很明白run命令的用法,而且相关的书籍、中文资料中对run命令的描述也不是非常完整,所以DockerOne组织翻译了Docker官方的文档,以飨读者。注意,本文基于最新的Docker 1.4文档翻译。
    Docker会在隔离的容器中运行进程。当运行docker run命令时,Docker会启动一个进程,并为这个进程分配其独占的文件系统、网络资源和以此进程为根进程的进程组。在容器启动时,镜像可能已经定义了要运行的二进制文件、暴露的网络端口等,但是用户可以通过docker run命令重新定义(译者注:docker run可以控制一个容器运行时的行为,它可以覆盖docker build在构建镜像时的一些默认配置),这也是为什么run命令相比于其它命令有如此多的参数的原因。
    命令格式
    最基本的docker run命令的格式如下:
    $ sudo docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARG...]
    如果需要查看[OPTIONS]的详细使用说明,请参考Docker关于OPTIONS的章节。这里仅简要介绍Run所使用到的参数。OPTIONS总起来说可以分为两类:
    设置运行方式:
    决定容器的运行方式,前台执行还是后台执行;
    设置containerID;
    设置网络参数;
    设置容器的CPU和内存参数;
    - 设置权限和LXC参数;
    设置镜像的默认资源,也就是说用户可以使用该命令来覆盖在镜像构建时的一些默认配置。
    docker run [OPTIONS]可以让用户完全控制容器的生命周期,并允许用户覆盖执行docker build时所设定的参数,甚至也可以修改本身由Docker所控制的内核级参数。
    Operator exclusive options
    当执行docker run时可以设置以下参数:
    Detached vs Foreground
    Detached (-d)
    - Foreground
    Container Identification
    Name (--name)
    - PID Equivalent
    IPC Setting
    Network Settings
    Clean Up (--rm)
    Runtime Constraints on CPU and Memory
    Runtime Privilege, Linux Capabilities, and LXC Configuration
    接下来我们依次进行介绍。
    Detached vs foreground
    当我们启动一个容器时,首先需要确定这个容器是运行在前台还是运行在后台。
    -d=false: Detached mode: Run container in the background, print new container id
    Detached (-d)
    如果在docker run后面追加-d=true或者-d,那么容器将会运行在后台模式。此时所有I/O数据只能通过网络资源或者共享卷组来进行交互。因为容器不再监听你执行docker run的这个终端命令行窗口。但你可以通过执行docker attach来重新附着到该容器的回话中。需要注意的是,容器运行在后台模式下,是不能使用--rm选项的。
    Foregroud
    在前台模式下(不指定-d参数即可),Docker会在容器中启动进程,同时将当前的命令行窗口附着到容器的标准输入、标准输出和标准错误中。也就是说容器中所有的输出都可以在当前窗口中看到。甚至它都可以虚拟出一个TTY窗口,来执行信号中断。这一切都是可以配置的:
    -a=[]               : Attach to `STDIN`, `STDOUT` and/or `STDERR`
    -t=false            : Allocate a pseudo-tty
    --sig-proxy=true : Proxify all received signal to the process (non-TTY mode only)
    -i=false            : Keep STDIN open even if not attached
    如果在执行run命令时没有指定-a参数,那么Docker默认会挂载所有标准数据流,包括输入输出和错误,你可以单独指定挂载哪个标准流。
    $ sudo docker run -a stdin -a stdout -i -t ubuntu /bin/bash
    如果要进行交互式操作(例如Shell脚本),那我们必须使用-i -t参数同容器进行数据交互。但是当通过管道同容器进行交互时,就不需要使用-t参数,例如下面的命令:
    echo test | docker run -i busybox cat
    容器识别
    Name(--name)
    可以通过三种方式为容器命名:
    1. 使用UUID长命名("f78375b1c487e03c9438c729345e54db9d20cfa2ac1fc3494b6eb60872e74778")
    2. 使用UUID短命令("f78375b1c487")
    3. 使用Name("evil_ptolemy")
    这个UUID标示是由Docker deamon生成的。如果你在执行docker run时没有指定--name,那么deamon会自动生成一个随机字符串UUID。但是对于一个容器来说有个name会非常方便,当你需要连接其它容器时或者类似需要区分其它容器时,使用容器名称可以简化操作。无论容器运行在前台或者后台,这个名字都是有效的。
    PID equivalent
    如果在使用Docker时有自动化的需求,你可以将containerID输出到指定的文件中(PIDfile),类似于某些应用程序将自身ID输出到文件中,方便后续脚本操作。
    --cidfile="": Write the container ID to the file
    Image[:tag]
    当一个镜像的名称不足以分辨这个镜像所代表的含义时,你可以通过tag将版本信息添加到run命令中,以执行特定版本的镜像。例如:docker run ubuntu:14.04
    IPC Settings
    默认情况下,所有容器都开启了IPC命名空间。
    --ipc=""  : Set the IPC mode for the container,
            'container:<name|id>': reuses another container's IPC namespace
            'host': use the host's IPC namespace inside the container
    IPC(POSIX/SysV IPC)命名空间提供了相互隔离的命名共享内存、信号灯变量和消息队列。
    共享内存可以提高进程数据的交互速度。共享内存一般用在数据库和高性能应用(C/OpenMPI、C++/using boost libraries)上或者金融服务上。如果需要容器中部署上述类型的应用,那么就应该在多个容器直接使用共享内存了。
    Network settings
    默认情况下,所有的容器都开启了网络接口,同时可以接受任何外部的数据请求。
    --dns=[]         : Set custom dns servers for the container
    --net="bridge"   : Set the Network mode for the container
                              'bridge': creates a new network stack for the container on the docker bridge
                              'none': no networking for this container
                              'container:<name|id>': reuses another container network stack
                              'host': use the host network stack inside the container
    --add-host=""    : Add a line to /etc/hosts (host:IP)
    --mac-address="" : Sets the container's Ethernet device's MAC address
    你可以通过docker run --net none来关闭网络接口,此时将关闭所有网络数据的输入输出,你只能通过STDIN、STDOUT或者files来完成I/O操作。默认情况下,容器使用主机的DNS设置,你也可以通过--dns来覆盖容器内的DNS设置。同时Docker为容器默认生成一个MAC地址,你可以通过--mac-address 12:34:56:78:9a:bc来设置你自己的MAC地址。
    Docker支持的网络模式有:
    none。关闭容器内的网络连接
    bridge。通过veth接口来连接容器,默认配置。
    host。允许容器使用host的网络堆栈信息。 注意:这种方式将允许容器访问host中类似D-BUS之类的系统服务,所以认为是不安全的。
    container。使用另外一个容器的网络堆栈信息。 
    None模式
    将网络模式设置为none时,这个容器将不允许访问任何外部router。这个容器内部只会有一个loopback接口,而且不存在任何可以访问外部网络的router。
    Bridge模式
    Docker默认会将容器设置为bridge模式。此时在主机上面将会存在一个docker0的网络接口,同时会针对容器创建一对veth接口。其中一个veth接口是在主机充当网卡桥接作用,另外一个veth接口存在于容器的命名空间中,并且指向容器的loopback。Docker会自动给这个容器分配一个IP,并且将容器内的数据通过桥接转发到外部。
    Host模式
    当网络模式设置为host时,这个容器将完全共享host的网络堆栈。host所有的网络接口将完全对容器开放。容器的主机名也会存在于主机的hostname中。这时,容器所有对外暴露的端口和对其它容器的连接,将完全失效。
    Container模式
    当网络模式设置为Container时,这个容器将完全复用另外一个容器的网络堆栈。同时使用时这个容器的名称必须要符合下面的格式:--net container:<name|id>.
    比如当前有一个绑定了本地地址localhost的Redis容器。如果另外一个容器需要复用这个网络堆栈,则需要如下操作:
    $ sudo docker run -d --name redis example/redis --bind 127.0.0.1
    $ # use the redis container's network stack to access localhost
    $ sudo docker run --rm -ti --net container:redis example/redis-cli -h 127.0.0.1
    管理/etc/hosts
    /etc/hosts文件中会包含容器的hostname信息,我们也可以使用--add-host这个参数来动态添加/etc/hosts中的数据。
    $ /docker run -ti --add-host db-static:86.75.30.9 ubuntu cat /etc/hosts
    172.17.0.22     09d03f76bf2c
    fe00::0         ip6-localnet
    ff00::0         ip6-mcastprefix
    ff02::1         ip6-allnodes
    ff02::2         ip6-allrouters
    127.0.0.1       localhost
    ::1             localhost ip6-localhost ip6-loopback
    86.75.30.9      db-static
    Clean up (--rm)
    默认情况下,每个容器在退出时,它的文件系统也会保存下来,这样一方面调试会方便些,因为你可以通过查看日志等方式来确定最终状态。另外一方面,你也可以保存容器所产生的数据。但是当你仅仅需要短暂的运行一个容器,并且这些数据不需要保存,你可能就希望Docker能在容器结束时自动清理其所产生的数据。
    这个时候你就需要--rm这个参数了。 注意:--rm 和 -d不能共用!
    --rm=false: Automatically remove the container when it exits (incompatible with -d)
    Security configuration
    --security-opt="label:user:USER"   : Set the label user for the container
    --security-opt="label:role:ROLE"   : Set the label role for the container
    --security-opt="label:type:TYPE"   : Set the label type for the container
    --security-opt="label:level:LEVEL" : Set the label level for the container
    --security-opt="label:disable"     : Turn off label confinement for the container
    --secutity-opt="apparmor:PROFILE"  : Set the apparmor profile to be applied  to the container
    你可以通过--security-opt修改容器默认的schema标签。比如说,对于一个MLS系统来说(译者注:MLS应该是指Multiple Listing System),你可以指定MCS/MLS级别。使用下面的命令可以在不同的容器间分享内容:
    #docker run --security-opt label:level:s0:c100,c200 -i -t fedora bash
    如果是MLS系统,则使用下面的命令:
    # docker run --security-opt label:level:TopSecret -i -t rhel7 bash
    使用下面的命令可以在容器内禁用安全策略:
    # docker run --security-opt label:disable -i -t fedora bash
    如果你需要在容器内执行更为严格的安全策略,那么你可以为这个容器指定一个策略替代,比如你可以使用下面的命令来指定容器只监听Apache端口:
    # docker run --security-opt label:type:svirt_apache_t -i -t centos bash
    注意:此时,你的主机环境中必须存在一个名为svirt_apache_t的安全策略。
    Runtime constraints on CPU and memory
    下面的参数可以用来调整容器内的性能。
    -m="": Memory limit (format: <number><optional unit>, where unit = b, k, m or g)
    -c=0 : CPU shares (relative weight)
    通过docker run -m可以调整容器所使用的内存资源。如果主机支持swap内存,那么可以使用-m可以设定比主机物理内存还大的值。
    同样,通过-c可以调整容器的CPU优先级。默认情况下,所有的容器拥有相同的CPU优先级和CPU调度周期,但你可以通过Docker来通知内核给予某个或某几个容器更多的CPU计算周期。
    比如,我们使用-c或者--cpu-shares =0启动了C0、C1、C2三个容器,使用-c/--cpu-shares=512启动了C3容器。这时,C0、C1、C2可以100%的使用CPU资源(1024),但C3只能使用50%的CPU资源(512)。如果这个主机的操作系统是时序调度类型的,每个CPU时间片是100微秒,那么C0、C1、 C2将完全使用掉这100微秒,而C3只能使用50微秒。
    Runtime privilege, Linux capabilities, and LXC configuration
    --cap-add: Add Linux capabilities
    --cap-drop: Drop Linux capabilities
    --privileged=false: Give extended privileges to this container
    --device=[]: Allows you to run devices inside the container without the --privileged flag.
    --lxc-conf=[]: (lxc exec-driver only) Add custom lxc options --lxc-conf="lxc.cgroup.cpuset.cpus = 0,1"
    默认情况下,Docker的容器是没有特权的,例如不能在容器中再启动一个容器。这是因为默认情况下容器是不能访问任何其它设备的。但是通过"privileged",容器就拥有了访问任何其它设备的权限。
    当操作者执行docker run --privileged时,Docker将拥有访问主机所有设备的权限,同时Docker也会在apparmor或者selinux做一些设置,使容器可以容易的访问那些运行在容器外部的设备。你可以访问Docker博客来获取更多关于--privileged的用法。
    同时,你也可以限制容器只能访问一些指定的设备。下面的命令将允许容器只访问一些特定设备:
    $ sudo docker run --device=/dev/snd:/dev/snd ...
    默认情况下,容器拥有对设备的读、写、创建设备文件的权限。使用:rwm来配合--device,你可以控制这些权限。
     $ sudo docker run --device=/dev/sda:/dev/xvdc --rm -it ubuntu fdisk  /dev/xvdc
    Command (m for help): q
    $ sudo docker run --device=/dev/sda:/dev/xvdc:r --rm -it ubuntu fdisk  /dev/xvdc
    You will not be able to write the partition table.
    Command (m for help): q
    $ sudo docker run --device=/dev/sda:/dev/xvdc:w --rm -it ubuntu fdisk  /dev/xvdc
        crash....
    $ sudo docker run --device=/dev/sda:/dev/xvdc:m --rm -it ubuntu fdisk  /dev/xvdc
    fdisk: unable to open /dev/xvdc: Operation not permitted
    使用--cap-add和--cap-drop,配合--privileged,你可以更细致的控制人哦怒气。默认使用这两个参数的情况下,容器拥有一系列的内核修改权限,这两个参数都支持all值,如果你想让某个容器拥有除了MKNOD之外的所有内核权限,那么可以执行下面的命令:
    $ sudo docker run --cap-add=ALL --cap-drop=MKNOD ...
    如果需要修改网络接口数据,那么就建议使用--cap-add=NET_ADMIN,而不是使用--privileged。
    $ docker run -t -i --rm  ubuntu:14.04 ip link add dummy0 type dummy
    RTNETLINK answers: Operation not permitted
    $ docker run -t -i --rm --cap-add=NET_ADMIN ubuntu:14.04 ip link add dummy0 type dummy
    如果要挂载一个FUSE文件系统,那么就需要--cap-add和--device了。
    $ docker run --rm -it --cap-add SYS_ADMIN sshfs sshfs sven@10.10.10.20:/home/sven /mnt
    fuse: failed to open /dev/fuse: Operation not permitted
    $ docker run --rm -it --device /dev/fuse sshfs sshfs sven@10.10.10.20:/home/sven /mnt
    fusermount: mount failed: Operation not permitted
    $ docker run --rm -it --cap-add SYS_ADMIN --device /dev/fuse sshfs
    # sshfs sven@10.10.10.20:/home/sven /mnt
    The authenticity of host '10.10.10.20 (10.10.10.20)' can't be established.
    ECDSA key fingerprint is 25:34:85:75:25:b0:17:46:05:19:04:93:b5:dd:5f:c6.
    Are you sure you want to continue connecting (yes/no)? yes
    sven@10.10.10.20's password:
    root@30aa0cfaf1b5:/# ls -la /mnt/src/docker
    total 1516
    drwxrwxr-x 1 1000 1000   4096 Dec  4 06:08 .
    drwxrwxr-x 1 1000 1000   4096 Dec  4 11:46 ..
    -rw-rw-r-- 1 1000 1000     16 Oct  8 00:09 .dockerignore
    -rwxrwxr-x 1 1000 1000    464 Oct  8 00:09 .drone.yml
    drwxrwxr-x 1 1000 1000   4096 Dec  4 06:11 .git
    -rw-rw-r-- 1 1000 1000    461 Dec  4 06:08 .gitignore
    如果Docker守护进程在启动时选择了lxclxc-driver(docker -d --exec-driver=lxc),那么就可以使用--lxc-conf来设定LXC参数。但需要注意的是,未来主机上的Docker deamon有可能不会使用LXC,所以这些参数有可能会包含一些没有实现的配置功能。这意味着,用户在操作这些参数时必须要十分熟悉LXC。
    特别注意:当你使用--lxc-conf修改容器参数后,Docker deamon将不再管理这些参数,那么用户必须自行进行管理。比如说,你使用--lxc-conf修改了容器的IP地址,那么在/etc/hosts里面是不会自动体现的,需要你自行维护。
    Overriding Dockerfile image defaults
    当开发者使用Dockerfile进行build或者使用commit提交容器时,开发人员可以设定一些镜像默认参数。
    这些参数中,有四个是无法被覆盖的:FROM、MAINTAINER、RUN和ADD,其余参数都可以通过docker run进行覆盖。我们将介绍如何对这些参数进行覆盖。
    CMD (Default Command or Options)
    ENTRYPOINT (Default Command to Execute at Runtime)
    EXPOSE (Incoming Ports)
    ENV (Environment Variables)
    VOLUME (Shared Filesystems)
    USER
    WORKDIR
    CMD (default command or options)
    $ sudo docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARG...]
    这个命令中的COMMAND部分是可选的。因为这个IMAGE在build时,开发人员可能已经设定了默认执行的命令。作为操作人员,你可以使用上面命令中新的command来覆盖旧的command。
    如果镜像中设定了ENTRYPOINT,那么命令中的CMD也可以作为参数追加到ENTRYPOINT中。
    ENTRYPOINT (default command to execute at runtime)
    --entrypoint="": Overwrite the default entrypoint set by the image
    这个ENTRYPOINT和COMMAND类似,它指定了当容器执行时,需要启动哪些进程。相对COMMAND而言,ENTRYPOINT是很难进行覆盖的,这个ENTRYPOINT可以让容器设定默认启动行为,所以当容器启动时,你可以执行任何一个二进制可执行程序。你也可以通过COMMAND 为ENTRYPOINT传递参数。但当你需要在容器中执行其它进程时,你就可以指定其它ENTRYPOINT了。
    下面就是一个例子,容器可以在启动时自动执行Shell,然后启动其它进程。
    $ sudo docker run -i -t --entrypoint /bin/bash example/redis
    #or two examples of how to pass more parameters to that ENTRYPOINT:
    $ sudo docker run -i -t --entrypoint /bin/bash example/redis -c ls -l
    $ sudo docker run -i -t --entrypoint /usr/bin/redis-cli example/redis --help
    EXPOSE (incoming ports)
    Dockefile在网络方面除了提供一个EXPOSE之外,没有提供其它选项。下面这些参数可以覆盖Dockefile的expose默认值:
    --expose=[]: Expose a port or a range of ports from the container
            without publishing it to your host
    -P=false   : Publish all exposed ports to the host interfaces
    -p=[]      : Publish a container?s port to the host (format:
             ip:hostPort:containerPort | ip::containerPort |
             hostPort:containerPort | containerPort)
             (use 'docker port' to see the actual mapping)
    --link=""  : Add link to another container (name:alias)
    --expose可以让容器接受外部传入的数据。容器内监听的端口不需要和外部主机的端口相同。比如说在容器内部,一个HTTP服务监听在80端口,对应外部主机的端口就可能是49880.
    如果使用-p或者-P,那么容器会开放部分端口到主机,只要对方可以连接到主机,就可以连接到容器内部。当使用-P时,Docker会在主机中随机从49153 和65535之间查找一个未被占用的端口绑定到容器。你可以使用docker port来查找这个随机绑定端口。
    当你使用--link方式时,作为客户端的容器可以通过私有网络形式访问到这个容器。同时Docker会在客户端的容器中设定一些环境变量来记录绑定的IP和PORT。
    ENV (environment variables)
    HOME    Set based on the value of USER
    HOSTNAME    The hostname associated with the container
    PATH    Includes popular directories, such as :
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    TERM    xterm if the container is allocated a psuedo-TTY
    当容器启动时,会自动在容器中初始化这些变量。
    操作人员可以通过-e来设定任意的环境变量,甚至覆盖已经存在的环境变量,或者是在Dockerfile中通过ENV设定的环境变量。
    $ sudo docker run -e "deep=purple" --rm ubuntu /bin/bash -c export
    declare -x HOME="/"
    declare -x HOSTNAME="85bc26a0e200"
    declare -x OLDPWD
    declare -x PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
    declare -x PWD="/"
    declare -x SHLVL="1"
    declare -x container="lxc"
    declare -x deep="purple"
    操作人员可以通过-h来设定hostname。也可以使用"--link name:alias"来设定环境变量,当使用--link后,Docker将根据后面提供的IP和PORT信息来连接服务端容器。下面就是使用redis的例子:
    # Start the service container, named redis-name
    $ sudo docker run -d --name redis-name dockerfiles/redis
    4241164edf6f5aca5b0e9e4c9eccd899b0b8080c64c0cd26efe02166c73208f3
    # The redis-name container exposed port 6379
    $ sudo docker ps
    CONTAINER ID        IMAGE                      COMMAND                CREATED             STATUS              PORTS               NAMES
    4241164edf6f        $ dockerfiles/redis:latest   /redis-stable/src/re   5 seconds ago       Up 4 seconds        6379/tcp            redis-name
    # Note that there are no public ports exposed since we didn?t use -p or -P
    $ sudo docker port 4241164edf6f 6379
    2014/01/25 00:55:38 Error: No public port '6379' published for 4241164edf6f
    你使用--link后,就可以获取到关于Redis容器的相关信息。
    $ sudo docker run --rm --link redis-name:redis_alias --entrypoint /bin/bash dockerfiles/redis -c export
    declare -x HOME="/"
    declare -x HOSTNAME="acda7f7b1cdc"
    declare -x OLDPWD
    declare -x PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
    declare -x PWD="/"
    declare -x REDIS_ALIAS_NAME="/distracted_wright/redis"
    declare -x REDIS_ALIAS_PORT="tcp://172.17.0.32:6379"
    declare -x REDIS_ALIAS_PORT_6379_TCP="tcp://172.17.0.32:6379"
    declare -x REDIS_ALIAS_PORT_6379_TCP_ADDR="172.17.0.32"
    declare -x REDIS_ALIAS_PORT_6379_TCP_PORT="6379"
    declare -x REDIS_ALIAS_PORT_6379_TCP_PROTO="tcp"
    declare -x SHLVL="1"
    declare -x container="lxc"
    #And we can use that information to connect from another container as a client:
    $ sudo docker run -i -t --rm --link redis-name:redis_alias --entrypoint /bin/bash dockerfiles/redis -c '/redis-stable/src/redis-cli -h $REDIS_ALIAS_PORT_6379_TCP_ADDR -p $REDIS_ALIAS_PORT_6379_TCP_PORT'
    172.17.0.32:6379>
    Docker也会将这个alias的IP地址写入到/etc/hosts文件中。然后你就可以通过别名来访问link后的容器。
    $ sudo docker run -d --name servicename busybox sleep 30
    $ sudo docker run -i -t --link servicename:servicealias busybox ping -c 1 servicealias
    如果你重启了源容器(servicename),相关联的容器也会同步更新/etc/hosts。
    VOLUME (shared filesystems)
    -v=[]: Create a bind mount with: [host-dir]:[container-dir]:[rw|ro].
       If "container-dir" is missing, then docker creates a new volume.
    --volumes-from="": Mount all volumes from the given container(s)
    关于volume参数,可以在Managing data in containers查看详细说明,需要注意的是开发人员可以在Dockerfile中设定多个volume,但是只能由运维人员设置容器直接的volume访问。
    USER
    容器中默认的用户是root,但是开发人员创建新的用户之后,这些新用户也是可以使用的。开发人员可以通过Dockerfile的USER设定默认的用户,并通过"-u "来覆盖这些参数。
    WORKDIR

    容器中默认的工作目录是根目录(/)。开发人员可以通过Dockerfile的WORKDIR来设定默认工作目录,操作人员可以通过"-w"来覆盖默认的工作目录。

    附件:

    ①docker ps XXX 显示当前正在运行的容器
    ②docker ps -a XXX 显示所有的容器
    ③docker inspect XXX 显示容器详情,基本所有信息都有
    ④docker logs XXX 显示容器的启动日志(这个特别强调,除了我们说的把容器日志挂载出来还可以查看这个日志。区别:挂载出来的是程序自己的日志,这个是容器的启动日志,小编有好几次线上出bug都是通过这个命令找到原因!)
    ⑤docker images 显示日志列表
    ⑥docker stop XXX 停止容器
    ⑦docker start XX 开启容器
    ⑧docker restart XXX 重启容器
    ⑨ docker rm XXX 删除已经停止的容器(正在运行的删不了)
    ⑩docker rm -f XXX 删除容器(停止、运行的容器)
    ⑪docker exec -it XXX /bin/bash 进入容器内部
    ⑫docker cp XXX:要拷贝的文件在容器里面的路径 要拷贝到宿主机的相应路径(从容器里拷贝文件到主机)
    ⑬docker cp 要拷贝到宿主机的相应路径 XXX:要拷贝的文件在容器里面的路径(从主机拷贝文件到容器里)
    ⑭docker export XXX > test.tar 导出容器
    ⑮sudo docker import - test/tomcat:1.0.1 导入容器
    ⑯docker search tomcat 查找tomcat的docker官方镜像
    ⑰docker pull 镜像名 (拉取镜像)
    ⑱docker tag 镜像ID 名字:版本 (修改镜像名字)
    ⑲docker events --since="1467302400" (查看docker时间,since按时间戳,f按条件,)
    ⑳docker push 镜像名:版本 推送你的镜像到你的仓库或者github上


    展开全文
  • Docker系列(三) Docker run 参数详情

    千次阅读 2020-07-08 09:42:52
    docker run 的参数详情 $ sudo docker run Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG…] Run a command in a new container 一、参数 -a, --attach=[] Attach to stdin, stdout or stderr. -c, --cpu-...
  • Docker run 启动容器

    千次阅读 2019-05-08 17:23:20
    docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 选项 名称 描述 -a 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项 详情 -w 指定容器的工作目录 -c 指定容器CPU权重, 在CPU共享场景使用 ...
  • dockerdocker run命令详解

    万次阅读 2018-08-10 11:00:17
    docker run:创建并启动容器。 docker run命令用于运行一个新容器,而启动一个容器需要非常多的信息,所以该命令的参数非常多,今天就详细分析下该命令支持的参数。 首先看一下该命令的格式: Usage: docker run ...
  • docker run 参数详解

    万次阅读 2019-08-16 16:16:46
    命令格式:docker run [OPTIONS] IMAGE [COMMAND] [ARG...] Usage: Run a command in a new container 中文意思为:通过run命令创建一个新的容器(container) 常用选项说明 -d, --detach=false, 指定容器运行于...
  • docker run 命令详解(新手入门必备)

    千次阅读 2020-06-13 17:25:09
    docker run -itd --name test --hostname test --restart unless-stopped --net=host --cpus=2 -m 1024M \ -v /tmp:/tmp -p 80:80 -e MYSQL_IP=192.168.1.1 --device=/dev/uhid nginx:latest -i, --interactive ...
  • docker rundocker exec的区别

    千次阅读 2019-05-07 10:59:38
    docker run :创建一个新的容器并运行一个命令/docker exec:在运行的容器中执行命令 docker run :创建一个新的容器并运行一个命令 语法 docker run [OPTIONS] IMAGE [COMMAND] [ARG...] OPTIONS说明: -a ...
  • docker-compose 与 docker run -it

    千次阅读 2020-06-29 16:06:18
    写好dockerfile镜像,执行docker run -it XXX:XXX /bin/bash "cd /dir/yourpath&& yarn start" 成功,本来以为写个docker-compose下班走人。结果发现执行“docker-compose up” yarn 启动不成功。 运行失败...
  • docker run 中的privileged参数

    千次阅读 2020-09-29 10:38:00
    $ docker help run ... --privileged=false Give extended privileges to this container ... 大约在0.6版,privileged被引入docker。使用该参数,container内的root拥有真正的root权限。...
  • docker run -it 和 docker exec -it

    千次阅读 2020-07-04 20:16:54
    docker run -it imageID [cmd] 这个是用镜像产生一个容器,并且和cmd程序做交互 -i表示交互式的,表示[cmd]是一个有用户输入的程序,比如/bin/bash 和 python 等等。 -t 产生一个终端。 所以说有-i就必须有-t,...
  • docker run命令行参数解析

    千次阅读 2019-06-11 15:13:04
    docker run命令行参数解析 -a, --attach=[] 登录容器(必须是以docker run -d启动的容器) -w, --workdir="" 指定容器的工作目录 -c, --cpu-shares=0 设置容器CPU权重,在CPU共享场景使用 -e, --env=[] 指定...
  • docker run 中 选项-e 的使用

    千次阅读 2020-11-19 23:45:54
    docker run 中 选项-e 的使用 @(容器技术)[Docker, 帮助] 问题由来: 今天去部署docker镜像的时候,发现有一个容器的环境变量一直不生效,导致异常 _mysql_exceptions.OperationalError: (1045, "Access denied for ...
  • docker-docker run的各项参数详解

    千次阅读 2020-09-15 20:00:31
    docker run -u root -p 8080:8080 -v /data:/data -itd --name centos-test --privileged=true mft/centos7:0828 /usr/sbin/init -t:临时终端 -d后台运行 -p映射端口主机端口:容器端口 -u 以什么身份运行 -v ...
  • docker rundocker exec的区别

    千次阅读 2019-04-12 14:36:02
    docker run”和“docker exec”都是 Docker 容器中用于执行的命令。然而,在不同的情况下,它们的使用有着本质上的区别。 docker run 命令时创建容器时启动容器;docker exec是针对已经创建好的容器执行启动操作...
  • docker run网络配置

    千次阅读 2019-09-14 20:09:44
    可以在 docker run 的时候通过 --net 参数来指定容器的网络配置,有4个可选值: –net=bridge 这个是默认值,连接到默认的网桥。 –net=host 共享主机网络空间,可以像普通进程一样进行通信 –...
  • docker rundocker-compose转换

    千次阅读 2017-11-01 12:00:17
    一、命令行启动 ... docker run –restart=always –privileged –network br0 –ip 192.168.8.2 -p 80:80 –name mynginx -v PWD/www:/www−vPWD/www:/www -v PWD/conf/nginx.conf:/etc/nginx/nginx.conf -v $
  • docker run 出错

    千次阅读 2019-03-18 13:10:57
    [root@localhost 13:03 /usr/libexec/docker]# docker run hello-world /usr/bin/docker-current: Error response from daemon: shim error: docker-runc not installed on system. 解决:sudo ln -s /usr/lib....
  • 执行_docker run -it -v /myDataVolume:/dataVolumeContainer centos:latest_ 然后我在容器里找到了dataVolumeContainer这个文件,但是myDataVolume在哪里啊?为啥找不到?而且为啥我指定C:\Users\Administratori/...
  • docker run 中的特殊指令

    千次阅读 2020-02-08 00:41:18
    我们要在 docker 中监控主机,但是默认情况下容器中是看不到主机的进程,也看不到主机的...[root@docker ~]# docker run -it centos Unable to find image 'centos:latest' locally Trying to pull repository doc...
  • Docker run 命令实战

    千次阅读 2017-06-08 11:21:37
    Docker run 命令实战
  • docker run 的 -i -t -d参数

    万次阅读 多人点赞 2019-10-28 15:17:23
    docker run 的 -i -t -d前言这三个参数(-i, -t, -d)是啥意思该如何组合应用这三个参数其他参数 前言 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何...
  • docker run -v 挂载数据卷

    万次阅读 2019-05-17 17:04:52
    docker run -v /usr/ToolsAPIDir:/ToolsAPIDir1 -d -p 5005:5004 -it toolsapi:v8 python3 tools_api.py 命令解析: -v 本地目录:容器目录。挂载主机的本地目录 /usr/ToolsAPIDir 目录到容器的/ToolsAPIDir...
  • docker run hangs问题排查记录 https://www.cnblogs.com/edenlong/p/10972876.html 阿里巴巴 Kubernetes 集群问题排查思路和方法 https://www.infoq.cn/article/t_ZQeWjJLGWGT8BmmiU4 1.首先确认docker version一致 ...
  • docker run -v 用户目录的权限配置

    万次阅读 2020-10-22 20:32:34
    docker run volumn 用户目录的权限配置 挂载目录的权限 docker run -v 或者 docker-compose -v 挂载目录的权限是跟挂在目录的权限相关的 概述 在挂在目录前发现容器可运行,挂在容器后容器却无法运行,通过docker ...
  • 一:docker run参数覆盖Dockerfile中CMD命令情况 首先要明确docker run指令中的参数是什么? 答案:docker run 指令(-it/-p/-d等) 镜像名 参数(/bin/sh、bash等),即docker run命令中,镜像名后面的 都是给...
  • 如何查看docker run启动参数命令

    千次阅读 2020-07-02 22:41:20
    通过runlike去查看一个容器的docker run启动参数
  • docker run没有启动通过ps无法发现

    千次阅读 2020-04-04 09:08:21
    docker run 一个镜像的时候,如果放后台运行,那么是docker run -d image 但是如果我们这么做的话,很容易就发现docker ps 后并没有发现容器在运行。 通过docker ps -a 可以发现该容器,可以知道其创建了但是并没有...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 297,263
精华内容 118,905
关键字:

dockerrun