Docker容器平常操做命令 - 運維筆記

 

使用Docker已有一段時間了,今天正好有空梳理下本身平時操做Docker時的一些命令和注意細節:html

Docker 命令幫助java

$ sudo docker 
Commands:
    attach Attach to a running container  
              --將終端依附到容器上
              1> 運行一個交互型容器
                 [root@localhost ~]# docker run -i -t centos /bin/bash
                 [root@f0a02b473067 /]# 
              2> 在另外一個窗口上查看該容器的狀態
                 [root@localhost ~]# docker ps -a
                 CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS      PORTS       NAMES
                 d4a75f165ce6        centos              "/bin/bash"         5 seconds ago       Up 5 seconds            cranky_mahavira
              3> 退出第一步中運行的容器
                 [root@d4a75f165ce6 /]# exit
                  exit
              4> 查看該容器的狀態
                 [root@localhost ~]# docker ps -a
                 CONTAINER ID        IMAGE           COMMAND           CREATED             STATUS                  PORTS    NAMES
                 d4a75f165ce6        centos          "/bin/bash"       2 minutes ago       Exited (0) 23 seconds ago        cranky_mahavira
                 可見此時容器的狀態是Exited,那麼,如何再次運行這個容器呢?可使用docker start命令
              5> 再次運行該容器
                 [root@localhost ~]# docker start cranky_mahavira
                 cranky_mahavira
              6> 再次查看該容器的狀態
                 [root@localhost ~]# docker ps -a
                 CONTAINER ID        IMAGE          COMMAND             CREATED             STATUS              PORTS      NAMES
                 d4a75f165ce6        centos         "/bin/bash"         6 minutes ago       Up 29 seconds                  cranky_mahavira
                 由於該容器是交互型的,但此刻咱們發現沒有具體的終端能夠與之交互,這時可以使用attach命令。
              7> 經過attach命令進行交互
                 [root@localhost ~]# docker attach cranky_mahavira
                 [root@d4a75f165ce6 /]# 

    build Build an image from a Dockerfile
              --經過Dockerfile建立鏡像

    commit Create a new image from a container's changes
              --經過容器建立本地鏡像
              注意:若是是要push到docker hub中,注意生成鏡像的命名
               [root@localhost ~]# docker commit centos_v1 centos:v1
               68ad49c999496cff25fdda58f0521530a143d3884e61bce7ada09bdc22337638
               [root@localhost ~]# docker push centos:v1
               You cannot push a "root" repository. Please rename your repository to <user>/<repo> (ex: <user>/centos)
               用centos:v1就不行,由於它push到docker hub中時,是推送到相應用戶下,必須指定用戶名。譬如個人用戶名是ivictor,則新生成的本地鏡像命名爲:
               docker push victor/centos:v1,其中v1是tag,可不寫,默認是latest 
              
    cp Copy files/folders from a container to a HOSTDIR or to STDOUT
              --在宿主機和容器之間相互COPY文件
              cp的用法以下:
              Usage:    docker cp [OPTIONS] CONTAINER:PATH LOCALPATH|-
                        docker cp [OPTIONS] LOCALPATH|- CONTAINER:PATH
              如:容器mysql中/usr/local/bin/存在docker-entrypoint.sh文件,可以下方式copy到宿主機
              #  docker cp mysql:/usr/local/bin/docker-entrypoint.sh /root
              修改完畢後,將該文件從新copy回容器
              # docker cp /root/docker-entrypoint.sh mysql:/usr/local/bin/     

    create    Create a new container  
              --建立一個新的容器,注意,此時,容器的status只是Created

    diff Inspect changes on a container's filesystem
              --查看容器內發生改變的文件,以個人mysql容器爲例
               [root@localhost ~]# docker diff mysqldb
               C /root
               A /root/.bash_history
               A /test1.txt
               A /test.tar
               A /test.txt
               C /run
               C /run/mysqld
               A /run/mysqld/mysqld.pid
               A /run/mysqld/mysqld.sock
               不難看出,C對應的均是目錄,A對應的均是文件

    events Get real time events from the server
              --實時輸出Docker服務器端的事件,包括容器的建立,啓動,關閉等。
              譬如:
              [root@localhost ~]# docker events
              2015-09-08T17:40:13.000000000+08:00 d2a2ef5ddb90b505acaf6b59ab43eecf7eddbd3e71f36572436c34dc0763db79: (from wordpress) create
              2015-09-08T17:40:14.000000000+08:00 d2a2ef5ddb90b505acaf6b59ab43eecf7eddbd3e71f36572436c34dc0763db79: (from wordpress) die
              2015-09-08T17:42:10.000000000+08:00 839866a338db6dd626fa8eabeef53a839e4d2e2eb16ebd89679aa722c4caa5f7: (from mysql) start

    exec Run a command in a running container
              --用於容器啓動以後,執行其它的任務
              經過exec命令能夠建立兩種任務:後臺型任務和交互型任務
              後臺型任務:docker exec -d cc touch 123  其中cc是容器名
              交互型任務:
              [root@localhost ~]# docker exec -i -t cc /bin/bash
              root@1e5bb46d801b:/# ls
              123  bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

    export    Export a container's filesystem as a tar archive
              --將容器的文件系統打包成tar文件
              有兩種方式(mysqldb爲容器名):
              docker export -o mysqldb1.tar mysqldb
              docker export mysqldb > mysqldb.tar 
    history Show the history of an image --顯示鏡像製做的過程,至關於dockfile

    images List images  
              --列出本機的全部鏡像

    import Import the contents from a tarball to create a filesystem image
              --根據tar文件的內容新建一個鏡像,與以前的export命令相對應
             [root@localhost ~]# docker import mysqldb.tar mysql:v1
             eb81de183cd94fd6f0231de4ff29969db822afd3a25841d2dc9cf3562d135a10
             [root@localhost ~]# docker images
             REPOSITORY                 TAG                 IMAGE ID            CREATED              VIRTUAL SIZE
             mysql                      v1                  eb81de183cd9        21 seconds ago       281.9 MB

              譬以下面一例:
              [root@localhost volume2]# docker ps
              CONTAINER ID   IMAGE               COMMAND      CREATED        STATUS      PORTS     NAMES
              9cb07559cc17   docker.io/ubuntu    "/bin/bash"  22 hours ago   Up 22 hours           naughty_bartik
              [root@localhost volume2]# docker export gigantic_goldwasser > wanghui.tar
              [root@localhost volume2]# docker import wanghui.tar wanghui:v1
              sha256:b6cbbaf69a58149f337dcc439a21ed185dcdf96fd7f72ddf45e102d27f47c4ae
              [root@localhost volume2]# docker images
              REPOSITORY    TAG   IMAGE ID        CREATED           SIZE
              wanghui       v1    b6cbbaf69a58    5 seconds ago     450.9 MB
              [root@localhost volume2]# docker run -i -t wanghui:v1 /bin/bash
              [root@78f4ac39972d /]# ps -efnode

    info Display system-wide information
              --查看docker的系統信息
              [root@localhost ~]# docker info
              Containers: 3              --當前有3個容器
              Images: 298      
              Storage Driver: devicemapper
               Pool Name: docker-253:0-34402623-pool
               Pool Blocksize: 65.54 kB
               Backing Filesystem: xfs
               Data file: /dev/loop0
               Metadata file: /dev/loop1
               Data Space Used: 8.677 GB          --對應的是下面Data loop file大小
               Data Space Total: 107.4 GB
               Data Space Available: 5.737 GB
               Metadata Space Used: 13.4 MB       --對應的是下面Metadata loop file大小
               Metadata Space Total: 2.147 GB
               Metadata Space Available: 2.134 GB
               Udev Sync Supported: true
               Deferred Removal Enabled: false
               Data loop file: /var/lib/docker/devicemapper/devicemapper/data
               Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata
               Library Version: 1.02.93-RHEL7 (2015-01-28)
              Execution Driver: native-0.2
              Logging Driver: json-file
              Kernel Version: 3.10.0-229.el7.x86_64
              Operating System: CentOS Linux 7 (Core)
              CPUs: 2
              Total Memory: 979.7 MiB
              Name: localhost.localdomain
              ID: TFVB:BXGQ:VVOC:K2DJ:LECE:2HNK:23B2:LEVF:P3IQ:L7D5:NG2V:UKNL
              WARNING: bridge-nf-call-iptables is disabled
              WARNING: bridge-nf-call-ip6tables is disabled

    inspect Return low-level information on a container or image
              --用於查看容器的配置信息,包含容器名、環境變量、運行命令、主機配置、網絡配置和數據卷配置等。

    kill Kill a running container 
              --強制終止容器
              關於stop和kill的區別,docker stop命令給容器中的進程發送SIGTERM信號,默認行爲是會致使容器退出,固然,
              容器內程序能夠捕獲該信號並自行處理,例如能夠選擇忽略。而docker kill則是給容器的進程發送SIGKILL信號,該信號將會使容器必然退出。

    load Load an image from a tar archive or STDIN
              --與下面的save命令相對應,將下面sava命令打包的鏡像經過load命令導入

    login Register or log in to a Docker registry
              --登陸到本身的Docker register,需有Docker Hub的註冊帳號
              [root@localhost ~]# docker login
              Username: ivictor
              Password: 
              Email: xxxx@foxmail.com
              WARNING: login credentials saved in /root/.docker/config.json
              Login Succeeded

    logout Log out from a Docker registry
              --退出登陸
              [root@localhost ~]# docker logout
              Remove login credentials for https://index.docker.io/v1/

    logs      Fetch the logs of a container
              --用於查看容器的日誌,它將輸出到標準輸出的數據做爲日誌輸出到docker logs命令的終端上。經常使用於後臺型容器

    pause Pause all processes within a container --暫停容器內的全部進程,
              此時,經過docker stats能夠觀察到此時的資源使用狀況是固定不變的,
              經過docker logs -f也觀察不到日誌的進一步輸出。

    port List port mappings or a specific mapping for the CONTAINER
              --輸出容器端口與宿主機端口的映射狀況
              譬如:
              [root@localhost ~]# docker port blog
              80/tcp -> 0.0.0.0:80
              容器blog的內部端口80映射到宿主機的80端口,這樣可經過宿主機的80端口查看容器blog提供的服務

    ps List containers  
              --列出全部容器,其中docker ps用於查看正在運行的容器,ps -a則用於查看全部容器。

    pull Pull an image or a repository from a registry
              --從docker hub中下載鏡像

    push Push an image or a repository to a registry --將本地的鏡像上傳到docker hub中
              前提是你要先用docker login登陸上,否則會報如下錯誤
              [root@localhost ~]# docker push ivictor/centos:v1
              The push refers to a repository [docker.io/ivictor/centos] (len: 1)
              unauthorized: access to the requested resource is not authorized

    rename Rename a container --更改容器的名字

    restart Restart a running container 
              --重啓容器

    rm Remove one or more containers 
              --刪除容器,注意,不能夠刪除一個運行中的容器,必須先用docker stop或docker kill使其中止。
              固然能夠強制刪除,必須加-f參數
              若是要一次性刪除全部容器,可以使用 docker rm -f `docker ps -a -q`,其中,-q指的是隻列出容器的ID

    rmi Remove one or more images  
              --刪除鏡像

    run Run a command in a new container   
              --讓建立的容器馬上進入運行狀態,該命令等同於docker create建立容器後再使用docker start啓動容器

    save Save an image(s) to a tar archive --將鏡像打包,與上面的load命令相對應
              譬如:
              docker save -o nginx.tar nginx

    search Search the Docker Hub for images   
              --從Docker Hub中搜索鏡像 
    start Start one or more stopped containers --啓動容器

    stats Display a live stream of container(s) resource usage statistics --動態顯示容器的資源消耗狀況,包括:CPU、內存、網絡I/O

    stop Stop a running container 
              --中止一個運行的容器

    tag Tag an image into a repository --對鏡像進行重命名

    top Display the running processes of a container --查看容器中正在運行的進程

    unpause Unpause all processes within a container --恢復容器內暫停的進程,與pause參數相對應

    version Show the Docker version information 
              --查看docker的版本

    wait Block until a container stops, then print its exit code --捕捉容器中止時的退出碼
              執行此命令後,該命令會「hang」在當前終端,直到容器中止,此時,會打印出容器的退出碼。

Docker optionmysql

Usage of docker:
  --api-enable-cors=false                Enable CORS headers in the remote API                      # 遠程 API 中開啓 CORS 頭
  -b, --bridge=""                        Attach containers to a pre-existing network bridge         # 橋接網絡
                                           use 'none' to disable container networking
  --bip=""                               Use this CIDR notation address for the network bridge's IP, not compatible with -b
                                         # 和 -b 選項不兼容,具體沒有測試過
  -d, --daemon=false                     Enable daemon mode                                         # daemon 模式
  -D, --debug=false                      Enable debug mode                                          # debug 模式
  --dns=[]                               Force docker to use specific DNS servers                   # 強制 docker 使用指定 dns 服務器
  --dns-search=[]                        Force Docker to use specific DNS search domains            # 強制 docker 使用指定 dns 搜索域
  -e, --exec-driver="native"             Force the docker runtime to use a specific exec driver     # 強制 docker 運行時使用指定執行驅動器
  --fixed-cidr=""                        IPv4 subnet for fixed IPs (ex: 10.20.0.0/16)
                                           this subnet must be nested in the bridge subnet (which is defined by -b or --bip)
  -G, --group="docker"                   Group to assign the unix socket specified by -H when running in daemon mode
                                           use '' (the empty string) to disable setting of a group
  -g, --graph="/var/lib/docker"          Path to use as the root of the docker runtime              # 容器運行的根目錄路徑
  -H, --host=[]                          The socket(s) to bind to in daemon mode                    # daemon 模式下 docker 指定綁定方式[tcp or 本地 socket]
                                           specified using one or more tcp://host:port, unix:///path/to/socket, fd://* or fd://socketfd.
  --icc=true                             Enable inter-container communication                       # 跨容器通訊
  --insecure-registry=[]                 Enable insecure communication with specified registries (no certificate verification for HTTPS and enable HTTP fallback) (e.g., localhost:5000 or 10.20.0.0/16)
  --ip="0.0.0.0"                         Default IP address to use when binding container ports     # 指定監聽地址,默認全部 ip
  --ip-forward=true                      Enable net.ipv4.ip_forward                                 # 開啓轉發
  --ip-masq=true                         Enable IP masquerading for bridge's IP range
  --iptables=true                        Enable Docker's addition of iptables rules                 # 添加對應 iptables 規則
  --mtu=0                                Set the containers network MTU                             # 設置網絡 mtu
                                           if no value is provided: default to the default route MTU or 1500 if no default route is available
  -p, --pidfile="/var/run/docker.pid"    Path to use for daemon PID file                            # 指定 pid 文件位置
  --registry-mirror=[]                   Specify a preferred Docker registry mirror                  
  -s, --storage-driver=""                Force the docker runtime to use a specific storage driver  # 強制 docker 運行時使用指定存儲驅動
  --selinux-enabled=false                Enable selinux support                                     # 開啓 selinux 支持
  --storage-opt=[]                       Set storage driver options                                 # 設置存儲驅動選項
  --tls=false                            Use TLS; implied by tls-verify flags                       # 開啓 tls
  --tlscacert="/root/.docker/ca.pem"     Trust only remotes providing a certificate signed by the CA given here
  --tlscert="/root/.docker/cert.pem"     Path to TLS certificate file                               # tls 證書文件位置
  --tlskey="/root/.docker/key.pem"       Path to TLS key file                                       # tls key 文件位置
  --tlsverify=false                      Use TLS and verify the remote (daemon: verify client, client: verify daemon) # 使用 tls 並確認遠程控制主機
  -v, --version=false                    Print version information and quit 

Docker run指令linux

[root@localhost ~]# docker run --help
 
: 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    標準輸入
--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,表示容器端口映射到宿主機的具體端口上,好比 -p 8080:80
-P, --publish=[] Publish a container's port(s) to the host      大寫P,表示容器端口映射到宿主機的任意一個端口上,好比 -P
--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 run命令時,Docker會啓動一個進程,併爲這個進程分配其獨佔的文件系統、網絡資源和以此進程爲根進程的進程組。
 
在容器啓動時,鏡像可能已經定義了要運行的二進制文件、暴露的網絡端口等,可是用戶能夠經過docker run命令從新定義(docker run能夠控制一個容器運行時的行爲,它能夠覆蓋docker build在構建鏡像時的一些默認配置),這也是爲何run命令相比於其它命令有如此多的參數的緣由。
使用方法:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
 
OPTIONS總起來講能夠分爲兩類:
a)設置運行方式:
   決定容器的運行方式,前臺執行仍是後臺執行;
   設置containerID;
   設置網絡參數;
   設置容器的CPU和內存參數;
   設置權限和LXC參數;
b)設置鏡像的默認資源,也就是說用戶可使用該命令來覆蓋在鏡像構建時的一些默認配置。
 
docker run [OPTIONS]可讓用戶徹底控制容器的生命週期,並容許用戶覆蓋執行docker build時所設定的參數,甚至也能夠修改自己由Docker所控制的內核級參數。
 
Operator exclusive options
當執行docker run時能夠設置如下參數:
  1.Detached vs Foreground
     Detached (-d)
       - Foreground
 
  2.Container Identification
     Name (--name)
       - PID Equivalent
 
  3.IPC Setting
   
  4.Network Settings
 
  5.Clean Up (--rm)
 
  6.Runtime Constraints on CPU and Memory
 
  7.Runtime Privilege, Linux Capabilities, and LXC Configuration
 
----------------------------------------------------------------------------------------------
1.Detached vs foreground
當咱們啓動一個容器時,首先須要肯定這個容器是運行在前臺仍是運行在後臺。
 
-d=false, 沒有附加標準輸入、輸出、錯誤 ---- 運行在後臺
 
Detached (-d)
docker run    -d
   -d=false
   --detach=false
 
那麼容器將會運行在後臺模式。
此時全部I/O數據只能經過網絡資源或者共享卷組來進行交互,由於容器再也不監聽你執行docker run的這個終端命令行窗口。
但你能夠經過執行docker attach來從新附着到該容器的回話中。
須要注意的是,容器運行在後臺模式下,是不能使用--rm選項的。
 
 
2.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默認會掛載全部標準數據流,包括輸入輸出和錯誤,你能夠單獨指定掛載哪一個標準流。
# docker run -a=[stdin, stdout] -i -t ubuntu /bin/bash
 
若是要進行交互式操做(例如Shell腳本),那咱們必須使用-i -t參數同容器進行數據交互。
可是當經過管道同容器進行交互時,就不須要使用-t參數,例以下面的命令:
# echo test | docker run -i busybox cat

Docker容器識別nginx

1.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
 
2.Image[:tag]
當一個鏡像的名稱不足以分辨這個鏡像所表明的含義時,你能夠經過tag將版本信息添加到run命令中,以執行特定版本的鏡像。例如:docker run ubuntu:14.04
[root@localhost ~]# docker images
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
docker.io/uifd/ui-for-docker   latest              312812aadc64        34 hours ago        8.096 MB
docker.io/nginx                latest              5e69fe4b3c31        5 days ago          182.5 MB
192.168.1.23:5000/tomcat7      latest              47c5123914a1        6 days ago          562.3 MB
docker.io/ubuntu               latest              0ef2e08ed3fa        4 weeks ago         130 MB
docker.io/centos               latest              67591570dd29        3 months ago        191.8 MB
docker.io/tomcat               latest              ebb17717bed4        5 months ago        355.4 MB
 
3.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
 
##在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來關閉網絡接口,此時將關閉全部網絡數據的輸入輸出,你只能經過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容器。
若是另一個容器須要複用這個網絡堆棧, 則須要以下操做:
# docker run -d --name redis example/redis --bind 127.0.0.1
 
//use the redis container's network stack to access localhost
# 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
默認狀況下,每一個容器在退出時,它的文件系統也會保存下來,這樣一方面調試會方便些,由於你能夠經過查看日誌等方式來肯定最終狀態。
另一方面,你也能夠保存容器所產生的數據。
可是當你僅僅須要短暫的運行一個容器,而且這些數據不須要保存,你可能就但願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、C一、C2三個容器,使用-c=512啓動了C3容器。
這時,C0、C一、C2能夠100%的使用CPU資源(1024),但C3只能使用50%的CPU資源(512)
若是這個主機的操做系統是時序調度類型的,每一個CPU時間片是100微秒,那麼C0、C一、 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,你能夠控制這些權限。
# docker run --device=/dev/sda:/dev/xvdc --rm -it ubuntu fdisk  /dev/xvdc
Command (m for help): q
 
# 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
 
# docker run --device=/dev/sda:/dev/xvdc:w --rm -it ubuntu fdisk  /dev/xvdc
crash....
 
# 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以外的全部內核權限,那麼能夠執行下面的命令:
# docker run --cap-add=ALL --cap-drop=MKNOD ...
 
若是須要修改網絡接口數據,那麼就建議使用--cap-add=NET_ADMIN,而不是使用--privileged。
# run -t -i --rm  ubuntu:14.04 ip link add dummy0 type dummy
RTNETLINK answers: Operation not permitted
# run -t -i --rm --cap-add=NET_ADMIN ubuntu:14.04 ip link add dummy0 type dummy
 
若是要掛載一個FUSE文件系統,那麼就須要--cap-add和--device了。
若是Docker守護進程在啓動時選擇了lxclxc-driver(docker -d --exec-driver=lxc),那麼就可使用--lxc-conf來設定LXC參數。
但須要注意的是,將來主機上的Docker deamon有可能不會使用LXC,因此這些參數有可能會包含一些沒有實現的配置功能。
這意味着,用戶在操做這些參數時必需要十分熟悉LXC。
特別注意:當你使用--lxc-conf修改容器參數後,Docker deamon將再也不管理這些參數,那麼用戶必須自行進行管理。
好比說,你使用--lxc-conf修改了容器的IP地址,那麼在/etc/hosts裏面是不會自動體現的,須要你自行維護。
 
把當前用戶加入到docker用戶組中
usermod -a -G docker $USER
===============================
# 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
============================
 
# 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登陸容器
# docker run -it -u grid_hd ubuntu:hd-salve1
 
給目錄下的全部子目錄增長執行權限的腳本
#!/bin/bash
find /mnt/sda4/docker/aufs -type d | while read dir
do
    chmod +rx "$dir"
done
 
啓動一個docker容器在後臺運行
docker run -d IMAGE[:TAG] 命令
docker logs container_id ##打印該容器的輸出
[root@localhost ~]# docker run -d --name mytest docker.io/centos /bin/sh -c "while true; do echo hello world; sleep 2; done"
37738fe3d6f9ef26152cb25018df9528a89e7a07355493020e72f147a291cd17
[root@localhost ~]# docker logs mytest
hello world
hello world
hello world
hello world
 
docker attach container_id ##附加該容器的標準輸出到當前命令行
[root@localhost ~]# docker attach mytest
hello world
hello world
hello world
.......
此時,Ctrl+C退出container(容器消失),按ctrl-p ctrl-q能夠退出到宿主機,而保持container仍然在運行

---------------------------------------------------------------
另外,觀察如下幾點:
commit container只會pause住容器,這是爲了保證容器文件系統的一致性,但不會stop。若是你要對這個容器繼續作其餘修改:
    你能夠從新提交獲得新image2,刪除次新的image1
    也能夠關閉容器用新image1啓動,繼續修改,提交image2後刪除image1
    固然這樣會很痛苦,因此通常是採用Dockerfile來build獲得最終image,參考[]
雖然產生了一個新的image,而且你能夠看到大小有100MB,但從commit過程很快就能夠知道實際上它並無獨立佔用100MB的硬盤空間,而只是在舊鏡像的基礎上修改,它們共享大部分公共的"片"。
 
有四種不一樣的選項會影響容器守護進程的服務名稱:
1)-h HOSTNAME 或者 --hostname=HOSTNAME  --設置容器的主機名,僅本機可見。
這種方式是寫到/etc/hostname ,以及/etc/hosts 文件中,做爲容器主機IP的別名,而且將顯示在容器的bash中。
不過這種方式設置的主機名將不容易被容器以外可見。這將不會出如今 docker ps 或者 其餘的容器的/etc/hosts 文件中。
 
2)--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服務器去搜尋主機A的IP地址。
 
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文件一致。這些選項將修改默認的設置。

注意一點:當利用 docker run 來建立容器時,Docker 在後臺運行的標準操做包括:git

1)檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載
2)利用鏡像建立並啓動一個容器
3)分配一個文件系統,並在只讀的鏡像層外面掛載一層可讀寫層
4)從宿主主機配置的網橋接口中橋接一個虛擬接口到容器中去
5)從地址池配置一個 ip 地址給容器
6)執行用戶指定的應用程序
7)執行完畢後容器被終止

                                                                                                                                        

在ubuntu中安裝docker
# sudo apt-get install docker.io
  
查看docker的版本信息
# docker version
  
查看安裝docker的信息
# docker info
  
查看本機Docker中存在哪些鏡像
# docker images

-------------------------------------------------------
docker pull 拉取鏡像
docker push 推送指定鏡像
 
示例:
下載官方 ubuntu docker 鏡像,默認下載全部 ubuntu 官方庫鏡像
[root@localhost ~]# docker pull ubuntu
 
下載指定版本 ubuntu 官方鏡像
[root@localhost ~]# docker pull ubuntu:14.04
 
推送鏡像庫到私有源(可註冊 docker 官方帳戶,推送到官方自有帳戶)
[root@localhost ~]# docker push 192.168.0.100:5000/ubuntu
 
推送指定鏡像到私有源
[root@localhost ~]# docker push 192.168.0.100:5000/ubuntu:14.04

------------------------------------------------------
從 Docker Hub 搜索鏡像
# docker search ubuntu:14.04
示例:
查找star數至少爲10的ubuntu鏡像(默認是不加-s選項)
[root@localhost ~]# docker search -s 10 ubuntu
INDEX       NAME                                 DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/ubuntu                     Ubuntu is a Debian-based Linux operating s...   5682      [OK]      
docker.io   docker.io/rastasheep/ubuntu-sshd     Dockerized SSH service, built on top of of...   75                   [OK]
docker.io   docker.io/ubuntu-upstart             Upstart is an event-based replacement for ...   70        [OK]      
docker.io   docker.io/consol/ubuntu-xfce-vnc     Ubuntu container with "headless" VNC sessi...   45                   [OK]
docker.io   docker.io/ubuntu-debootstrap         debootstrap --variant=minbase --components...   28        [OK]      
docker.io   docker.io/torusware/speedus-ubuntu   Always updated official Ubuntu docker imag...   27                   [OK]
docker.io   docker.io/nickistre/ubuntu-lamp      LAMP server on Ubuntu                           16                   [OK]
docker.io   docker.io/nuagebec/ubuntu            Simple always updated Ubuntu docker images...   16                   [OK]
-------------------------------------------------------
 
顯示一個鏡像的歷史
# docker history birdben/ubuntu:v1
  
列出一個容器裏面被改變的文件或者目
# docker diff birdben/ubuntu:v1
  
從一個容器中取日誌
# docker logs birdben/ubuntu:v1
  
顯示一個運行的容器裏面的進程信息
# docker top birdben/ubuntu:v1
  
從容器裏面拷貝文件/目錄到本地一個路徑
# docker cp ID:/container_path to_path
--------------------------------------------------------------------------------------------
查看容器的root用戶密碼
# docker logs <容器名orID> 2>&1 | grep '^User: ' | tail -n1
由於Docker容器啓動時的root用戶的密碼是隨機分配的。因此,經過這種方式就能夠獲得redmine容器的root用戶的密碼了。
  
查看容器日誌
# docker logs -f <容器名orID>
-----------------------------------------------------------------------------------
運行一個新容器,同時爲它命名、端口映射、文件夾映射。以redmine鏡像爲例
# docker run --name redmine -p 9003:80 -p 9023:22 -d -v /var/redmine/files:/redmine/files -v /var/redmine/mysql:/var/lib/mysql sameersbn/redmine
  
一個容器鏈接到另外一個容器
# docker run -i -t --name sonar -d -link mmysql:db   tpires/sonar-server sonar
容器鏈接到mmysql容器,並將mmysql容器重命名爲db。這樣,sonar容器就可使用db的相關的環境變量了。

檢查某一特定容器可使用docker inspect命令,後面跟容器的名稱或惟一ID。
Docker自動建立的容器名稱一樣是不方便記憶的,因此最好在運行容器時使用--name參數爲其指定一個名稱,命令格式爲docker run --name=<yourname>。
# docker inspect App_Container

使用logs命令查看守護式容器
能夠經過使用docker logs命令來查看容器的運行日誌,其中--tail選項能夠指定查看最後幾條日誌,而-t選項則能夠對日誌條目附加時間戳。使用-f選項能夠跟蹤日誌的輸出,直到手動中止。
docker logs [OPTIONS] CONTAINER
# docker logs App_Container

查看運行中容器內的進程
docker top CONTAINER [ps OPTIONS]
# docker top App_Container

構建本身的鏡像
# docker build -t <鏡像名> <Dockerfile路徑>
如Dockerfile在當前路徑:
# docker build -t xx/gitlab .
  
從新查看container的stdout
# 啓動top命令,後臺運行
$ ID=$(sudo docker run -d ubuntu /usr/bin/top -b)
# 獲取正在running的container的輸出
$ sudo docker attach $ID
top - 02:05:52 up  3:05,  0 users,  load average: 0.01, 0.02, 0.05
Tasks:   1 total,   1 running,   0 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.1%us,  0.2%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:    373572k total,   355560k used,    18012k free,    27872k buffers
Swap:   786428k total,        0k used,   786428k free,   221740k cached
^C$
$ sudo docker stop $ID
  
後臺運行(-d)、並暴露端口(-p)
# docker run -d -p 127.0.0.1:33301:22 centos6-ssh
  
從Container中拷貝文件出來
# sudo docker cp 7bb0e258aefe:/etc/debian_version .
拷貝7bb0e258aefe中的/etc/debian_version到當前目錄下。
注意:只要7bb0e258aefe沒有被刪除,文件命名空間就還在,能夠放心的把exit狀態的container的文件拷貝出來

列出當前全部正在運行的容器web

# docker ps
# docker ps -a   爲查看全部的容器,包括已經中止的。
# docker ps -q   查找已運行的docker容器的ID
# docker ps -a -q  查找全部的docker容器的ID
# docker ps -l    列出最近一次啓動的容器

查看容器的相關信息
# docker inspect CONTAINER_IDredis

顯示容器IP地址和端口號,若是輸出是空的說明沒有配置IP地址(不一樣的Docker容器能夠經過此IP地址互相訪問)
# docker inspect --format='{{.NetworkSettings.IPAddress}}' CONTAINER_IDsql

保存對容器的修改
# docker commit -m "Added ssh from ubuntu14.04" -a "birdben" 6s56d43f627f3 birdben/ubuntu:v1
參數:
-m參數用來來指定提交的說明信息;
-a能夠指定用戶信息的;
6s56d43f627f3表明的時容器的id;
birdben/ubuntu:v1指定目標鏡像的用戶名、倉庫名和 tag 信息。

限制docker容器日誌文件的大小
啓動容器時,能夠經過參數設置日誌文件的大小、日誌文件的格式。
# docker run -it --log-opt max-size=10m --log-opt max-file=3 centos

構建一個容器
# docker build -t="birdben/ubuntu:v1" .
參數:
-t爲構建的鏡像制定一個標籤,便於記憶/索引等
. 指定Dockerfile文件在當前目錄下,也能夠替換爲一個具體的 Dockerfile 的路徑。

在docker中運行ubuntu鏡像
# docker run <相關參數> <鏡像 ID> <初始命令>

守護模式啓動
# docker run -it ubuntu:14.04

交互模式啓動
# docker run -it ubuntu:14.04 /bin/bash

指定端口號啓動
# docker run -p 80:80 birdben/ubuntu:v1

指定配置啓動
# sudo docker run -d -p 10.211.55.4:9999:22 birdben/ubuntu:v1 '/usr/sbin/sshd' -D

參數:
-d:表示以「守護模式」執行,日誌不會出如今輸出終端上。
-i:表示以「交互模式」運行容器,-i 則讓容器的標準輸入保持打開
-t:表示容器啓動後會進入其命令行,-t 選項讓Docker分配一個僞終端(pseudo-tty)並綁定到容器的標準輸入上
-v:表示須要將本地哪一個目錄掛載到容器中,格式:-v <宿主機目錄>:<容器目錄>,-v 標記來建立一個數據卷並掛載到容器裏。在一次 run 中屢次使用能夠掛載多個數據卷。
-p:表示宿主機與容器的端口映射,此時將容器內部的 22 端口映射爲宿主機的 9999 端口,這樣就向外界暴露了 9999 端口,可經過 Docker 網橋來訪問容器內部的 22 端口了。
注意:
這裏使用的是宿主機的 IP 地址:10.211.55.4,與對外暴露的端口號 9999,它映射容器內部的端口號 22。ssh外部須要訪問:ssh root@10.211.55.4 -p 9999
不必定要使用「鏡像 ID」,也可使用「倉庫名:標籤名」

根據鏡像啓動容器的時候,若是鏡像的TAG是latest,那麼就直接跟鏡像名就好了;若是TAG不是latest,那麼鏡像後面要跟上這個TAG標識。以下:

[root@linux-node2 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              0ef2e08ed3fa        2 weeks ago         130 MB
centos7             7.3.1611            d5ebea14da54        3 weeks ago         311 MB

因爲ubuntu鏡像的TAG標識是latest,那麼容器啓動的時候,鏡像後面的TAG信息能夠省略。
[root@linux-node2 ~]# docker run -i -t ubuntu /bin/bash 

可是centos7鏡像的TAG標識不是latest,因此容器啓動的時候必需要跟上這個TAG信息。
[root@linux-node2 ~]# docker run -i -t centos7:7.3.1611 /bin/bash 
[root@2ba57568e836 /]# cat /etc/redhat-release 
CentOS Linux release 7.3.1611 (Core)

不跟TAG的話,就會報錯
[root@linux-node2 ~]# docker run -i -t centos7 /bin/bash 
Unable to find image 'centos7:latest' locally
Pulling repository docker.io/library/centos7
docker: Error: image library/centos7:latest not found.
See 'docker run --help'.

docker運行一個容器必須是基於鏡像來進行的,一旦容器啓動了,咱們就能夠登陸到容器中,安裝本身所需的軟件或應用程序。
啓動容器的命令中必須跟一個鏡像,啓動容器後執行的命令必須放在鏡像後面,以下,/bin/bash必須放在鏡像名稱的後面:

[root@linux-node2 ~]# docker run -i -t daocloud.io/library/ubuntu /bin/bash
root@a7b997da8ba3:/# cat /etc/issue
Ubuntu 16.04.1 LTS \n \l
 
root@a7b997da8ba3:/# [root@linux-node2 ~]# docker run -i -t ubuntu /bin/bash
root@d96c6b85cace:/# cat /etc/issue
Ubuntu 16.04.1 LTS \n \l
root@d96c6b85cace:/#
 
[root@linux-node2 ~]# docker run -t -i -v /home/wangshibo/docker:/home/mycontainer:rw -p 8888:8080 centos /bin/bash
[root@8f65f826ad80 /]#
 
[root@linux-node2 ~]# docker run -i -t centos7:7.3.1611 /bin/bash
[root@4941394a1e92 /]# cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)
 
[root@linux-node2 ~]# docker run -i -t centos:centos6 /bin/bash
[root@357eaa658c87 /]# cat /etc/redhat-release
CentOS release 6.8 (Final)

注意:建立應用容器時,通常作端口映射,爲了讓外部可以訪問這些容器裏的應用。能夠經過-P或-p參數來指定端口映射

1)當使用-p標記時,能夠指定端口映射,即容器端口映射到宿主機的對應端口。能夠用多個-p指定多個端口映射關係。以下:
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/redis     latest              e4a35914679d        2 weeks ago         182.9 MB

[root@localhost ~]# docker run --name myredis -p 63799:6379 -d docker.io/redis
f5d5ff51ace01c5f26fcd65a6ca4853f8556a333c812576123ed71fd3d405737

[root@localhost ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
f5d5ff51ace0        docker.io/redis     "docker-entrypoint.sh"   6 seconds ago       Up 5 seconds        0.0.0.0:63799->6379/tcp   myredis

[root@localhost ~]# docker run --rm -it --name myredis2 --link myredis:redisdb docker.io/redis /bin/bash
root@16b660ff9f65:/data# redis-cli -h redisdb -p 6379
redisdb:6379> ping
PONG
redisdb:6379> set test linux
OK
redisdb:6379>

在別的機器上經過訪問本機的63799端口鏈接這個容器的redis
[root@linux-node2 ~]# redis-cli -h 192.168.1.23 -p 63799
192.168.1.23:63799> get test
"linux"
192.168.1.23:63799> 

------------------------------------------------------------------------------------------
可使用多個-p映射多個端口
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos7             7.3.1611            d5ebea14da54        3 weeks ago         311 MB
 
[root@localhost ~]# docker run -i -t -p 20022:22 -p 8088:80 centos7:7.3.1611 /bin/bash
[root@1a7a949e2f41 /]#
------------------------------------------------------------------------------------------

2)當使用-P標記時,Docker 會隨機映射一個 49000~49900 的端口到內部容器開放的網絡端口。以下:
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/redis     latest              e4a35914679d        2 weeks ago         182.9 MB

[root@localhost ~]# docker run --name myredis -P -d docker.io/redis
805d0e21e531885aad61d3e82395210b50621f1991ec4b7f9a0e25c815cc0272

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
805d0e21e531        docker.io/redis     "docker-entrypoint.sh"   4 seconds ago       Up 3 seconds        0.0.0.0:32768->6379/tcp   myredis

從上面的結果中能夠看出,本地主機的32768端口被映射到了redis容器的6379端口上,也就是說訪問本機的32768端口便可訪問容器內redis端口。

測試看下,登錄redis容器,隨意寫個數據
[root@localhost ~]# docker run --rm -it --name myredis2 --link myredis:redisdb docker.io/redis /bin/bash
root@be44d955d6f4:/data# redis-cli -h redisdb -p 6379
redisdb:6379> set wangshibo huanqiu
OK
redisdb:6379> 

在別的機器上經過上面映射的端口32768鏈接這個容器的redis
[root@linux-node2 ~]# redis-cli -h 192.168.1.23 -p 32768
192.168.1.23:32768> get wangshibo
"huanqiu"

start 啓動容器(多個容器,後面就跟多個容器id)
# docker start 117843ade696117843ade696

stop 中止正在運行的容器(多個容器,後面就跟多個容器id)(在容器裏面按ctrl+d組合鍵,也會退出當前容器)
# docker stop 117843ade696117843ade696

restart 重啓容器(多個容器,後面就跟多個容器id)
# docker restart 117843ade696117843ade696

刪除容器和鏡像

rm 刪除容器(刪除一個或多個,多個之間用空格隔開)
# docker rm 117843ade696117843ade696

殺死全部running狀態的容器
# docker kill $(docker ps -a -q)
# docker rm $(docker ps -a -q)
-----------------------------------------------------------------------------------
rmi 刪除鏡像(刪除一個或多個,多個之間用空格隔開)
# docker rmi ed9c93747fe1Deleted

刪除全部未打tag的鏡像
# docker rmi $(docker images -q | awk '/^<none>/ { print $3 }')

刪除全部鏡像
# docker rmi $(docker images -q)

根據格式刪除全部鏡像
# docker rm $(docker ps -qf status=exited)

登陸Docker Hub中心
# docker login

發佈上傳image(push)
# docker push birdben/ubuntu:v1

Docker本機和容器之間的文件拷貝:

1)將本機的/root/test.file文件傳輸到ID爲7bb0e258aefe的容器裏的/mnt/wang目錄下
# docker cp /root/test.file 7bb0e258aefe:/mnt/wang/

2)拷貝ID爲7bb0e258aefe的容器裏的/var/id.list文件到本機的/opt下
# docker cp  7bb0e258aefe:/var/id.list /opt/
實例以下:
[root@linux-node2 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
c7bd050b0a23        centos              "/bin/bash"         2 hours ago         Up 2 hours                                   small_almeida
eaf66f1e43ab        centos              "/sbin/init"        7 weeks ago         Up 7 weeks          0.0.0.0:8888->8080/tcp   hungry_khorana
 
[root@linux-node2 ~]# docker exec -it eaf66f1e43ab /bin/bash
[root@eaf66f1e43ab /]# cd /mnt/
[root@eaf66f1e43ab mnt]# ls
[root@eaf66f1e43ab mnt]# mkdir test-haha
[root@eaf66f1e43ab mnt]# cd test-haha
[root@eaf66f1e43ab test-haha]# touch a b c
[root@eaf66f1e43ab test-haha]# pwd
/mnt/test-haha
[root@eaf66f1e43ab test-haha]# ls
a  b  c
[root@eaf66f1e43ab test-haha]#
 
而後拷貝容器文件出來
[root@linux-node2 ~]# docker cp eaf66f1e43ab:/mnt/test-haha /opt/
[root@linux-node2 ~]# ls /opt/test-haha/
a  b  c

鏡像的存出和載入(能夠將本機下載的鏡像導出,而後將導出文件上傳到別的機器上,在別的機器上進行鏡像導入)

1)若是要導出鏡像到本地文件,可使用 docker save命令。
拉取鏡像
[root@linux-node2 ~]# docker pull ubuntu:14.04
[root@linux-node2 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu              14.04               c4ff7513909d        5 weeks ago         225.4 MB

導出鏡像
[root@linux-node2 ~]# docker save ubuntu:14.04 > /opt/ubuntu_14.04.tar.gz
或者:
[root@linux-node2 ~]# docker save -o /opt/ubuntu_14.04.tar.gz ubuntu:14.04

2)將上面的鏡像導出文件上傳到linux-node1機器上,而後在linux-node1機器上使用docker load命令載入這個鏡像
[root@linux-node1 ~]# docker load < /opt/ubuntu_14.04.tar.gz
或者:
[root@linux-node1 ~]# docker load --input ubuntu_14.04.tar

實例以下:
[root@linux-node2 opt]# docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
centos7                      7.3.1611            1d7e06aab5db        24 hours ago        264.7 MB
nginx                        1.9                 c8c29d842c09        9 months ago        182.7 MB
[root@linux-node2 opt]# docker save nginx:1.9 > /opt/nginx:1.9.tar.gz
[root@linux-node2 opt]# ls
nginx:1.9.tar.gz
[root@linux-node2 opt]# rsync -e "ssh -p22" -avpgolr /opt/nginx:1.9.tar.gz 192.168.1.23:/opt/
  
登錄192.168.1.23
[root@localhost ~]# cd /opt/
[root@localhost opt]# ls
nginx:1.9.tar.gz
[root@localhost opt]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/centos    latest              980e0e4c79ec        5 months ago        196.7 MB
docker.io/redis     2.8.19              dd9fe7db5236        22 months ago       110.7 MB
  
導入nginx鏡像
[root@localhost opt]# docker load < /opt/nginx:1.9.tar.gz          #或者使用"docker load -i /opt/nginx:1.9.tar.gz"
[root@localhost opt]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/centos    latest              980e0e4c79ec        5 months ago        196.7 MB
nginx               1.9                 c8c29d842c09        9 months ago        182.7 MB
docker.io/redis     2.8.19              dd9fe7db5236        22 months ago       110.7 MB

容器的導出和導入(能夠依據導出的容器快照導入爲鏡像,在本地或將容器快照文件上傳到別的機器上進行導入鏡像操做均可以)

1)導出容器
若是要導出本地某個容器,可使用 docker export 命令。
[root@linux-node2 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS                    NAMES
5243af7921c5        centos              "/bin/bash"              2 days ago          Exited (0) 5 seconds ago                            sharp_saha

[root@linux-node2 ~]# docker export 5243af7921c5 > /opt/centos.tar.gz
[root@linux-node2 ~]# ls /opt/
centos.tar.gz

這樣將導出上面的ID爲5243af7921c5的容器快照到本地的/opt/centos.tar.gz文件了。

2)導入容器快照
可使用 docker import 從容器快照文件中再導入爲鏡像

爲了測試效果,先刪除ID爲5243af7921c5的容器,再導入
[root@linux-node2 ~]# docker rm 5243af7921c5
5243af7921c5

[root@linux-node2 ~]# cat /opt/centos.tar.gz | docker import - test/centos:v1.0
sha256:d84d758c5cda4aced7cd24a4efefedb3d56076ae127133dac8ac79ca0bab3f3d
或者使用下面命令導入
[root@linux-node2 ~]# docker import /opt/centos.tar.gz test/centos:v1.0

[root@linux-node2 ~]# docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
test/centos                  v1.0                d84d758c5cda        5 seconds ago       191.8 MB

[root@linux-node2 ~]# docker run -t -i test/centos:v1.0 /bin/bash
[root@5056db543cc2 /]# 

[root@linux-node2 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
5056db543cc2        test/centos:v1.0    "/bin/bash"         19 seconds ago      Up 18 seconds                                tiny_dijkstra

這個ID爲5056db543cc2的新容器既是導入的上面的容器快照建立的

舒適提示:
用戶既可使用docker load來導入鏡像存儲文件到本地鏡像庫,也可使用docker import 來導入一個容器快照到本地鏡像庫。
這二者的區別在於容器快照文件將丟棄全部的歷史記錄和元數據信息(即僅保存容器當時的快照狀態),而鏡像存儲文件將保存完整記錄,體積也要大。
此外,從容器快照文件導入時能夠從新指定標籤等元數據信息。

好比說我在A機器上有個nginx容器,如今要在B機器上啓動一個如出一轍的nginx容器(或者說將A機器上的nginx容器拿到B機器上),方法有下面兩種:

1)將A機器上將nginx容器提交爲新的鏡像(docker commit),而後將這個鏡像導出並上傳到B機器上,最後在B機器上導入這個新鏡像並依據這個鏡像啓動容器,這個就和A機器上的nginx容器同樣了。
2)將A機器上的nginx容器作快照,而後從這個快照文件中導入爲鏡像,將這個鏡像上傳到B機器上,最後在B機器上導入這個新鏡像並依據它啓動容器。

在運行狀態中的容器內再次啓動新的進程(docker exec)

雖然Docker鼓勵咱們一個容器只運行一個服務,可是當咱們須要對運行中的容器進行監控、維護和管理時,一般須要爲運行中的容器啓動新進程。
# docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
這條命令與docker run極爲類似,也可使用-i、-t和-d等參數。
[root@linux-node2 ~]# docker exec -i -t App_Container /bin/bash

示例以下:
建立一個tomcat容器(建立容器後,啓動容器的/bin/bash進程)
[root@localhost ~]# docker run -t -i -d --name=tomcat --hostname=wangshibo --dns=8.8.8.8 -p 8888:8080 tomcat7 /bin/bash
a5ab82945a88d16c51941c7fbc1e3f581823099835f96423c4fd19b44841b31c
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
a5ab82945a88        tomcat7             "/bin/bash"         3 seconds ago       Up 2 seconds        0.0.0.0:8888->8080/tcp   tomcat

在上面tomcat容器已經啓動的狀態下,再在宿主機上啓動該容器中新的進程。(固然也能夠直接登錄容器內啓動這個進程)
[root@localhost ~]# docker exec tomcat /usr/local/tomcat7/bin/startup.sh     //若是啓動後出現卡的狀況,就ctrl+c,不影響啓動結果。
Tomcat started.

登錄到該容器內驗證,發現tomcat進程已經經過上面的docker exec啓動了
[root@localhost ~]# docker start tomcat
tomcat
[root@localhost ~]# docker attach tomcat
[root@wangshibo /]# ps -ef|grep tomcat
root        40     1 19 09:17 ?        00:00:08 java -Djava.util.logging.config.file=/usr/local/tomcat7/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/local/tomcat7/endorsed -classpath /usr/local/tomcat7/bin/bootstrap.jar:/usr/local/tomcat7/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat7 -Dcatalina.home=/usr/local/tomcat7 -Djava.io.tmpdir=/usr/local/tomcat7/temp org.apache.catalina.startup.Bootstrap start
root        77     1  0 09:17 ?        00:00:00 grep --color=auto tomcat

-----------------------------------------------------------------------------------------------------------
通常來講,容器建立後的主機名都是隨機生成的一串字符。DNS也是默認和宿主機同樣的(/etc/resolv.conf)
容器建立後,登錄容器是沒法修改主機名或DNS配置的,會報錯說:須要root權限才能修改!
其實容器的主機名或DNS配置是能夠在容器建立的時候手動指定的:

1)建立容器時使用"-h HOSTNAME" 或者 "--hostname=HOSTNAME"參數就能夠指定容器的主機名。
   設定容器的主機名,它會被寫到容器內的 /etc/hostname 和 /etc/hosts。但它在容器外部看不到,既不會在 docker ps 中顯示,也不會在其餘的容器的 /etc/hosts 看到。
2)建立容器時使用"--dns=IP_ADDRESS"參數就能夠指定容器的DNS
   添加 DNS 服務器到容器的 /etc/resolv.conf 中,讓容器用這個服務器來解析全部不在 /etc/hosts 中的主機名。
3)建立容器時使用"--link=CONTAINER_NAME:ALIAS"參數
   選項會在建立容器的時候,添加一個其餘容器的主機名到 /etc/hosts 文件中,讓新容器的進程可使用主機名 ALIAS 就能夠鏈接它。

實例:
手動設置主機名和DNS
[root@localhost ~]# docker run -t -i -d --name=tomcat --hostname=wangshibo --dns=8.8.8.8 -p 8888:8080 tomcat7 /bin/bash
4ccc7415aab8645fa2f76cac5b484c5e7195bec4da355069df4e7df62bd53e2f
[root@localhost ~]# docker attach tomcat
[root@wangshibo /]# cat /etc/hostname 
wangshibo
[root@wangshibo /]# cat /etc/hosts   
127.0.0.1   localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2  wangshibo
[root@wangshibo /]# cat /etc/resolv.conf 
search localdomain
nameserver 8.8.8.8
[root@wangshibo /]# ping www.baidu.com
PING www.a.shifen.com (14.215.177.38) 56(84) bytes of data.
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=1 ttl=51 time=36.0 ms
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=2 ttl=51 time=35.9 ms
......
[root@wangshibo /]# /usr/local/tomcat7/bin/startup.sh 
Using CATALINA_BASE:   /usr/local/tomcat7
Using CATALINA_HOME:   /usr/local/tomcat7
Using CATALINA_TMPDIR: /usr/local/tomcat7/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/local/tomcat7/bin/bootstrap.jar:/usr/local/tomcat7/bin/tomcat-juli.jar
Tomcat started.
[root@wangshibo /]# yum install -y lsof
[root@wangshibo /]# yum install -y net-tools
[root@wangshibo /]# lsof -i:8080
COMMAND PID USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
java     35 root   44u  IPv6 30851404      0t0  TCP *:webcache (LISTEN)
[root@wangshibo /]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 0.0.0.0
        inet6 fe80::42:acff:fe11:2  prefixlen 64  scopeid 0x20<link>
        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)
        RX packets 149  bytes 660403 (644.9 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 108  bytes 7655 (7.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 0  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


作容器連接
[root@localhost ~]# docker run -t -i -d --name=my_tomcat --link tomcat:hahaha tomcat7 /bin/bash
996e16302d460c725f3685f98935fa3b61335ac19ccf2c4daf8615b492b1ac56
[root@localhost ~]# docker attach my_tomcat
[root@996e16302d46 /]# cat /etc/hosts
127.0.0.1   localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2  hahaha wangshibo 
172.17.0.3  996e16302d46

[root@996e16302d46 /]# yum install -y net-tools
[root@996e16302d46 /]# yum install -y telnet
[root@996e16302d46 /]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.3  netmask 255.255.0.0  broadcast 0.0.0.0
        inet6 fe80::42:acff:fe11:3  prefixlen 64  scopeid 0x20<link>
        ether 02:42:ac:11:00:03  txqueuelen 0  (Ethernet)
        RX packets 86  bytes 382330 (373.3 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 74  bytes 5338 (5.2 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


在本容器連接tomcat容器的8080端口,則可使用別名hahaha
[root@996e16302d46 /]# ping hahaha
PING hahaha (172.17.0.2) 56(84) bytes of data.
64 bytes from hahaha (172.17.0.2): icmp_seq=1 ttl=64 time=0.170 ms
64 bytes from hahaha (172.17.0.2): icmp_seq=2 ttl=64 time=0.053 ms

[root@996e16302d46 /]# telnet hahaha 8080
Trying 172.17.0.2...
Connected to hahaha.
Escape character is '^]'.

Docker容器登錄的方法:
具體參考:Docker容器學習梳理--容器登錄方法梳理(attach、exec、nsenter)

查看docker中對應容器的IP

命令格式:docker inspect 容器ID |grep IPAddress
  
好比查看ID爲b220fabf815a的容器的ip
[root@localhost ~]# docker inspect b220fabf815a|grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.4",
                    "IPAddress": "172.17.0.4",
 
或者使用"yum install net-tools",安裝後就可使用ifconfig命令查看ip了


=======================================================================================
準確查看docker容器的ip地址

[root@docker-test1 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
b5c97379265a        centos              "/bin/bash"         12 minutes ago      Up 11 minutes                           kevinmy

[root@docker-test1 ~]# docker inspect kevinmy
......

            "MacAddress": "02:42:ac:11:00:04",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "df0c8465aeb4663aa0abcaddc9c7ea205a7bbaa075e46db7476c85589471cfbc",
                    "EndpointID": "3d504eb397a27696857750bc2f5919faf4be8bb1947b10375bee55439f2d7ce4",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.4",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:04"
                }
            }
        }
    }
]

[root@docker-test1 ~]# docker inspect kevinmy|grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.4",
                    "IPAddress": "172.17.0.4",

[root@docker-test1 ~]# docker inspect kevinmy|grep IPAddress|grep [1-9]
            "IPAddress": "172.17.0.4",
                    "IPAddress": "172.17.0.4",

[root@docker-test1 ~]# docker inspect kevinmy|grep IPAddress|grep [1-9]|awk '{print $2}'
"172.17.0.4",
"172.17.0.4",

[root@docker-test1 ~]# docker inspect kevinmy|grep IPAddress|grep [1-9]|awk '{print $2}'|sort|uniq
"172.17.0.4",

[root@docker-test1 ~]# docker inspect kevinmy|grep IPAddress|grep [1-9]|awk '{print $2}'|sort|uniq|awk -F'"' '{print $2}'
172.17.0.4

docker inspect 命令:顯示更底層的容器或image信息(docker inspect images_id/container_id 查看鏡像或容器信息)

Usage: docker inspect CONTAINER|IMAGE [CONTAINER|IMAGE...]Return low-level information on a container or image -f,--format=""Format the output using the given go template.
默認返回一個json字符串,更具結構自行提取信息便可

docker inspect命令用於獲取容器/鏡像的元數據,其中-f參數能夠用於獲取指定的數據。不過不少用戶容易被該特性的語法搞暈,並不多有人能將它的優點發揮出來(大部分人都是經過 grep 來獲取指定數據,雖然有效但比較零散混亂)。本文將詳細介紹  -f 參數,並給出一些例子來講明如何使用它。

下面是針對ID爲b220fabf815a的容器的相關inspect命令
[root@localhost ~]# docker inspect b220fabf815a

顯示實例ip:
# docker inspect --format='{{.NetworkSettings.IPAddress}}' $INSTANCE_ID
[root@localhost ~]# docker inspect --format='{{.NetworkSettings.IPAddress}}' b220fabf815a
172.17.0.4

也能夠經過grep來獲取ip
[root@localhost ~]# docker inspect b220fabf815a|grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.4",
                    "IPAddress": "172.17.0.4",
                    
或者使用「yum install net-tools」,安裝後就可使用ifconfig命令查看ip了              

列出全部綁定的端口:
# docker inspect --format='{{range $p, $conf := .NetworkSettings.Ports}} {{$p}} -> {{(index $conf 0).HostPort}} {{end}}' $INSTANCE_ID
[root@localhost ~]# docker inspect --format='{{range $p, $conf := .NetworkSettings.Ports}} {{$p}} -> {{(index $conf 0).HostPort}} {{end}}' b220fabf815a
 22/tcp -> 20020 

找出特殊的端口映射:
好比找出容器裏22端口所映射的docker本機的端口:
# docker inspect --format='{{(index (index .NetworkSettings.Ports "22/tcp") 0).HostPort}}' $INSTANCE_ID
[root@localhost ~]# docker inspect --format='{{(index (index .NetworkSettings.Ports "22/tcp") 0).HostPort}}' b220fabf815a
20020

特別注意一個細節:

1)ubuntu14下的docker是沒有service服務。去除每次sudo運行docker命令,須要添加組:
# Add the docker group if it doesn't already exist.
$ sudo groupadd docker
#改完後須要從新登錄用戶
$ sudo gpasswd -a ${USER} docker

2)ubuntu14的febootstrap沒有-i命令

3)Dockerfile中的EXPOSE、docker run --expose、docker run -p之間的區別
Dockerfile的EXPOSE至關於docker run --expose,提供container之間的端口訪問。docker run -p容許container外部主機訪問container的端口

---------------------------------------------------沒法刪除狀態爲Dead的容器---------------------------------------------------
docker中有兩個status爲dead的容器,刪除時報錯以下:
Error response from daemon: Driver devicemapper failed to remove root filesystem 33ddd2513fc3cb732fa02e912be1927929d8d028abefa945d8a3984d700a4d74: Device is Busy

解決辦法:
1)看容器進程是否已經殺掉。沒有的話,能夠手動殺死。
2)mount -l看是否是該容器的路徑還在掛載狀態。是的話,umount掉。
3)而後再次嘗試docker rm container_id
儘可能不要手動去移除dm和docker裏面container的相關文件,以避免形成垃圾數據。
4)嘗試docker rm -f <container-id>,強制刪除
這樣能夠刪除掉docker daemon中的container信息(可是已經建立的dm仍是ACTIVE的,因此還要再去把dm給刪除了)

[root@linux-node2 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
c7bd050b0a23        centos              "/bin/bash"         About an hour ago   Up About an hour                             small_almeida
33ddd2513fc3        centos              "/bin/bash"         7 weeks ago         Dead                                         App_Container
eaf66f1e43ab        centos              "/sbin/init"        7 weeks ago         Up 7 weeks          0.0.0.0:8888->8080/tcp   hungry_khorana
[root@linux-node2 ~]# docker rm -f 33ddd2513fc3
Error response from daemon: Driver devicemapper failed to remove root filesystem 33ddd2513fc3cb732fa02e912be1927929d8d028abefa945d8a3984d700a4d74: Device is Busy
 
加上-f參數後,雖然刪除時仍是報錯,然是container信息已經刪除了
[root@linux-node2 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
c7bd050b0a23        centos              "/bin/bash"         About an hour ago   Up About an hour                             small_almeida
eaf66f1e43ab        centos              "/sbin/init"        7 weeks ago         Up 7 weeks          0.0.0.0:8888->8080/tcp   hungry_khorana

---------------------------------------------------容器啓動失敗錯誤1---------------------------------------------------

docker: Error response from daemon: failed to create endpoint mosredis on network bridge: iptables failed: iptables --wait -t filter -A DOCKER ! -i docker0 -o docker0 -p tcp -d 172.17.0.6  -j ACCEPT: iptables: No chain/target/match by that name.
 (exit status 1).
 
解決辦法:
通常來講,重啓docker服務,便可解決這個問題。
[root@localhost ~]# systemctl restart docker
[root@localhost ~]#
----------------------------------
若是重啓docker服務解決不了,那麼以下操做:
[root@localhost ~]# pkill docker
[root@localhost ~]# iptables -t nat -F
[root@localhost ~]# ifconfig docker0 down
[root@localhost ~]# brctl delbr docker0

---------------------------------------------------容器啓動失敗錯誤2---------------------------------------------------

docker: Error response from daemon: Cannot start container b0a845a3dedeac7b46002d1c8514077309d88dcc0667b7080bc1ab67d70eb167: [9] System error: SELinux policy denies access..
如上出現上面的報錯,這是因爲selinux形成的!須要關閉selinux,以下:
[root@localhost ~]# setenforce 0
[root@localhost ~]# getenforce
Permissive

---------------------------------------------------容器yum不能使用--------------------------------------------------

容器啓動後登錄進去,發現yum不能用,報錯以下:
[root@5e91e12186e1 /]# yum list
........
yum-config-manager --disable <repoid>
........
yum-config-manager --save --setopt=<repoid>.skip_if_unavailable=true

解決辦法:(再不行,就重啓下docker服務,而後登錄容器試試)
先保證容器能正常聯網(ping www.baidu.com試試)
# yum clean all 
# yum makecache

==============關於docker容器和鏡像以及文件的幾個轉化關係==============

容器轉成鏡像:
# docker commit <CONTAINER ID> imagename01

容器轉成文件:
# docker export <CONTAINER ID> > /home/export.tar

鏡像轉成文件:
# docker save imagename01 > /home/save.tar

注:通常狀況下,save.tar比export.tar大一點點而已,export比較小,由於它丟失了歷史和數據元metadata

文件轉成鏡像:
# cat /home/export.tar | docker import - imagename02:latest

save.tar文件轉成鏡像:
# docker load < /home/save.tar

查看轉成的鏡像:
# docker images

注意:這裏一個鏡像通過n次轉化以後,能夠用sudo docker images --tree查看歷史,用docker tag <LAYER ID> <IMAGE NAME>能夠回到某個層(只針對save命令能夠回到某個層!)

-------------------------------------基於centos7的docker容器出現的一個bug--------------------------------------

centos7下部署的docker容器中啓動服務,報錯以下:
[root@a3c8baf6961e .ssh]# systemctl restart sshd.service
Failed to get D-Bus connection: Operation not permitted

這是centos7容器裏面出現的一個BUG!
即centos7鏡像建立的容器裏面安裝服務後,不能用systemctl/service啓動服務,centos6的容器裏沒有這個坑!
能夠經過使用其餘的方式啓動或者換用centos6的鏡像來避免這個錯誤。

解決方案以下:
緣由是dbus-daemon沒能啓動。其實systemctl並非不可使用,能夠將你的CMD設置爲/usr/sbin/init便可。
這樣就會自動將dbus等服務啓動起來。即採用 /usr/sbin/init自動啓動dbus daemon

即把以前的容器關閉並刪除(docker stop container-id),而後從新啓動容器,注意:
啓動時必定要加上參數--privileged和/sbin/init,以下:

[root@localhost ~]#  docker run --privileged -i -t centos7:7.3.1611 /sbin/init      
上面的容器啓動後,會一直在卡着的狀態中,先不用管,打開另外一個終端窗口,查看容器

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
af40bd07fa0f        centos7:7.3.1611    "/sbin/init"        28 seconds ago      Up 28 seconds                                 nauseous_shirley
 
而後按照容器的ID進去,這個時候再根據/bin/bash進入容器(前面加exec -it參數),接着重啓ssh服務就ok了
[root@localhost ~]# docker exec -it af40bd07fa0f /bin/bash
[root@af40bd07fa0f /]# systemctl restart sshd.service
相關文章
相關標籤/搜索