docker 命令集合

[TOC]

image镜像操作

列出已经下载下来的镜像: docker image ls

查看镜像、容器、数据卷所占用的空间: docker system df

查看虚悬镜像: docker image ls -f dangling=true

虚悬镜像已经失去了存在的价值,是可以随意删除的

删除虚悬镜像: docker image prune

查看中间层镜像: docker image ls -a


部分镜像的查找:

  • 根据镜像名查询: docker image ls 镜像名
  • 过滤器filter查询: docker image ls -f since=mongo:3.2

根据特定的方式显示查找结果:

  • -q : 只显示 ID; ep:docker image ls -q

    --filter 配合 -q 产生出指定范围的 ID 列表,然后送给另一个 docker 命令作为参数,从而针对这组实体成批的进行某种操作的做法在 Docker 命令行使用过程中非常常见,不仅仅是镜像,将来我们会在各个命令中看到这类搭配以完成很强大的功能。

  • 自定义展示结果 --format : Go 的模板语法

    # 只包含镜像ID和仓库名:
    $ docker image ls --format "{{.ID}}: {{.Repository}}"
    5f515359c7f8: redis
    05a60462f8ba: nginx
    fe9198c04d62: mongo
    00285df0df87: <none>
    f753707788c5: ubuntu
    f753707788c5: ubuntu
    1e0c3dd64ccd: ubuntu
    
    # 以表格等距显示,并且有标题行,和默认一样
    $ docker image ls --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"
    IMAGE ID            REPOSITORY          TAG
    5f515359c7f8        redis               latest
    05a60462f8ba        nginx               latest
    fe9198c04d62        mongo               3.2
    00285df0df87        <none>              <none>
    f753707788c5        ubuntu              18.04
    f753707788c5        ubuntu              latest
    

删除本地镜像: docker image rm

  • 根据ID、镜像名、摘要删除镜像:

    # 根据ID
    $ docker image rm 501
    
    # 根据镜像名
    $ docker image rm centos
    
    # 根据镜像摘要; 先查到摘要再进行删除
    $ docker image ls --digests
    REPOSITORY                  TAG                 DIGEST                                                                    IMAGE ID            CREATED             SIZE
    node                        slim                sha256:b4f0e0bdeb578043c1ea6862f0d40cc4afe32a4a582f3be235a3b164422be228   6e0c4c8e3913        3 weeks ago         214 MB
    
    $ docker image rm node@sha256:b4f0e0bdeb578043c1ea6862f0d40cc4afe32a4a582f3be235a3b164422be228
    
  • 用 docker image ls 命令来配合:

    # 删除所有仓库名为 redis 的镜像
    $ docker image rm $(docker image ls -q redis)
    
    # 删除所有在 mongo:3.2 之前的镜像:
    $ docker image rm $(docker image ls -q -f before=mongo:3.2)
    

使用 DockerFile 定制镜像

总结见另一篇文章

详情:https://yeasy.gitbooks.io/docker_practice/content/image/build.html

Dockerfile 多阶段构建:

...

其他制作镜像的方式:

...

container 容器操作

新建并启动容器: 命令主要为 docker run

# 依靠ubuntu镜像生成容器后 命令输出一个 “Hello World”,之后终止容器。
$ docker run ubuntu:18.04 /bin/echo 'Hello world'
Hello world

# 启动一个 bash 终端,允许用户进行交互
# -t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上
# -i 让容器的标准输入保持打开
$ docker run -t -i ubuntu:18.04 /bin/bash
root@af8bae53bdd3:/#
root@af8bae53bdd3:/# pwd
/
root@af8bae53bdd3:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var

利用 docker run 来创建容器时,Docker 在后台运行的标准操作包括:

  • 检查本地是否存在指定的镜像,不存在就从公有仓库下载
  • 利用镜像创建并启动一个容器
  • 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
  • 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
  • 从地址池配置一个 ip 地址给容器
  • 执行用户指定的应用程序
  • 执行完毕后容器被终止

启动已终止的容器: docker container start

后台运行: -d

# 容器会在后台运行并不会把输出的结果 (STDOUT) 打印到宿主机上面
docker run -d ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
77b2dc01fe0f3f1265df143181e7b9af5e05279a884f4776ee75350ea9d8017a

# 查看后台运行的程序的结果 docker logs [container ID or NAMES] 
docker container logs a211      # a211 为短ID

终止容器: docker container stop [container ID]

查看终止状态的容器: docker container ls -a (Exited (0))

重新启动终止状态的容器: docker container start [container ID]

将一个运行态的容器终止,然后再重新启动: docker container restart

进入在后台运行的容器中:

  • docker attach 命令: ( 不推荐使用 )

    $ docker run -dit ubuntu
    243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550
    
    $ docker container ls
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    243c32535da7        ubuntu:latest       "/bin/bash"         18 seconds ago      Up 17 seconds                           nostalgic_hypatia
    
    $ docker attach 243c
    root@243c32535da7:/#
    
    ####### 注意 #######
    # 如果从这个 stdin 中 exit,会导致容器的停止
    
  • docker exec 命令: ( 推荐使用 )

    # 执行 -d 后台 i 持续 t 终端输出 的容器
    $ docker run -dit ubuntu
    69d137adef7a8a689cbcb059e94da5489d3cddd240ff675c640c8d96e84fe1f6
    
    $ docker container ls
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    69d137adef7a        ubuntu:latest       "/bin/bash"         18 seconds ago      Up 17 seconds                           zealous_swirles
    
    # -i 界面没有 Linux 命令提示符,但命令执行结果仍然可以返回。
    $ docker exec -i 69d1 bash
    ls
    bin
    boot
    dev
    ...
    
    # 当 -i -t 参数一起使用时,则可以看到 Linux 命令提示符
    $ docker exec -it 69d1 bash
    root@69d137adef7a:/#
    root@69d137adef7a:/# exit
    # 从这个 stdin 中 exit,不会导致容器的停止
    

导出本地容器快照到本地: docker export

$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                    PORTS               NAMES
7691a814370e        ubuntu:18.04        "/bin/bash"         36 hours ago        Exited (0) 21 hours ago                       test
$ docker export 7691a814370e > ubuntu.tar

从容器快照文件中再导入为镜像: docker import

$ cat ubuntu.tar | docker import - test/ubuntu:v1.0
$ docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED              VIRTUAL SIZE
test/ubuntu         v1.0                9d37a6082e97        About a minute ago   171.3 MB

# 通过指定 URL 或者某个目录来导入
$ docker import http://example.com/exampleimage.tgz example/imagerepo

删除容器: docker container rm

# 删除已终止的容器
$ docker container rm  trusting_newton
trusting_newton

# 删除正在运行的容器,需要添加参数 -f 
$ docker container rm -f trusting_newton
trusting_newton

# 清理所有处于终止状态的容器
$ docker container prune

访问仓库 Repository

登陆: docker login

退出登录: docker logout

拉取镜像:

  • docker search 查找官方的镜像

  • docker pull 下载到本地

    $ docker search centos
    NAME                                            DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
    centos                                          The official build of CentOS.                   465       [OK]
    tianon/centos                                   CentOS 5 and 6, created using rinse instea...   28
    blalor/centos                                   Bare-bones base CentOS 6.5 image                6                    [OK]
    saltstack/centos-6-minimal                                                                      6                    [OK]
    tutum/centos-6.4                                DEPRECATED. Use tutum/centos:6.4 instead. ...   5                    [OK]
    # DESCRIPTION 描述; STARS 收藏数; OFFICIAL 是否官方创建; AUTOMATED 是否自动创建
    
    $ docker pull centos
    

推送镜像:

# 使用镜像源创建一个指定镜像的标签
$ docker tag ubuntu:18.04 username/ubuntu:18.04

$ docker image ls

REPOSITORY                                               TAG                    IMAGE ID            CREATED             SIZE
ubuntu                                                   18.04                  275d79972a86        6 days ago          94.6MB
username/ubuntu                                          18.04                  275d79972a86        6 days ago          94.6MB

# 推送到 hub 上
$ docker push username/ubuntu:18.04

# 查询刚刚推上去的镜像
$ docker search username

NAME                      DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
username/ubuntu

自动创建:

  • 创建并登录 Docker Hub,以及目标网站;
  • 在目标网站中连接帐户到 Docker Hub;
  • 在 Docker Hub 中 配置一个自动创建
  • 选取一个目标网站中的项目(需要含 Dockerfile)和分支;
  • 指定 Dockerfile 的位置,并提交创建。

私有仓库的构建

...

数据管理

...

使用网络

外部访问容器: 通过 -P-p 参数来指定端口映射。

# -P Docker 会随机映射一个 `49000~49900` 的端口到内部容器开放的网络端口
$ docker run -d -P training/webapp python app.py

# 查看映射关系
$ docker container ls -l
CONTAINER ID  IMAGE                   COMMAND       CREATED        STATUS        PORTS                    NAMES
bc533791f3f5  training/webapp:latest  python app.py 5 seconds ago  Up 2 seconds  0.0.0.0:49155->5000/tcp  nostalgic_morse
# 本地主机的 49155 被映射到了容器的 5000 端口

# 查看应用的信息
$ docker logs -f nostalgic_morse
* Running on http://0.0.0.0:5000/
10.0.2.2 - - [23/May/2014 20:16:31] "GET / HTTP/1.1" 200 -
10.0.2.2 - - [23/May/2014 20:16:31] "GET /favicon.ico HTTP/1.1" 404 -

-p 则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。支持的格式有 ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort

  • **映射所有接口地址: ** hostPort:containerPort

    # 将本地的 5000 端口映射到容器的 5000 端口
    $ docker run -d -p 5000:5000 training/webapp python app.py
    
  • 映射到指定地址的指定端口: ip:hostPort:containerPort

    # 指定映射使用一个特定地址,比如 localhost 地址 127.0.0.1
    $ docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
    
  • 映射到指定地址的任意端口: ip::containerPort

    # 绑定 localhost 的任意端口到容器的 5000 端口,本地主机会自动分配一个端口。
    $ docker run -d -p 127.0.0.1::5000 training/webapp python app.py
    
    # 使用 udp 标记来指定 udp 端口
    $ docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
    

查看映射端口的配置: docker port

$ docker port nostalgic_morse 5000
127.0.0.1:49155.

# 注意: 容器有自己的内部网络和 ip 地址(使用 docker inspect 可以获取所有的变量,Docker 还可以有一个可变的网络配置。)

# -p 可以多次使用来绑定多个端口
$ docker run -d \
    -p 5000:5000 \
    -p 3000:80 \
    training/webapp \
    python app.py

容器互联:

新建网络:

$ docker network create -d bridge my-net
# -d 参数指定 Docker 网络类型,有 bridge overlay; overlay 网络类型用于 Swarm mode

**连接容器: **

# 运行一个容器并连接到新建的 `my-net` 网络
$ docker run -it --rm --name busybox1 --network my-net busybox sh

# 打开新的终端,再运行一个容器并加入到 my-net 网络
$ docker run -it --rm --name busybox2 --network my-net busybox sh

# 再打开一个新的终端查看容器信息
$ docker container ls

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
b47060aca56b        busybox             "sh"                11 minutes ago      Up 11 minutes                           busybox2
8720575823ec        busybox             "sh"                16 minutes ago      Up 16 minutes                           busybox1

# 通过 ping 来证明 busybox1 容器和 busybox2 容器建立了互联关系。
# 在 busybox1 容器输入以下命令
/ # ping busybox2
PING busybox2 (172.19.0.3): 56 data bytes
64 bytes from 172.19.0.3: seq=0 ttl=64 time=0.072 ms
64 bytes from 172.19.0.3: seq=1 ttl=64 time=0.118 ms

# 用 ping 来测试连接 busybox2 容器,它会解析成 172.19.0.3。
# 在 busybox2 容器执行 ping busybox1,也会成功连接到
/ # ping busybox1
PING busybox1 (172.19.0.2): 56 data bytes
64 bytes from 172.19.0.2: seq=0 ttl=64 time=0.064 ms
64 bytes from 172.19.0.2: seq=1 ttl=64 time=0.143 ms

配置DNS: 配置全部容器的 DNS ,可以在 /etc/docker/daemon.json 文件中增加以下内容来设置

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

参考https://legacy.gitbook.com/book/yeasy/docker_practice/details
Docker —— 从入门到实践 学习笔记

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,451评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,172评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,782评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,709评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,733评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,578评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,320评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,241评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,686评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,878评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,992评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,715评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,336评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,912评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,040评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,173评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,947评论 2 355

推荐阅读更多精彩内容