docker 运行在一个独立的隔离的进程中。
当用户执行 docker run, 它将 启动 一个 有着 独立的文件系统,独立的网络和独立的进程树的进程。
--rm:告诉Docker一旦运行的进程退出就删除容器。这在进行测试时非常有用,可免除杂乱[图片]
-ti:告诉Docker分配一个伪终端并进入交互模式。这将进入到容器内,对于快速原型开发或尝试很有用,但不要在生产容器中打开这些标志
基本的 docker run 命令的格式:
docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARG...]
[OPTIONS] 分为两种 :
1. 对于用户独占性的设置:
前台、后台运行
容器定义
网络设定
容器在 CPU 和内存中的运行时间
运行权限和 LXC 配置
2. 在操作者和开发者之间的共享设定,操作者可以覆盖掉开发者在 build 镜像的时候的默认设置。
前台和后台
后台 (-d)
在后台模式 ( -d=true 或者 直接使用 -d )
所有的 IO 操作都 必须通过网络连接或者共享卷来 进行 ,因为容器在后台运行的时候就 不能收到 命令行。
当然也 可以通过执行 dockerattach 重新连上在后台执行的容器。
如果你选择运行一个容器在后台模式,那你就不能使用 -rm 选项了。
前台
在前台模式 ( 默认的 )
docker run 可以在容器里开启一个进程 的 同时
你可以通过 控制台 来获得进程的 STDIN 、 STDOUT 、 STDERR 。
也可以作为终端和传递信号。所有这些的配置方法如下:
-a, --attach=[] 连接容器的 stdin 、 stdout 、 stderr ( 默认连接这三个流 )
-t, --tty=false 使用终端。经常和 -i 一起使用。
--sig-proxy=true 代理所有收到的系统信息 ( 我测试了一下好像没有作用 )
-i, --interactive=false 打开 STDIN 和容器交互。经常和 -t 一起使用。
docker run -a stdin -a stdout -i-t ubuntu /bin/bash
容器的标识
我们可以通过三种方式来定义一个容器
UUID 长定义 ("f78375b1c487e03c9438c729345e54db9d20cfa2ac1fc3494b6eb60872e74778")
UUID 短定义 ("f78375b1c487")
名字 ("evil_ptolemy")
UUID 标识是来自于 Docker 的 后台 进程
如果你不通过 -name 来分配一个名字给容器,那么 后台 进程就会产生一个随机的字段名。
PID 等价 为了更自动化, 你可以在容器启动的时候将容器的进程 ID 写入到一个指定的文件中
--cidfile="" 写入容器的进程 ID 到指定文件
网络设定
--dns=[] 设置容器的 DNS 服务器
--net="bridge" 设置容器的网络连接方式
'bridge': 桥接
'none': 不提供网络连接
'Container:<name|id>': 复用另一个容器的网络连接, ( 共享一个网络堆栈 )
'host': 使用宿主机的网络环境
$ docker run -d --name redisexample/Redis --bind 127.0.0.1
$ # use the redis container's network stack to access localhost
$ docker run --rm -ti --netcontainer:redis example/redis-cli -h 127.0.0.1
清理 (-rm)
Docker 容器会在运行结束之后继续保留容器的文件系统。
如果你希望在退出的时候自动清理这些文件,可以加上 --rm 参数。 ( 特别适合初学者随便建容器 )
docker run -it --rm mariadb:10.0.23 /bin/bash
容器的 CPU 和内存占用
用户可以调整容器的性能参数:
-m, --memory="" 内存限制 ( 单位 : b, k, m or g)
-c=0 CPU 优先级 ( 相对权重 )
用户可以通过 docker run -m 来方便的限定容器的内存使用。
默认所有容器都运行在相同优先级上,得到相同的比例的 CPU 周期。
但是你可以在 docker 启动这些容器的时候告诉内核给予更多的 cpu 分配。
挂载目录 ( 直接给例子吧 )
-v=[]: 绑定挂载目录
宿主机绑定 : -v < host > : < container >:[rw|ro]
在 Docker 中新建一个共享的卷 : -v / <container>
sudo docker run --rm-i -t -v / home/hyzhou/docker:/data:rw ubuntu:14.04 /bin/bash
将本机的 / home/hyzhou/docker ,挂载到镜像中的 /data 目录
--volumes-from="" 从容器挂载共享目录
sudo docker run --rm -i -t -v/valume --name test ubuntu:14.04 /bin/bash
sudo docker run --rm-i -t --volumes-from test buntu:14.04 /bin/bash
挂载 test 镜像的 /valume 目录
用户
容器默认的用户是 root(id=0), 但是如果开发者创建了 其他 的用户,那些用户也可以访问。
开发者可以设置一个默认用户来运行第一个进程通过 Dockerfile USER 命令,但是操作者可以覆盖它:
- u="" 设置默认的用户名或 UID
工作目录
一个容器内的默认工作目录是根目录 (/)
-w="" 设置默认的工作目录
docker run -h node1 --name=node1 --ulimit nofile=65535:655350 -m 512M --memory-swap=1024M --net=none -d -it centos:latest /root/run
这个时候容器就已经启动,但是不符合我的环境
-h 主机名
--name 给容器定义名字
-ulimit 配置ulimit,当容器启动后就无法更改
-m 分配内存
--net=none 不使用docker网络,如果不配置会docker会自动分配ip地址给容器,但是每次重启后ip地址会改变,导致不符合我的环境,也可以用-p把端口映射出去,这样 端口不会改变,使用端口即可,但是正如我所说,不符合我的环境要求,后面采用脚本控制命名空间给容器配置静态ip
7、docker run命令详解
Usage: docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARG...]
Run a command in a new container
-a=map[]: 附加标准输入、输出或者错误输出
-c=0: 共享CPU格式(相对重要)
-cidfile="": 将容器的ID标识写入文件
-d=false: 分离模式,在后台运行容器,并且打印出容器ID
-e=[]:设置环境变量
-h="": 容器的主机名称
-i=false: 保持输入流开放即使没有附加输入流
-privileged=false: 给容器扩展的权限
-m="": 内存限制 (格式:<number><optional unit>, unit单位 = b, k, m or
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com