玩转Docker学习笔记


镜像相关指令

  • docker pull <image>:从远程仓库拉取一个镜像或仓库到本地。
  • docker build -t <tag> .:使用当前目录的Dockerfile构建一个新的镜像。
  • docker images:列出本地存储的镜像。
  • docker rmi <image>:删除一个或多个本地的镜像。
  • docker tag <image> <new_tag>:为镜像添加一个新的标签。

容器相关指令

  • docker run <image>:创建一个新的容器并运行一个命令。
  • docker ps:列出当前运行的容器。
  • docker ps -a:列出所有容器,包括未运行的。
  • docker stop <container>:停止一个或多个正在运行的容器。
  • docker start <container>:启动一个或多个已停止运行的容器。
  • docker restart <container>:重启容器。
  • docker rm <container>:删除一个或多个容器。
  • docker logs <container>:获取容器的日志。
  • docker exec -it <container> <command>:在运行的容器中执行命令,通常用于进入容器。

网络相关指令

  • docker network ls:列出所有网络。
  • docker network create <options> <network_name>:创建一个新的网络。
  • docker network rm <network>:删除一个或多个网络。
  • docker network connect <network> <container>:连接一个容器到一个网络。
  • docker network disconnect <network> <container>:断开容器与网络的连接。

数据卷相关指令

  • docker volume create <name>:创建一个新的卷。
  • docker volume ls:列出所有卷。
  • docker volume rm <volume>:删除一个或多个卷。
  • docker volume inspect <volume>:显示详细的卷信息。

Docker Compose相关指令(使用docker-compose

  • docker-compose up:在后台启动并运行整个应用。
  • docker-compose down:停止并移除容器,网络,图像和挂载卷。
  • docker-compose build:构建或重建服务关联的镜像。
  • docker-compose logs:查看服务的日志输出。

这些命令代表了Docker操作的基础,但是实际使用中可能还会遇到更复杂的场景和高级特性。建议通过官方文档或其他学习资源深入理解每个命令的用法和选项。

通过 DockerFile 构建 Docker Image

一个 Image 是通过一个 DockerFile 定义的,然后使用 docker build 命令构建它。

DockerFile 中的每一条命令的执行结果都会成为 Image 中的一个 Layer。

这里,我们通过 Build 一个镜像,来观察 Image 的分层机制:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 使用官方的Python运行时环境作为基础镜像
FROM python:2.7-slim

# 设置工作目录为容器内的/app。如果目录不存在,Docker会自动为你创建这个目录。
WORKDIR /app

# 将当前目录(Dockerfile所在目录)的内容复制到容器内的/app目录中。
# 这意味着你的应用代码和依赖文件(比如requirements.txt)都会被复制进去。
COPY . /app

# 利用RUN命令执行pip安装命令来安装requirements.txt中列出的所有依赖。
# 这里使用了--trusted-host选项来指定可信的PyPI主机,避免SSL证书验证问题。
RUN pip install --trusted-host pypi.python.org -r requirements.txt

# 使用EXPOSE指令来告诉Docker容器内的应用将会在80端口上监听连接。
# 需要注意的是,EXPOSE指令本身不会使容器的端口对外界开放,
# 它更多的是一种文档化的作用,真正的端口映射需要在运行容器时通过docker run的-p选项来指定。
EXPOSE 80

# 使用ENV指令设置一个环境变量。这里定义了一个名为NAME的环境变量,值为World。
# 环境变量可以在容器运行时被应用程序读取,用于配置应用行为。
ENV NAME World

# 使用CMD指令指定容器启动时运行的命令。
# 这里的命令是“python app.py”,即使用Python解释器来运行app.py脚本。
# CMD的主要作用是指定容器的默认执行命令。如果在docker run命令后面指定了其他命令,CMD指定的命令将被覆盖。
CMD ["python", "app.py"]

这份Dockerfile基本上覆盖了构建一个简单Python应用的Docker镜像所需的所有步骤。从选择基础镜像开始,设置工作目录,复制应用代码,安装依赖,到最后指定运行时的命令和暴露的端口,每一步都为镜像的构建提供了必要的指令和配置。

最终的构建结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
root@rds-k8s-18-svr0:~/xuran/exampleimage# docker build -t hello ./
Sending build context to Docker daemon 5.12 kB
Step 1/7 : FROM python:2.7-slim
---> 804b0a01ea83
Step 2/7 : WORKDIR /app
---> Using cache
---> 6d93c5b91703
Step 3/7 : COPY . /app
---> Using cache
---> feddc82d321b
Step 4/7 : RUN pip install --trusted-host pypi.python.org -r requirements.txt
---> Using cache
---> 94695df5e14d
Step 5/7 : EXPOSE 81
---> Using cache
---> 43c392d51dff
Step 6/7 : ENV NAME World
---> Using cache
---> 78c9a60237c8
Step 7/7 : CMD python app.py
---> Using cache
---> a5ccd4e1b15d
Successfully built a5ccd4e1b15d

下面是对这些信息每一步的详细解释:

  • Sending build context to Docker daemon 5.12 kB
    这一行表示Docker客户端正在将构建上下文发送给Docker守护进程。构建上下文是指Dockerfile所在目录的内容,Docker会将这些内容打包发送给守护进程。这里的大小是5.12kB,表示你的应用代码和依赖文件等总共大小。

  • Step 1/7 : FROM python:2.7-slim
    这是Dockerfile中的第一步,它基于python:2.7-slim这个镜像来构建新的镜像。---> 804b0a01ea83是基础镜像的ID。

  • Step 2/7 : WORKDIR /app
    设置工作目录为/app。如果不存在,Docker会自动创建这个目录。---> Using cache ---> 6d93c5b91703表示这一步使用了缓存,6d93c5b91703是这一层的ID。

  • Step 3/7 : COPY . /app
    将构建上下文(Dockerfile所在的目录)的内容复制到容器内的/app目录。---> Using cache ---> feddc82d321b表明这一步也使用了缓存。

  • Step 4/7 : RUN pip install –trusted-host pypi.python.org -r requirements.txt
    在容器内执行pip install命令,安装requirements.txt文件中列出的Python依赖包。---> Using cache ---> 94695df5e14d说明这一步同样使用了缓存。

  • Step 5/7 : EXPOSE 81
    通知Docker容器在运行时将会监听81端口。注意这里与前面提到的Dockerfile中的EXPOSE 80不同,可能是因为Dockerfile被修改了但构建输出没有更新。---> Using cache ---> 43c392d51dff表示使用了缓存。

  • Step 6/7 : ENV NAME World
    设置环境变量NAME的值为World。这个环境变量可以在容器运行时被应用程序使用。---> Using cache ---> 78c9a60237c8也显示这一步使用了缓存。

  • Step 7/7 : CMD [“python”, “app.py”]
    指定容器启动时默认执行的命令。这里是运行app.py脚本。---> Using cache ---> a5ccd4e1b15d意味着这一步也利用了之前的构建缓存。

  • Successfully built a5ccd4e1b15d
    最后,显示了成功构建的镜像ID为a5ccd4e1b15d

在这个过程中,Using cache表明Docker发现之前的构建步骤与当前的完全一致,因此它复用了之前的结果来加快构建过程。如果你想要强制Docker重新执行每个步骤而不使用缓存,可以在构建时添加--no-cache选项。


参考链接: