天天看點

Docker 常用指令整理容器鏡像坑

容器

docker run ubuntu:18.04 echo hello docker

表示用18.04的ubuntu鏡像建立一個容器,用這個容器來執行echo指令

  • docker run -i -t ubuntu [bash]

    表示一個運作一個最新的ubuntu容器,并且進入到這個容器的bash中(不加i雖然可以進入bash,但是不可互動)。退出容器用

    exit

    ctrl+D

    (退出時會關閉&不删除容器)
  • docker run -i -t -d ubuntu

    容器背景運作,運作時的輸出不會出現在主控端的控制台上
  • docker run --name containerName -it ubuntu bash

    指定容器的名稱
  • docker ps

    檢視正在運作的容器
    • -a

      : 檢視所有容器,包括已經建立但是不在運作中的容器
  • docker logs <id/name>

    檢視背景運作的容器的輸出
  • docker start id/name

    啟動一個已經停止的容器
  • docker stop id/name

    停止一個容器
  • docker top name

    檢視容器内部運作的程序
  • docker inspect name

    檢視容器的配置和狀态

進入背景運作的容器

  • docker attach

    從容器中退出時,容器也會停止
  • docker exec

    不會導緻容器的停止
  • docker restart [-t seconds] id

    重新開機正在運作的容器,

    -t

    表示等待的時間(秒)

docker run -d --name containerTest3 ubuntu:18.04

docker run -itd --name containerTest2 ubuntu:18.04

效果不一樣,前者建立後就被停止了,後者在背景保持運作狀态

容器的導入和導出

導出容器的狀态,導入後變成鏡像,不會儲存原始鏡像的layer資訊。

導出容器

  • docker export containerid> ubuntu.tar

導入容器

  • cat ubuntu.tar | docker import - mysystem:mytag

    : 導入成了一個image,可以用

    docker images

    檢視,
  • docker import dockertest.tar -- centos:tag

  • docker import - 容器:tag < fileName.tar

    : windows下可以這樣導入
[[email protected] ~]$ cat containerTest2.tar | docker import - mysystem:tags
sha256:1c174e9fbdee72b5427701e22033105a2c41d626f418501497240902bc5667ac

[[email protected] ~]$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mysystem            tags                1c174e9fbdee        8 seconds ago       64.2MB
ubuntu              18.04               2eb2d388e1a2        6 days ago          64.2MB
nginx               latest              8cf1bfb43ff5        9 days ago          132MB
training/webapp     latest              6fae60ef3446        5 years ago         349MB
           

删除容器

删除容器時容器必須已經是關閉狀态

  • docker rm -f id

  • docker container prune

    清理掉所有終止狀态的容器

容器連接配接

端口映射

  • docker run -d -P training/webapp python app.py

    映射到主機的随機端口(大P)
  • docker run -d -p 5000:5000 training/webapp python app.py

    自行指定端口(小p)
  • docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py

    指定主機的網絡位址,将

    127.0.0.1:5001

    映射到容器的5000端口
  • docker port name [port]

    : 檢視映射關系
  • run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py

    綁定udp端口需要再端口後加上

    /udp

容器互聯

建立網絡

[[email protected] ~]$ docker network --help
Usage:  docker network COMMAND
Manage networks

Commands:
  connect     Connect a container to a network
  create      Create a network
  disconnect  Disconnect a container from a network
  inspect     Display detailed information on one or more networks
  ls          List networks
  prune       Remove all unused networks
  rm          Remove one or more networks
           
  • docker network create -d bridge test-net

    建立一個網絡
    • -d

      : 指定網絡類型,

      bridge、overlay

運作一個容器并連接配接到建立的

test-net

網絡:

  • docker run -itd --name netSlave1 --network testNet twilight/nginx:ali

打開新的終端,再運作一個容器并加入到 test-net 網絡:

  • docker run -itd --name netSlave2 --network testNet twilight/nginx:ali

安裝

ping

:

apt-get update
apt install iputils-ping
           

ping netSlave2

竟然直接ping了name(hostname是他的id, 他的hosts檔案中記錄了另一個容器的ip)

配置DNS

在主控端的 /etc/docker/daemon.json 檔案增加一下内容:

{
  "dns" : [
    "114.114.114.114",
    "8.8.8.8"
  ]
}
           

重新開機生效,DNS會被應用到所有容器上

docker run -it --rm ubuntu cat etc/resolv.conf
[email protected]:/# cat /etc/resolv.conf
search localdomain
nameserver 114.114.114.114
nameserver 8.8.8.8
           

手動指定容器的DNS:

docker run -it --hostname slavehostname --dns=114.114.114.114 ubuntu:18.04 /bin/bash
[[email protected] docker]# docker run -it --hostname slavehostname  --dns=114.114.114.114 ubuntu:18.04 /bin/bash
[email protected]:/# cat /etc/resolv.conf 
search localdomain
nameserver 114.114.114.114
           

參數說明:

  • -h HOSTNAME

    --hostname=HOSTNAME

    : 設定容器的主機名,它會被寫到容器内的

    /etc/hostname

    /etc/hosts

  • --dns=IP_ADDRESS

    : 添加 DNS 伺服器到容器的

    /etc/resolv.conf

    中,讓容器用這個伺服器來解析所有不在 /etc/hosts 中的主機名。
  • --dns-search=DOMAIN

    : 設定容器的搜尋域,當設定搜尋域為 .example.com 時,在搜尋一個名為 host 的主機時,DNS 不僅搜尋 host,還會搜尋

    host.example.com

如果在容器啟動時沒有指定

--dns

--dns-search,Docker

會預設用宿主主機上的

/etc/resolv.conf

來配置容器的 DNS。

鏡像

  • docker images

    列出本地的所有鏡像
  • docker pull

    下載下傳鏡像
  • docker search ""

    查找相關的鏡像,或者在

    http://hub.docker.com

    檢視
  • docker rmi 鏡像:tag

    删除鏡像
  • docker tag oldenv:tag 使用者名/newenv:newtag

    建立一個新的鏡像,舊的鏡像保留
  • docker push 使用者名/newenv:newtag

    推送自己的鏡像到hub上,鏡像的名字必須是

    使用者名/envname:tag

建立鏡像

把容器導出成鏡像

  • docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2

    送出一個容器成為鏡像
    • -m

      : 送出的描述資訊
    • -a

      : 指定鏡像作者
    • e218edb10161

      :容器 ID
    • runoob/ubuntu:v2

      : 指定要建立的目标鏡像名
  • docker images

    可以檢視到送出的鏡像,和容器的導入效果一樣的
[[email protected] ~]$ docker commit -m "nginx with ali sources" -a "twilight" e6547d259b8f twilight/nginx:ali
sha256:378d7ca4a813dd691df890bcb639228a81cc1b58440094cf9431883a8a9003d2

[[email protected] ~]$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
twilight/nginx      ali                 378d7ca4a813        8 seconds ago       229MB
mysystem            tags                1c174e9fbdee        4 minutes ago       64.2MB
ubuntu              18.04               2eb2d388e1a2        6 days ago          64.2MB
nginx               latest              8cf1bfb43ff5        9 days ago          132MB
training/webapp     latest              6fae60ef3446        5 years ago         349MB
           

導出&導入鏡像到檔案

導出鏡像的所有資訊,導入後的鏡像和原有的鏡像一緻。(注意與導出容器的差別)

  • docker save centos:self -o centos.tar

    導出鏡像到檔案
  • docker load -i imagedata.tar

    導入檔案成鏡像
  • 可與

    docker commit containerid imagename:tag

    配合使用

從零建構鏡像

Dockerfile中每一行都産生一個層都有一個id,可能多個容器之間會共享一些層,可以節省資源。

  • docker build

    : 建構一個鏡像,需要一個

    Dockerfile

    檔案
FROM    centos:6.7
MAINTAINER      Fisher "[email protected]"

RUN     /bin/echo 'root:123456' |chpasswd
RUN     useradd runoob
RUN     /bin/echo 'runoob:123456' |chpasswd
RUN     /bin/echo -e "en_US.UTF-8\"" >/etc/default/local
EXPOSE  22
EXPOSE  80
CMD     /usr/sbin/sshd -D
           
  • docker build -t runoob/centos:6.7 .

    建立一個鏡像
    • -t

      : 表示目标鏡像名
    • .

      : 表示Dockerfile檔案所在的目錄

自帶的ubuntu會因為缺少證書而無法更新源,隻能先用舊的源安裝上缺少的證書

The following signatures couldn’t be verified because the public key is not available: NO_PUBKEY 3B4FE6ACC0B21F32
[email protected]:/etc/apt# apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32
Executing: /tmp/apt-key-gpghome.SysU7qEDMN/gpg.1.sh --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32
gpg: key 3B4FE6ACC0B21F32: public key "Ubuntu Archive Automatic Signing Key (2012) <[email protected]>" imported
gpg: Total number processed: 1
gpg:               imported: 1