关于Docker的命令小贴士

130 阅读4分钟

我在项目中使用Docker时遇到的命令的总结。

注意:如果你使用的是Boot2Docker,那么请不要输入sudo,否则你会得到一个错误。

小贴士

  • 你可以用[containerName]代替[containerID]。你通常只需要[containerID]中的3个字符。
  • 如果你想了解更多关于该命令的信息,请添加-help,例如docker run --help
  • 注意,容器和图像不一样。容器就像实例。
  • 如果你使用boot2docker,可能会导致一些问题,比如docker服务器没有反应。用boot2docker restart 重新启动boot2docker,以解决DNS等问题。
  • 容器是进程驱动的,所以一旦进程完成,它就会退出(这可能需要一段时间来适应)。
  • 要 "进入 "一个目前正在后台作为守护进程运行的容器,请运行docker exec -it [container] /bin/bash

命令

一般


检查Docker版本

sudo docker version

图像信息


搜索可用的图像

sudo docker search [imageName]

列出本地保存的图片

sudo docker images

从远程提取和缓存图像

sudo pull [imageName:tag]

  • 注意,如果你在docker run ubuntu ... ,它将运行这个命令,如果你没有在本地存储ubuntu的话。
  • 建议用一个特定的标签来提取

例子

# search for ubuntu
sudo docker search ubuntu

# pull ubuntu v14.04
sudo pull ubuntu:14.04

修改一个图像


请注意,要修改一个映像,你必须创建一个作为容器的映像实例。然后你必须运行这个容器,然后再进行修改。与Git类似,你必须 "提交 "你的修改。这将把你在该容器上所做的修改 "保存 "到原生镜像中。然后你可以把它推送到docker hub。

建立一个镜像

sudo docker build -t [username/imagename:tag] .

  • 注意,. 假设有一个现有的Docker文件。

例子

# create docker file
touch Dockerfile

# Sample Dockerfile Contents:
# More on: https://docs.docker.com/reference/builder/
# FROM ubuntu
# RUN \
#   apt-get update && \
#   apt-get install -y python python-dev python-pip python-virtualenv && \
#   rm -rf /var/lib/apt/lists/*
# # working dir
# WORKDIR /data
# # default command
# CMD [“bash”]

sudo docker build -t jancarloviray/python

检查差异

sudo docker diff [containerID]

  • 这显示了文件的变化/添加/删除情况

提交对镜像的修改

sudo docker commit -m ‘Added nodejs’ -a ‘John Doe’ [containerID] [username/new_name:custom_tag]

在现有的镜像上设置标签

sudo docker tag [containerID] [username/imagename:newtag]

推送镜像到Docker Hub

sudo docker push [username/imagename]

移除Docker镜像

sudo docker rmi [imageName]

  • 请注意,这不同于sudo docker rm [containerName] ,后者会删除一个容器。

容器信息


列出容器

# list only running containers
# ----------------------------
sudo docker ps

# list all container
# ------------------
sudo docker ps -a

# show recently created container
# ----------------------------
sudo docker ps -l

# display file sizes (of all containers)
# ----------------------------
sudo docker ps -a -s

查看容器日志/输出

# View Container Log
# ------------------
sudo docker logs [containerID]

# View and Tail Container Log
# ---------------------------
sudo docker logs -f [containerID]

# Also show Timestamps
# --------------------
sudo docker logs -f -t [containerID]

检查一个容器

sudo docker inspect [containerID]

容器操作


运行一个命令并激活一个容器

sudo docker run ubuntu /bin/echo ‘Hello world’

  • 首先,我们指定了Docker二进制文件和我们想要执行的命令--run。请注意,docker run组合运行容器。
  • 接下来,我们指定了一个镜像。如果它没有安装,它将下载它。
  • 接下来是我们在容器内运行的命令。
  • 注意,只要你指定的命令处于活动状态,docker容器就处于活动状态。

交互式容器

sudo docker run -t -i [imagename] /bin/bash

  • -t在我们的新容器内指定一个伪tty或终端
  • -i标志允许我们通过抓取容器中STDIN的标准来进行交互式连接
  • /bin/bash也可以在我们的容器中启动一个bash shell。

在后台运行一个容器

sudo docker run -d [imagename] /bin/sh -c “while true;do echo hello world; sleep 1; done”

  • -d告诉Docker运行容器并将其放在后台,使其 "守护"。
  • 注意,在你运行这个程序后,你不会看到输出,但Docker会给你容器的ID
  • 要查看正在运行的容器,请运行docker ps
  • 窥视一个特定的容器内部,运行sudo docker logs [containerIDorName]
  • 要停止运行容器,sudo docker stop [containerIDorName] 。注意,在命令实际执行之前有一个默认的10秒的计时器--这是一个宽限期,以防你想改变主意。要覆盖这一点,可以使用sudo docker stop -t 0 [containerID]

运行并命名一个容器

sudo docker run --name [containerName] [imageName] /bin/echo ‘Hello World’

在一个正在运行的容器中执行一个命令

sudo docker exec [containerID] /bin/bash

在一个正在运行的容器中附加一个终端

sudo docker exec -it [containerID] /bin/bash

停止一个在后台运行的容器

sudo docker stop [containerID]

重新启动一个容器

sudo docker restart [containerID]

删除一个容器

sudo docker rm [containerID]

容器联网


将容器的端口暴露给主机(即:运行一个网络应用)。

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

  • -d在后台运行容器
  • -P告诉Docker将我们容器内的网络端口映射到我们的主机上。

当你运行docker ps ,你会看到这样一列。

PORTS
0.0.0.0:49155->5000/tcp

这意味着Docker已经在49155端口上暴露了5000端口(默认的python flask端口)。

注意:如果你使用boot2docker,你将需要获得boot2docker的ip。你必须通过运行boot2docker ip ,而不是运行localhost:49155来获得端口,或者open $(boot2docker ip):49155

手动将容器端口暴露给主机

sudo docker run -d -p 5000:5000 training/webapp python app.py

  • 这将容器端口5000映射到主机端口5000。
  • 注意,你可以多次运行**-p**标志来配置多个端口。

管理容器数据

请注意,在你用docker rm [container] 删除它们之前,容器一直存在。在此之前,容器(一个 "镜像 "的 "实例 "本身)将继续存在,并且可以被启动、停止、重新启动等。

数据卷

数据卷是一个或多个容器中特别指定的目录,它绕过联合文件系统,提供以下功能。

  • 当一个容器被创建时,卷被初始化
  • 数据卷可以在容器之间共享和重复使用
  • 对数据卷的更改是直接进行的
  • 当你更新镜像时,对数据卷的改变不会被包括在内
  • 卷会持续存在,直到没有容器使用它们
# Adding a Data Volume
# --------------------
#
# sudo docker run -d -P --name [newName] \
# -v [volumeName] [imageName] [commandToExecute]
#
# Use the `-v` flag with `docker create`
# or `docker run` command
# Note that you can use it multiple times
# to mount multiple data volumes
# The following code will create a new volume
# inside a container at `/webapp`

sudo docker run -d -P --name web -v /webapp training/webapp python appy.py

# Mount a Host Directory as a Data Volume
# ---------------------------------------
#
# sudo docker run -d -P --name [newName] \
# -v [/dir/from/host]:[/dir/in/cont] \
# [imageName] [commandToExecute]
#
# `-v` flag is also used to mount a directory from
# your Docker daemon’s host into a container.
# Note that if you are using Boot2Docker, it only
# has limited access to your /Users directory
# so, you mount it like this:
# `sudo docker run -v /Users/<path>:/<containerPath>`
# The following will mount the host directory,
# /src/webapp into the container at /opt/webapp.
# NOTE: if the path /opt/webapp already exists
# inside the container’s image, its contents will
# be replaced by the contens of /src/webapp on
# the host to stay consistent with the expected
# behavior of `mount`

sudo docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py

杂项命令

# quick install docker in linux
curl -sSL https://get.docker.com/ | sh

# kill all running containers
# note that -q stands for quiet, just show ids
sudo docker kill $(docker ps -q)

# delete stopped container
sudo docker rm -v `docker ps -a -q -f status=exited`