快速参考#

参考:Docker 小技巧

Docker 命令行的基本使用

docker + 管理对象(比如容器,镜像) + 具体操作(比如创建,启动,停止,删除)

例子

  • docker image pull nginx 拉取 nginx 的 docker 镜像

  • docker container stop web 停止 web 的 docker 容器

镜像 vs 容器#

容器基本操作#

容器命令#

操作

命令(全)

命令(简)

容器的创建

docker container run <image name>

docker run <image name>

容器的列出(up)

docker container ls

docker ps

容器的列出(up和exit)

docker container ls -a

docker ps -a

容器的停止

docker container stop <name or ID>

docker stop <container name or ID>

容器的删除

docker container rm <name or ID>

docker rm <container name or ID>

小技巧

  • docker container stop cd3 269 34b 751 批量删除

  • docker container stop $(docker container ps -aq) 批量删除

  • docker system prune -a -f 可以快速对系统进行清理,删除停止的容器,不用的镜像,等等。

例子

docker container run -d --publish 80:80 --name webhost nginx
  • 在本地查找是否有 nginx 镜像,但是没有发现;

  • 去远程的 image registry 查找 nginx 镜像(默认的 registry 是 Docker Hub)

  • 下载最新版本的 nginx 镜像 (nginx:latest 默认)

  • 基于 nginx 镜像来创建新的容器,并且准备运行

  • docker engine 给这个容器分配虚拟 IP 地址

  • 在宿主机上打开 80 端口并把容器的 80 端口转发到宿主机上

  • 启动容器,运行指定的命令(这里是 shell 脚本去启动 nginx)

镜像管理和发布#

镜像基本操作#

查看基本功能:

!docker image
Usage:  docker image COMMAND

Manage images

Commands:
  build       Build an image from a Dockerfile
  history     Show the history of an image
  import      Import the contents from a tarball to create a filesystem image
  inspect     Display detailed information on one or more images
  load        Load an image from a tar archive or STDIN
  ls          List images
  prune       Remove unused images
  pull        Pull an image or a repository from a registry
  push        Push an image or a repository to a registry
  rm          Remove one or more images
  save        Save one or more images to a tar archive (streamed to STDOUT by default)
  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE

Run 'docker image COMMAND --help' for more information on a command.

比如:

!docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
Digest: sha256:790711e34858c9b0741edffef6ed3d8199d8faa33f2870dea5db70f16384df79
Status: Image is up to date for nginx:latest
docker.io/library/nginx:latest

指定版本:

!docker pull nginx:1.20.0
1.20.0: Pulling from library/nginx

2152171a: Pulling fs layer 
15a5cec8: Pulling fs layer 
b026b9ce: Pulling fs layer 
dc384fb3: Pulling fs layer 
372d6dee: Pulling fs layer 
Digest: sha256:ea4560b87ff03479670d15df426f7d02e30cb6340dcd3004cdfc048d6a1d54b4
Status: Downloaded newer image for nginx:1.20.0
docker.io/library/nginx:1.20.0

从 Quay 上拉取镜像:

!docker pull quay.io/bitnami/nginx
Using default tag: latest
Error response from daemon: unauthorized: access to the requested resource is not authorized

Dockerfile 基本结构#

Docker 可以通过从 Dockerfile 中读取指令来自动构建映像。Dockerfile 是文本文档,它包含用户可以在命令行上调用的所有命令来组装镜像。

比如在 Ubuntu 系统下创建简单的 Python 环境:

FROM ubuntu:20.04
RUN apt-get update && \
    DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y python3.9 python3-pip python3.9-dev
ADD hello.py /
CMD ["python3", "/hello.py"]

scratch 镜像#

Scratch 是空白 Docker 镜像。

通过 scratch 来构建基础镜像。

#include <stdio.h>
int main()
{
    printf("hello docker\n");
}

编译成二进制文件

$ gcc --static -o hello hello.c
$ ./hello
hello docker
$
FROM scratch
ADD hello /
CMD ["/hello"]

构建

$ docker build -t hello .
$ docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
hello        latest    2936e77a9daa   40 minutes ago   872kB

运行

$ docker container run -it hello
hello docker

Docker 数据存储#

默认情况下,在运行中的容器里创建的文件,被保存在可写的容器层:

  • 如果容器被删除了,则数据也没有了

  • 这个可写的容器层是和特定的容器绑定的,也就是这些数据无法方便的和其它容器共享

Docker 主要提供了两种方式做数据的持久化

  • Data Volume:由 Docker 管理(/var/lib/docker/volumes/ Linux), 持久化数据的最好方式

  • Bind Mount,由用户指定存储的数据具体 mount 在系统什么位置