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-fromtest 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