我在项目中使用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`