1. 程式人生 > 實用技巧 >Docker 常用命令整理

Docker 常用命令整理

容器

docker run ubuntu:18.04 echo hello docker 表示用18.04的ubuntu映象新建一個容器,用這個容器來執行echo命令

  • docker run -i -t ubuntu [bash] 表示一個執行一個最新的ubuntu容器,並且進入到這個容器的bash中(不加i雖然可以進入bash,但是不可互動)。退出容器用exitctrl+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.04docker run -itd --name containerTest2 ubuntu:18.04 效果不一樣,前者建立後就被停止了,後者在後臺保持執行狀態

容器的匯入和匯出

匯出容器

  • docker export id > ubuntu.tar

匯入容器

  • cat docker/ubuntu.tar | docker import - mysystem:mytag : 匯入成了一個image,可以用docker images檢視,
  • docker import file/URL - 容器:tag
[wangchao@localhost ~]$ cat containerTest2.tar | docker import - mysystem:tags
sha256:1c174e9fbdee72b5427701e22033105a2c41d626f418501497240902bc5667ac

[wangchao@localhost ~]$ 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

容器互聯

新建網路

[wangchao@localhost ~]$ 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

root@1718bc16f2e6:/# 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

[root@localhost docker]# docker run -it --hostname slavehostname  --dns=114.114.114.114 ubuntu:18.04 /bin/bash
root@slavehostname:/# 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 commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2 提交一個容器成為映象
    • -m: 提交的描述資訊
    • -a: 指定映象作者
    • e218edb10161:容器 ID
    • runoob/ubuntu:v2: 指定要建立的目標映象名

docker images 可以檢視到提交的映象,和容器的匯入效果一樣的

[wangchao@localhost ~]$ docker commit -m "nginx with ali sources" -a "twilight" e6547d259b8f twilight/nginx:ali
sha256:378d7ca4a813dd691df890bcb639228a81cc1b58440094cf9431883a8a9003d2

[wangchao@localhost ~]$ 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

從零構建映象

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 "LANG=\"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

root@e6547d259b8f:/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