docker 使用總結


docker run

asn@hadoop1:~/Desktop$ docker run --help

 

Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

 

Run a command in a new container

 

-a, --attach=[] Attach to STDIN, STDOUT or STDERR

 

--add-host=[] Add a custom host-to-IP mapping (host:ip) 增加一個定制的'主機-IP'映射

 

--blkio-weight=0 Block IO (relative weight), between 10 and 1000

-c, --cpu-shares=0 CPU shares (relative weight)

 

--cap-add=[] Add Linux capabilities 增加linux能力

--cap-drop=[] Drop Linux capabilities

 

--cgroup-parent= Optional parent cgroup for the container

 

--cidfile= Write the container ID to the file 把容器的ID寫入文件

 

--cpu-period=0 Limit CPU CFS (Completely Fair Scheduler) period

--cpu-quota=0 Limit the CPU CFS quota

--cpuset-cpus= CPUs in which to allow execution (0-3, 0,1)

--cpuset-mems= MEMs in which to allow execution (0-3, 0,1)

 

-d, --detach=false Run container in background and print container ID         在后台運行容器並打印容器ID

 

--device=[] Add a host device to the container 把一個主機設備添加到容器

 

--dns=[] Set custom DNS servers 設置定制的域名服務器

--dns-search=[] Set custom DNS search domains 設置定制的域名服務器的搜索域

 

 

-e, --env=[] Set environment variables 設置環境變量

 

--entrypoint= Overwrite the default ENTRYPOINT of the image 覆蓋鏡像的默認進入點

 

--env-file=[] Read in a file of environment variables 讀入一個包含環境變量的文件

 

--expose=[] Expose a port or a range of ports 暴露一個端口、端口范圍

 

-h, --hostname= Container host name 容器的主機名

 

-i, --interactive=false Keep STDIN標准輸入 open even if not attached

 

--ipc= IPC namespace to use 使用的IPC命名空間

--pid= PID namespace to use 使用的PID命名空間

--uts= UTS namespace to use

 

 

-l, --label=[] Set meta data on a container 在容器上,設置元數據

 

--label-file=[] Read in a line delimited file of labels

 

--link=[] Add link to another container 添加一個到另一個容器的連接

 

--log-driver= Logging driver for container 容器的日志驅動

--log-opt=[] Log driver options

 

--lxc-conf=[] Add custom lxc options 添加定制的lxc選項

 

-m, --memory= Memory limit 內存限制

 

--mac-address= Container MAC address (e.g. 92:d0:c6:0a:29:33) 容器的MAC地址

 

--memory-swap= Total memory (memory + swap), '-1' to disable swap 容器的總內存(物理內容+交換區)

 

--name= Assign a name to the container 為容器分配一個名字

 

--net=bridge Set the Network mode for the container 為容器設置網絡模式

 

--oom-kill-disable=false Disable OOM Killer

 

-P, --publish-all=false Publish all exposed ports to random ports

-p, --publish=[] Publish a container's port(s) to the host 把容器的端口發布到主機

 

 

 

--privileged=false Give extended privileges to this container 賦予容器擴展權限

 

--read-only=false Mount the container's root filesystem as read only 以只讀的方式裝載容器的根文件系統

 

--restart=no Restart policy to apply when a container exits

 

--rm=false Automatically remove the container when it exits 當容器存在時,自動移除容器

 

--security-opt=[] Security Options 安全選項

 

--sig-proxy=true Proxy received signals to the process

 

-t, --tty=false Allocate a pseudo-TTY 分配一個偽終端

 

-u, --u-user= Username or UID (format: <name|uid>[:<group|gid>])

--ulimit=[] Ulimit options

 

-v, --volume=[] Bind mount a volume

--volumes-from=[] Mount volumes from the specified container(s)

-w, --workdir= Working directory inside the container

 

 

Docker會在隔離的容器中運行進程。

當運行docker run命令時,Docker會啟動一個進程,並為這個進程分配其獨占的文件系統、網絡資源和以此進程為根進程的進程組。

在容器啟動時,鏡像可能已經定義了要運行的二進制文件、暴露的網絡端口等,但是用戶可以通過docker run命令重新定義(譯者注:docker run可以控制一個容器運行時的行為,它可以覆蓋docker build在構建鏡像時的一些默認配置),這也是為什么run命令相比於其它命令有如此多的參數的原因。

使用方法:

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

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 (-d)

docker run    -d

-d=false

--detach=false

那么容器將會運行在后台模式。

此時所有I/O數據只能通過網絡資源或者共享卷組來進行交互,因為容器不再監聽你執行docker run的這個終端命令行窗口。

但你可以通過執行docker attach來重新附着到該容器的回話中。

需要注意的是,容器運行在后台模式下,是不能使用--rm選項的。

Foregroud

不指定-d參數(為明確給-d選項指定值,取默認值false --在前台模式下

Docker會在容器中啟動進程,同時當前的命令行窗口附着到容器的標准輸入、標准輸出和標准錯誤中 --- 把當前的命令行窗口附着到容器的標准輸入、輸出、錯誤上

也就是說容器中所有的輸出都可以在當前窗口中看到。

甚至它都可以虛擬出一個TTY窗口,來執行信號中斷。這一切都是可以配置的:

 

-a=[], --attach=[]            把容器的標准輸入、輸出、錯誤附着到當前的命令行窗口

-t=false, --tty=false        分配一個偽終端

-i=false, --interactive=false    附着標准輸入到當前命令行

 

注意:

-i選項取默認值(false

docker run 沒有-i選項,相當於docker run -i=false即非交互式運行

docker run -i, 指定-i選項,即以交互式運行



如果在執行run命令時沒有指定-a參數,那么Docker默認會掛載所有標准數據流,包括輸入輸出和錯誤,你可以單獨指定掛載哪個標准流。

$ sudo docker run -a=[stdin, 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
asn@hadoop1:~$ docker images

REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE

ubuntu jdk8 ed479b562041 28 hours ago 799.3 MB

ubuntu 14.04 d2a0ecffe6fa 10 days ago 188.4 MB

 


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/OpenMPIC++/using boost libraries)上或者金融服務上。

如果需要容器中部署上述類型的應用,那么就應該在多個容器直接使用共享內存了。

 

================

Network settings

默認情況下,所有的容器都開啟了網絡接口,同時可以接受任何外部的數據請求。

--dns=[]      : Set custom dns servers for the container

--net="bridge"   : Set the Network mode for the container

##在docker橋接上,為容器創建一個新的網絡棧

'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) 向容器/etc/hosts的文件中增加一行

--mac-address=""  : Sets the container's Ethernet device's MAC address 設置容器網卡的MAC地址


你可以通過docker run --net=none來關閉網絡接口,此時將關閉所有網絡數據的輸入輸出,你只能通過STDINSTDOUT或者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>.
比如當前有一個綁定了本地地址localhostRedis容器。

如果另外一個容器需要復用這個網絡堆棧, 則需要如下操作:

$ 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啟動了C0C1C2三個容器,使用-c=512啟動了C3容器。

這時,C0C1C2可以100%的使用CPU資源(1024),但C3只能使用50%CPU資源(512

如果這個主機的操作系統是時序調度類型的,每個CPU時間片是100微秒,那么C0C1 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守護進程在啟動時選擇了lxclxc-driverdocker -d --exec-driver=lxc),那么就可以使用--lxc-conf來設定LXC參數。

但需要注意的是,未來主機上的Docker deamon有可能不會使用LXC,所以這些參數有可能會包含一些沒有實現的配置功能。

這意味着,用戶在操作這些參數時必須要十分熟悉LXC

特別注意:當你使用--lxc-conf修改容器參數后,Docker deamon將不再管理這些參數,那么用戶必須自行進行管理。

比如說,你使用--lxc-conf修改了容器的IP地址,那么在/etc/hosts里面是不會自動體現的,需要你自行維護。

 

 

##把當前用戶加入到docker用戶組中

sudo usermod -a -G docker $USER

 

===============================

asn@hadoop1:~/Desktop$ docker commit -h

 

Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

 

Create a new image from a container's changes ##從一個容器的改變創建一個新的鏡像

 

-a, --author= Author (e.g., "John Hannibal Smith <hannibal@a-team.com>")

-c, --change=[] Apply Dockerfile instruction to the created image

--help=false Print usage

-m, --message= Commit message

-p, --pause=true Pause container during commit

 

============================

asn@hadoop1:~/hadoop-2.6.0-cdh5.4.4$ docker tag -h

 

Usage: docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]

 

Tag an image into a repository ##給鏡像打標簽入庫

 

-f, --force=false Force

--help=false Print usage

 

給容器打標簽

docker tag 11662b14f5e0 ubuntu:jdk1.7

 

 

以用戶grid_hd登錄容器

asn@hadoop1:~/hadoop-2.6.0-cdh5.4.4$ docker run -it -u grid_hd ubuntu:hd-salve1

grid_hd@c6af61c80d27:/$

 

 

查看目錄的大小

root@hadoop1:~# sudo du -sh /var/lib/docker

3.7G    /var/lib/docker

 

 

 

給目錄下的所有子目錄增加執行權限

#!/bin/bash

 

find /mnt/sda4/docker/aufs -type d | while read dir

do

    chmod +rx "$dir"

done

 

find 目錄 -type f -name "docker*" ##在指定目錄下,查找名字模式為"docker*"的文件

find 目錄 -type d -name "sac*"     ##在指定目錄下,查找名字模式為"sac*"的子目錄

 

啟動一個docker容器在后台運行

docker run -d IMAGE[:TAG] 命令

docker logs container_id ##打印該容器的輸出

 

docker attach container_id ##附加該容器的標准輸出到當前命令行

 

此時,Ctrl+C退出container(容器消失),按ctrl-p ctrl-q可以退出到宿主機,而保持container仍然在運行

 

 

發布容器的一個端口到主機

docker run -p

 

-p, --publish=[] Publish a container's port(s) to the host

 

 

 

-v, --volume=[] Bind mount a volume

 

 

docker images顯示鏡像

grid_hd@hadoop1:~/Desktop$ docker images --help

 

Usage: docker images [OPTIONS] [REPOSITORY]

 

List images

 

-a, --all=false Show all images (default hides intermediate images)

--digests=false Show digests

-f, --filter=[] Filter output based on conditions provided ##基於的條件過濾輸出

--help=false Print usage

--no-trunc=false Don't truncate output

-q, --quiet=false Only show numeric IDs ##僅顯示鏡像ID

 

docker rmi刪除鏡像

grid_hd@hadoop1:~/Desktop$ docker rmi --help

 

Usage: docker rmi [OPTIONS] IMAGE [IMAGE...]

 

Remove one or more images

 

-f, --force=false Force removal of the image

--help=false Print usage

--no-prune=false Do not delete untagged parents

 

 

docker rm 刪除正在運行的容器

grid_hd@hadoop1:~/Desktop$ docker rm --help

 

Usage: docker rm [OPTIONS] CONTAINER [CONTAINER...]

 

Remove one or more containers

 

-f, --force=false Force the removal of a running container (uses SIGKILL)

--help=false Print usage

-l, --link=false Remove the specified link

-v, --volumes=false Remove the volumes associated with the container

 

清除系統中正在運行的容器腳本

 

docker ps 顯示所有和剛運行的容器

grid_hd@hadoop1:~/Desktop$ docker ps --help

 

Usage: docker ps [OPTIONS]

 

List containers

 

-a, --all=false Show all containers (default shows just running)

--before= Show only container created before Id or Name

-f, --filter=[] Filter output based on conditions provided

--help=false Print usage

-l, --latest=false Show the latest created container, include non-running ##顯示最近創建的容器(包括未運行的)

-n=-1 Show n last created containers, include non-running         ##顯示最近創建的n個容器(包括未運行的)

--no-trunc=false Don't truncate output

-q, --quiet=false Only display numeric IDs

-s, --size=false Display total file sizes

--since= Show created since Id or Name, include non-running

 

 

映射host到container的端口和目錄

映射主機到容器的端口是很有用的,比如在container中運行memcached,端口為11211,運行容器的host可以連接container internel_ip:11211 訪問,如果有從其他主機訪問memcached需求那就可以通過-p選項,形如-p <host_port:contain_port>,存在以下幾種寫法:

-p 11211:11211這個即是默認情況下,綁定主機所有網卡(0.0.0.0)的11211端口到容器的11211端口上
-p 127.0.0.1:11211:11211只綁定localhost這個接口的11211端口
-p 127.0.0.1::5000
-p 127.0.0.1:80:8080

目錄映射其實是"綁定掛載"host的路徑到container的目錄,這對於內外傳送文件比較方便,在搭建私服那一節,為了避免私服container停止以后保存的images不被刪除,就要把提交的images保存到掛載的主機目錄下。使用比較簡單,-v <host_path:container_path>,綁定多個目錄時再加-v

-v /tmp/docker:/tmp/docker

另外在兩個container之間建立聯系可用--link,詳見高級部分或官方文檔
下面是一個例子:

# docker run --name nginx_test \
> -v /tmp/docker:/usr/share/nginx/html:ro \ 
> -p 80:80 -d \ 
> nginx:1.7.6 

在主機的/tmp/docker下建立index.html,就可以通過http://localhost:80/http://host-ip:80訪問了。

 

將一個container固化為一個新的image(commit)

當我們在制作自己的鏡像的時候,會在container中安裝一些工具、修改配置,如果不做commit保存起來,那么container停止以后再啟動,這些更改就消失了。
docker commit <container> [repo:tag]
后面的repo:tag可選
只能提交正在運行的container,即通過
docker ps可以看見的容器,

查看剛運行過的容器
# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 
c9fdf26326c9 nginx:1 nginx -g.. 3 hours ago Exited (0).. nginx_test

 

啟動一個已存在的容器(run是從image新建容器后再啟動),以下也可以使用docker start nginx_test代替
[root@hostname docker]# docker start c9fdf26326c9
c9fdf26326c9 

 

docker run -i -t --sig-proxy=false 21ffe545748baf /bin/bash 
nginx服務沒有啟動

 

# docker commit -m "some tools installed" fcbd0a5348ca seanlook/ubuntu:14.10_tutorial
fe022762070b09866eaab47bc943ccb796e53f3f416abf3f2327481b446a9503 

-a "seanlook7@gmail.com"
請注意,當你反復去commit一個容器的時候,每次都會得到一個新的
IMAGE ID,假如后面的repository:tag沒有變,通過docker images可以看到,之前提交的那份鏡像的repository:tag就會變成<none>:<none>,所以盡量避免反復提交。
另外,觀察以下幾點:

commit container只會pause住容器,這是為了保證容器文件系統的一致性,但不會stop。如果你要對這個容器繼續做其他修改:

  • 你可以重新提交得到新image2,刪除次新的image1
  • 也可以關閉容器用新image1啟動,繼續修改,提交image2后刪除image1
  • 當然這樣會很痛苦,所以一般是采用Dockerfilebuild得到最終image,參考[]

雖然產生了一個新的image,並且你可以看到大小有100MB,但從commit過程很快就可以知道實際上它並沒有獨立占用100MB的硬盤空間,而只是在舊鏡像的基礎上修改,它們共享大部分公共的"片"。

 

 

root@1ed046828345:/# mount

none on / type aufs (rw,relatime,si=20f4f613261c7d1d,dio,dirperm1)

proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)

tmpfs on /dev type tmpfs (rw,nosuid,mode=755)

devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=666)

shm on /dev/shm type tmpfs (rw,nosuid,nodev,noexec,relatime,size=65536k)

mqueue on /dev/mqueue type mqueue (rw,nosuid,nodev,noexec,relatime)

sysfs on /sys type sysfs (ro,nosuid,nodev,noexec,relatime)

/dev/disk/by-uuid/cb3e8593-916d-40e3-8614-24741433f32f on /etc/resolv.conf type ext4 (rw,relatime,errors=remount-ro,data=ordered)

/dev/disk/by-uuid/cb3e8593-916d-40e3-8614-24741433f32f on /etc/hostname type ext4 (rw,relatime,errors=remount-ro,data=ordered)

/dev/disk/by-uuid/cb3e8593-916d-40e3-8614-24741433f32f on /etc/hosts type ext4 (rw,relatime,errors=remount-ro,data=ordered)

devpts on /dev/console type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)

proc on /proc/asound type proc (ro,nosuid,nodev,noexec,relatime)

proc on /proc/bus type proc (ro,nosuid,nodev,noexec,relatime)

proc on /proc/fs type proc (ro,nosuid,nodev,noexec,relatime)

proc on /proc/irq type proc (ro,nosuid,nodev,noexec,relatime)

proc on /proc/sys type proc (ro,nosuid,nodev,noexec,relatime)

proc on /proc/sysrq-trigger type proc (ro,nosuid,nodev,noexec,relatime)

tmpfs on /proc/kcore type tmpfs (rw,nosuid,mode=755)

tmpfs on /proc/timer_stats type tmpfs (rw,nosuid,mode=755)

 

有四種不同的選項會影響容器守護進程的服務名稱。

  1. -h HOSTNAME 或者 --hostname=HOSTNAME  --設置容器的主機名,僅本機可見。

這種方式是寫到/etc/hostname ,以及/etc/hosts 文件中,作為容器主機IP的別名,並且將顯示在容器的bash中。

不過這種方式設置的主機名將不容易被容器之外可見。這將不會出現在 docker ps 或者 其他的容器的/etc/hosts 文件中。

 

  1. --link=CONTAINER_NAME:ALIAS  --使用這個選項去run一個容器, 將在此容器的/etc/hosts文件中增加一個主機名ALIAS這個主機名是名為CONTAINER_NAME 的容器的IP地址的別名。

這使得新容器的內部進程可以訪問主機名為ALIAS的容器而不用知道它的IP。

--link= 關於這個選項的詳細討論請看:    Communication between containers.

 

3. --dns=IP_ADDRESS --設置DNS服務器的IP地址,寫入到容器的/etc/resolv.conf文件中。當容器中的進程嘗試訪問不在/etc/hosts文件中的主機A 時,容器將以53端口連接到IP_ADDRESS這個DNS服務器去搜尋主機AIP地址。

4. --dns-search=DOMAIN --設置DNS服務器的搜索域,以防容器嘗試訪問不完整的主機名時從中檢索相應的IP。這是寫入到容器的 /etc/resolv.conf文件中的。當容器嘗試訪問主機 host,而DNS搜索域被設置為 example.com ,那么DNS將不僅去查尋host主機的IP,還去查詢host.example.com IP
 

docker中,如果啟動容器時缺少以上最后兩種選項設置時,將使得容器的/etc/resolv.conf文件看起來和宿主主機的/etc/resolv.conf文件一致。這些選項將修改默認的設置。

 

 

=================================

3、關於docker容器的端口映射

由於docker容器的IP地址每次啟動都會變,所以不適用於手動添加端口映射(難道每次重啟都來查看容器的IP么?)

所以需要每次啟動容器時, docker程序自動添加NAT規則,前期盡可能的把需要映射的端口在創建容器時配置好,如下:

 

#此處我把mysql,redis,nginx,ssh都進行了映射

docker run -h="activemq" --name activemq -d -p 51000:22 -p 51001:3306-p 51003:6379 -p 51004:6381 -p 51005:80-p 51006:8000 -p 51007:8888 debian/base/etc/rc.local

后續對於docker容器的管理,記住容器的名稱,如上述名稱是activemq,則使用

docker stop,start
來控制容器進程。

    docker stop activemq  
    docker start activemq 

 

4、關於docker容器的多程序開機自動運行docker容器每次啟動時,開機自啟動的命令都要在啟動容器前指定。

docker run -I -t debian /bin/bash命令,只會運行/bin/bash程序,其它的程序都不會運行,對於要跑多個程序的容器特別糾結。

多程序開機自動運行方法:
可把前面所說的啟動命令換成dockerrun -I -t debian /etc/rc.local,在容器中把所有需要開機自的啟動命令放在/etc/rc.local中,就可以達到多程序開機自啟動了。

后台運行則是:docker run -d -p 50001:22 debian /etc/rc.local

注意:run命令是創建一個新的容器,如果要啟動一個曾經運行過的容器,則用命令docker ps -a中找對應的容器ID,然后使用docker start <容器ID>即可。

 

 

5、關於docker容器和鏡像的關系

無論容器里做什么操作,寫文件,刪文件。該容器的基本鏡像都不會有任何改變。

這是因為Docker從父鏡像建立增量鏡像,只存儲每個容器的更改。

因此,如果你有一個300MB的父鏡像,如果你在容器中安裝了50MB的額外應用或服務,你的容器只有50MB,父鏡像還是300MB

但是可以使用Dockfilecommit命令來,把增量鏡像和父鏡像一起生成一個新的鏡像。

commit
使用:
    docker commit <
容器id> <新鏡像名稱

Dockfile
使用:
    root@yangrong:/data# cat Dockerfile

FROM ubuntu/testa     #這是基礎鏡像

CMD["/root/start.sh"]     #這是啟動命令

 

root@yangrong:/data# docker build -t <新鏡像名> ./ 

 

6docker參數詳解
    docker  
    useage of docker  
    -D
默認false 允許調試模式(debugmode)  
    -H
默認是unix:///var/run/docker.sock tcp://[host[:port]]來綁定或者

unix://[/path/to/socket]
來使用(二進制文件的時候),當主機ip host=[0.0.0.0],(端口)port=[4243] 或者 path=[/var/run/docker.sock]是缺省值,做為默認值來使用  
    -api-enable-cors
默認flase 允許CORS header遠程api  
    -b     
默認是空,附加在已存在的網橋上,如果是用'none'參數,就禁用了容器的網絡  
    -bip     
默認是空,使用提供的CIDRClasslessInter-Domain Routing-無類型域間選路)標記地址動態創建網橋(dcoker0),-b參數沖突  
    -d     
默認false 允許進程模式(daemonmode)  
    -dns     
默認是空,使docker使用指定的DNS服務器  
    -g     
默認是"/var/lib/docker":作為docker使用的根路徑  
    -icc     
默認true,允許inter-container來通信  
    -ip     
默認"0.0.0.0":綁定容器端口的默認Ip地址  
    -iptables     
默認true 禁用docker添加iptables規則  
    -mtu     
默認1500 : 設置容器網絡傳輸的最大單元(mtu)  
    -p         
默認是/var/run/docker.pid進程pid使用的文件路徑  
    -r         
默認是true 重啟之前運行的容器  
    -s         
默認是空,這個是docker運行是使用一個指定的存儲驅動器  
    -v         
默認false 打印版本信息和退出 

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 g)  
    -n=true:
允許鏡像使用網絡
    -p=[]:
匹配鏡像內的網絡端口號
    -rm=false:
當容器退出時自動刪除容器 (不能跟-d一起使用)  
    -t=false:
分配一個偽造的終端輸入
    -u="":
用戶名或者ID  
    -dns=[]:
自定義容器的DNS服務器
    -v=[]:
創建一個掛載綁定:[host-dir]:[container-dir]:[rw|ro].如果容器目錄丟失,docker會創建一個新的卷  
    -volumes-from="":
掛載容器所有的卷
    -entrypoint="":
覆蓋鏡像設置默認的入口點  
    -w="":
工作目錄內的容器  
    -lxc-conf=[]:
添加自定義-lxc-conf="lxc.cgroup.cpuset.cpus = 0,1" 
    -sig-proxy=true:
代理接收所有進程信號(even in non-tty mode)  
    -expose=[]:
讓你主機沒有開放的端口  
    -link="":
連接到另一個容器(name:alias)  
    -name="":
分配容器的名稱,如果沒有指定就會隨機生成一個  
    -P=false: Publish all exposed ports to the host interfaces
公布所有顯示的端口主機接口 

8
docker常用命令總結
    docker pull <
鏡像名:tag> #從官網拉取鏡像  
    docker search <
鏡像名> #搜索在線可用鏡像名 

8.1
查詢容器、鏡像、日志
    docker top <container> #
顯示容器內運行的進程  
    docker images #
查詢所有的鏡像,默認是最近創建的排在最上。  
    docker ps #
查看正在運行的容器  
    docker ps -l #
查看最后退出的容器的ID  
    docker ps -a #
查看所有的容器,包括退出的。  
    docker logs {
容器ID|容器名稱} #查詢某個容器的所有操作記錄。  
    docker logs -f {
容器ID|容器名稱} #實時查看容易的操作記錄。 

8.2
刪除容器與鏡像
    docker rm $(docker ps -a -q) #
刪除所有容器  
    docker rm <
容器名or ID> #刪除單個容器  
    docker rmi <ID> #
刪除單個鏡像  
    docker rmi $(docker images | grep none | awk '{print $3}' | sort -r)  #
刪除所有鏡像 

8.3
啟動停止容器
    docker stop <
容器名or ID> #停止某個容器  
    docker start <
容器名or ID> #啟動某個容器  
    docker kill <
容器名or ID> #殺掉某個容器 

8.4
容器遷器
    docker export <CONTAINER ID> > /home/export.tar #
導出  
    cat /home/export.tar | sudo docker import - busybox-1-export:latest  #
導入export.tar文件  
    docker save debian> /home/save.tar #
debian容器打包  
    docker load< /home/save.tar #
在另一台服務器上加載打包文件 

save
export的對比參考地址:

http://www.fanli7.net/a/bianchengyuyan/C__/20140423/452256.html

8.5
運行一個新容器
#
運行一個新容器,同時為它命名、端口映射。以debian02鏡像為例  
docker run -h="redis-test" --name redis-test -d -p 51000:22 -p51001:3306 -p 51003:6379 -p 51004:6381 -p 51005:80 -p 51006:8000 -p 51007:8888 debian02 /etc/rc.local

 

#container中拷貝文件,當container已經關閉后,在里面的文件還可以拷貝出來。  
sudo docker cp 7bb0e258aefe:/etc/debian_version . #
把容器中的/etc/debian_version拷貝到當前目錄下。 

8.6 docker Dockfile
鏡像制作
    root@yangrong:/data# cat Dockerfile  
    FROM ubuntu/testa #
這是基礎鏡像  
    CMD ["/root/start.sh"] #
這是啟動命令  


    root@yangrong:/data# docker build -t <
新鏡像名> ./ #生成新的鏡像 

 

 

 

 

一些網絡配置命令選項只能在啟動時提供給Docker服務器,並且在運行中不能改變:

  • -b BRIDGE--bridge=BRIDGE— see    建立自己的網橋
  • --bip=CIDR— see    定制docker0
  • -H SOCKET...--host=SOCKET...—   它看起來像是在設置容器的網絡,但實際卻恰恰相反:它告訴Docker服務器要接收命令的通道,例如"run container""stop container"
  • --icc=true|false— see    容器間通信
  • --ip=IP_ADDRESS— see    綁定容器端口
  • --ip-forward=true|false— see    容器間通信
  • --iptables=true|false— see   容器間通信
  • --mtu=BYTES— see    定制docker0

 

有兩個網絡配置選項可以在啟動時調用docker run設置。當在啟動時設置它會成為docker run的默認值:

  • --dns=IP_ADDRESS...— see    配置DNS
  • --dns-search=DOMAIN...— see    配置DNS

 

最后,一些網絡配置選項只能在調用docker run指出,因為它們要為每個容器做特定的配置:

  • -h HOSTNAME--hostname=HOSTNAME— see    配置DNS   Docker與容器連接原理
  • --link=CONTAINER_NAME:ALIAS— see   配置DNS and    容器間通信
  • --net=bridge|none|container:NAME_or_ID|host— see   Docker與容器連接原理
  • -p SPECor--publish=SPEC— see    綁定容器端口
  • -P--publish-all=true|false— see    綁定容器端口

接下來的部分會對以上話題從易到難做出逐一解答。

 

【Shell腳本】逐行處理文本文件

 

經常會對文體文件進行逐行處理,在Shell里面如何獲取每行數據,然后處理該行數據,最后讀取下一行數據,循環處理.有多種解決方法如下:

 

1.通過read命令完成.

 

read命令接收標准輸入,或其他文件描述符的輸入,得到輸入后,read命令將數據放入一個標准變量中.

 

利用read讀取文件時,每次調用read命令都會讀取文件中的"一行"文本.

 

當文件沒有可讀的行時,read命令將以非零狀態退出.

 

 

 

1 cat data.dat | while read line

 

2 do

 

3     echo "File:${line}"

 

4 done

 

5 

 

6 while read line

 

7 do 

 

8     echo "File:${line}"

 

9 done < data.dat

 

 

 

2.使用awk命令完成

 

awk是一種優良的文本處理工具,提供了極其強大的功能.

 

利用awk讀取文件中的每行數據,並且可以對每行數據做一些處理,還可以單獨處理每行數據里的每列數據.

 

1 cat data.dat | awk '{print $0}'

 

2 cat data.dat | awk 'for(i=2;i<NF;i++) {printf $i} printf "\n"}'

 

第1行代碼輸出data.dat里的每行數據,第2代碼輸出每行中從第2列之后的數據.

 

如果是單純的數據或文本文件的按行讀取和顯示的話,使用awk命令比較方便.

 

3.使用for var in file 命令完成

 

for var in file 表示變量var在file中循環取值.取值的分隔符由$IFS確定.

 

 

 

1 for line in $(cat data.dat)

 

2 do 

 

3     echo "File:${line}"

 

4 done

 

5 

 

6 for line in `cat data.dat`

 

7 do 

 

8     echo "File:${line}"

 

9 done

 

 

 

如果輸入文本每行中沒有空格,則line在輸入文本中按換行符分隔符循環取值.

 

如果輸入文本中包括空格或制表符,則不是換行讀取,line在輸入文本中按空格分隔符或制表符或換行符特環取值.

 

可以通過把IFS設置為換行符來達到逐行讀取的功能.

 

IFS的默認值為:空白(包括:空格,制表符,換行符)

 

 

ubuntu目錄結構

本文引自:cup 

   

/根目錄,一般根目錄下只存放目錄,不要存放文件,/etc/bin/dev/lib/sbin應該和根目錄放置在一個分區中

 

/bin:

/usr/bin:    執行二進制文件的目錄,如常用的命令ls、tar、mv、cat等。

/boot    放置linux系統啟動時用到的一些文件。/boot/vmlinuzlinux的內核文件,以及/boot/gurb建議單獨分區,分區大小100M即可

/dev    存放linux系統下的設備文件,訪問該目錄下某個文件,相當於訪問某個設備,常用的是掛載光驅mount /dev/cdrom /mnt

/etc    系統配置文件存放的目錄,不建議在此目錄下存放可執行文件,重要的配置文件有/etc/inittab/etc/fstab/etc/init.d/etc/X11/etc/sysconfig/etc/xinetd.d修改配置文件之前記得備份。

注:/etc/X11存放與x windows有關的設置。

/home系統默認的用戶家目錄,新增用戶賬號時,用戶的家目錄都存放在此目錄下,~表示當前用戶的家目錄,~test表示用戶test的家目錄。

建議單獨分區,並設置較大的磁盤空間,方便用戶存放數據

 

/lib:

/usr/lib:

/usr/local/lib    系統使用的函數庫的目錄,程序在執行過程中,需要調用一些額外的參數時需要函數庫的協助,比較重要的目錄為/lib/modules

 

/lost+fount    系統異常產生錯誤時,會將一些遺失的片段放置於此目錄下,通常這個目錄會自動出現在裝置目錄下。如加載硬盤於/disk 中,此目錄下就會自動產生目錄/disk/lost+found

/mnt:/media    光盤默認掛載點,通常光盤掛載於/mnt/cdrom下,也不一定,可以選擇任意位置進行掛載。

/opt    給主機額外安裝軟件所擺放的目錄。

如:FC4使用的Fedora 社群開發軟件,如果想要自行安裝新的KDE 桌面軟件,可以將該軟件安裝在該目錄下。以前的 Linux 系統中,習慣放置在 /usr/local 目錄下

 

/proc    此目錄的數據都在內存中,如系統核心,外部設備,網絡狀態,由於數據都存放於內存中,所以不占用磁盤空間,比較重要的目錄有/proc/cpuinfo/proc/interrupts/proc/dma/proc/ioports/proc/net/*

 

/root    系統管理員root的家目錄,系統第一個啟動的分區為/,所以最好將/root/放置在一個分區下。

 

/sbin:

/usr/sbin:

/usr/local/sbin放置系統管理員使用的可執行命令,如fdiskshutdownmount等。與/bin不同的是,這幾個目錄是給系統管理員root使用的命令,一般用戶只能"查看"而不能設置和使用。

 

/tmp    一般用戶或正在執行的程序臨時存放文件的目錄,任何人都可以訪問,重要數據不可放置在此目錄下

/srv    服務啟動之后需要訪問的數據目錄,如www服務需要訪問的網頁數據存放在/srv/www

 

/usr應用程序存放目錄         

          /usr/bin    存放應用程序

          /usr/share    存放共享數據

          /usr/lib        存放不能直接運行的,卻是許多程序運行所必需的一些函數庫文件。

          /usr/local:    存放軟件升級包

          /usr/share/doc:        系統說明文件存放目錄。

          /usr/share/man:         程序說明文件存放目錄,使用 man ls時會查詢/usr/share/man/man1/ls.1.gz的內容

建議單獨分區,設置較大的磁盤空間

 

/var    放置系統執行過程中經常變化的文件,如隨時更改的日志文件/var/log

          /var/log/message    所有的登錄文件存放目錄

          /var/spool/mail    郵件存放的目錄

          /var/run:            程序或服務啟動后,PID存放在該目錄下。

建議單獨分區,設置較大的磁盤空間


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM