日拱一卒无有尽,功不唐捐终入海

Docker与Docker Compose的日常使用

在Linux上安装好Docker和Docker Compose后,见《在AWS和阿里云Linux上安装Docker和Docker Compose》,就可以开始使用了。

下面的内容记录了我日常使用这两种工具的方法,内容包括:

  1. 拉取镜像
  2. 构建镜像
  3. 使用命令行启动容器
  4. docker-compose.yml文件
  5. 使用Docker Compose启动容器
  6. 使用Docker Compose终止容器
  7. 在终止容器的时候保留数据卷
  8. 查看当前运行的容器
  9. 查看容器ip
  10. 查看所有镜像
  11. 删除镜像


  1. 拉取镜像
docker pull [image_name]

[image_name] 是你想要下载的 Docker 镜像的名称。

[image_name] 可以有以下几种形式:

  • 只包含镜像名称,如 ubuntu
  • 包含仓库名称和镜像名称,如 library/ubuntu
  • 包含仓库名称、镜像名称和标签,如 library/ubuntu:20.04
  • 包含私有仓库的完整URL和镜像名称,如 myregistry.example.com/myapp
  • 包含私有仓库的完整URL、镜像名称和标签,如 myregistry.example.com/myapp:v1.0

其中,library 是 Docker Hub 上的默认仓库名称。标签(tag)通常是可选的,如果不指定,Docker 会默认拉取 latest 标签的镜像。

2. 构建镜像

docker build [OPTIONS] PATH

docker build 命令用于从 Dockerfile 创建一个新的镜像,比如:

docker build -t my-image-name:tag .
  • [OPTIONS] 是可选参数,可以用来设置构建过程中的配置,例如 -t 用于给镜像打标签。
  • PATH 是指向包含 Dockerfile 的上下文路径,可以是本地文件系统的路径,也可以是远程仓库的 URL。

3. 使用命令行启动容器

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

示例:

docker run -d --name myapp-container \
  -e "ENV_VAR=value" \
  --link db-container:db \
  -v /host/path:/container/path \
  myapp:latest

这个命令做了以下操作:

  • -d:在后台运行容器。
  • --name myapp-container:为容器指定一个名称。
  • -e "ENV_VAR=value":设置环境变量。
  • --link db-container:db:链接到名为 db-container 的容器,并在容器中以别名 db 引用。
  • -v /host/path:/container/path:将宿主机的 /host/path 目录挂载到容器的 /container/path 目录。
  • myapp:latest:指定要运行的镜像和标签。

docker run可以基于指定的镜像启动容器。但是如上所示,启动命令有时会比较复杂,用命令行编写的话,会比较难编辑而且容易出错,所以这时候我们就需要用到Docker Compose。

4. docker-compose.yml文件

docker-compose.yml 文件中通常包含以下关键配置:

  • services:定义容器服务,每个服务可以配置镜像、端口映射、环境变量、卷挂载等。
  • networks:定义容器间网络。
  • volumes:定义数据卷,用于数据持久化。
services:
  web:
    image: "nginx:alpine"
    ports:
      - "80:80"
    volumes:
      - "web-data:/usr/share/nginx/html"
    networks:
      - webnet

  db:
    image: "postgres:alpine"
    volumes:
      - "db-data:/var/lib/postgresql/data"
    networks:
      - webnet

volumes:
  web-data:
  db-data:

networks:
  webnet:

这个 docker-compose.yml 配置文件定义了一个多容器的 Docker 应用,包括两个服务:一个 Web 服务器和一个数据库服务器,以及它们所使用的数据卷和网络。

  • services:定义了应用中的服务。这里有两个服务:webdb
  • web 服务:
    • image: "nginx:alpine":使用 nginx:alpine 镜像来创建容器。
    • ports:将容器的 80 端口映射到宿主机的 80 端口,使得可以通过宿主机的 80 端口访问 Nginx 服务。
    • volumes:挂载一个名为 web-data 的数据卷到容器的 /usr/share/nginx/html 目录,用于存储 Web 内容。
    • networks:将 web 服务连接到 webnet 网络。
  • db 服务:
    • image: "postgres:alpine":使用 postgres:alpine 镜像来创建容器,提供 PostgreSQL 数据库服务。
    • volumes:挂载一个名为 db-data 的数据卷到容器的 /var/lib/postgresql/data 目录,用于存储数据库数据。
    • networks:将 db 服务连接到 webnet 网络。
  • volumes:定义了两个数据卷 web-datadb-data,它们将被用于 webdb 服务中,以确保数据的持久化。
  • networks:定义了一个名为 webnet 的网络,它将被 webdb 服务使用,以便它们可以在同一隔离的网络环境中通信。

当使用 docker-compose up 命令时,Docker Compose 会根据这个配置文件创建和启动定义的服务、数据卷和网络。

services:
  web:
    image: "nginx:alpine"

当然这个Nginx容器并没有什么用,但是这个配置文件是合法,可以执行的。你可以根据自己需求添加网络、卷、端口,环境变量等参数。

5. 使用Docker Compose启动容器

docker-compose up

这个命令用于根据 docker-compose.yml 文件中定义的配置启动服务,它会:

  1. 构建(如果需要)并启动所有服务。
  2. 将服务输出绑定到当前终端,让你可以看到服务的日志。
  3. 如果服务失败,它会自动停止。

这个命令通常用于开发和测试环境,因为它提供了一个交互式的体验。如果你需要在后台运行服务,可以使用 docker-compose up -d

docker-compose -f docker-compose.override.yml up

即使用 -f--file 选项来指定 Docker Compose 配置文件。这个命令会使用 docker-compose.override.yml 作为配置文件来启动服务。

6. 使用Docker Compose终止容器

docker-compose down

这个命令用于停止并删除由 Docker Compose 管理的所有服务中的容器,以及与这些服务相关的网络和卷。这个命令执行以下操作:

  • 停止所有服务中的容器。
  • 删除所有服务创建的容器。
  • 删除由 docker-compose.yml 文件定义的所有网络。
  • 删除由 docker-compose.yml 文件定义的所有数据卷。

这个命令通常用于完全清理 Docker Compose 项目的环境,当你不再需要运行服务时可以使用它。如果你只想停止容器而不删除它们,可以使用 docker-compose stop 命令。

docker-compose -f docker-compose.override.yml down

7. 在终止容器的时候保留数据卷

我的做法是使用命名卷。即在 docker-compose.yml 文件中为每个服务指定命名卷,而不是匿名卷。这样,即使容器被删除,命名卷仍然存在,并且可以在以后重新使用,比如:

services:
  db:
    image: postgres
    volumes:
      - db-data:/var/lib/postgresql/data
volumes:
  db-data:

这个卷会挂载到宿主机上的这个位置:

/var/lib/docker/volumes/docker-db-data/_data

如果想将卷挂载到指定位置,可以这么定义:

services:
  myservice:
    image: myimage
    volumes:
      - /path/on/host:/path/in/container

在这个例子中,/path/on/host 是宿主机上的路径,/path/in/container 是容器内部的路径。

8. 查看当前运行的容器

docker ps

这个命令会列出所有当前正在运行的容器,包括容器ID、创建时间、状态、端口等信息。如果你想要更详细的信息,可以使用 -a--all 选项来显示所有容器,包括已停止的容器

docker ps -a

9. 查看容器ip

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' [CONTAINER_ID_OR_NAME]

这个命令会输出指定容器的 IP 地址。[CONTAINER_ID_OR_NAME] 是容器的 ID 或名称。

这个命令不是很方便记忆与输入,我一般会在.bashrc文件里加一个“别名”,比如:

alias di-ip="docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}'"

10. 查看所有镜像

docker images

这个命令会列出本地机器上所有的镜像,包括仓库名称、标签、镜像 ID、创建时间和大小。如果你想要查看包括中间层镜像在内的所有镜像,可以使用 -a--all 选项

docker images -a

11. 删除镜像

无用的镜像会占用服务器大量空间,所以需要不定期删除镜像。可以使用以下命令:

docker rmi [IMAGE_ID_OR_NAME]

这里的 [IMAGE_ID_OR_NAME] 是你想要删除的镜像的 ID 或名称。

例如,如果你想要删除名为 my_image 的镜像,你可以使用:

docker rmi my_image

或者,如果你知道镜像的 ID,比如 123abc,你可以使用:

docker rmi 123abc

如果你想要删除多个镜像,可以一次性列出所有要删除的镜像 ID 或名称:

docker rmi image1 image2 123abc

请注意,你只能删除没有被容器使用的镜像。如果镜像正在被一个或多个容器使用,你需要先停止并删除这些容器,然后才能删除镜像。

如果你想要删除所有不再使用的镜像(悬空镜像),可以使用:

docker image prune

或者,如果你想要删除所有镜像,可以使用:

docker rmi $(docker images -q)

这将删除所有本地镜像,所以请谨慎使用。


评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注