在Linux上安装好Docker和Docker Compose后,见《在AWS和阿里云Linux上安装Docker和Docker Compose》,就可以开始使用了。
下面的内容记录了我日常使用这两种工具的方法,内容包括:
- 拉取镜像
- 构建镜像
- 使用命令行启动容器
- docker-compose.yml文件
- 使用Docker Compose启动容器
- 使用Docker Compose终止容器
- 在终止容器的时候保留数据卷
- 查看当前运行的容器
- 查看容器ip
- 查看所有镜像
- 删除镜像
- 拉取镜像
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首先需要创建一个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
:定义了应用中的服务。这里有两个服务:web
和db
。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-data
和db-data
,它们将被用于web
和db
服务中,以确保数据的持久化。networks
:定义了一个名为webnet
的网络,它将被web
和db
服务使用,以便它们可以在同一隔离的网络环境中通信。
当使用 docker-compose up
命令时,Docker Compose 会根据这个配置文件创建和启动定义的服务、数据卷和网络。
注意,如果只是需要启动容器的话,最小的配置可以是:
services:
web:
image: "nginx:alpine"
当然这个Nginx容器并没有什么用,但是这个配置文件是合法,可以执行的。你可以根据自己需求添加网络、卷、端口,环境变量等参数。
5. 使用Docker Compose启动容器
docker-compose up
这个命令需要在执行命令的路径下存在一个名为docker-compose.yml
的文件。
这个命令用于根据 docker-compose.yml
文件中定义的配置启动服务,它会:
- 构建(如果需要)并启动所有服务。
- 将服务输出绑定到当前终端,让你可以看到服务的日志。
- 如果服务失败,它会自动停止。
这个命令通常用于开发和测试环境,因为它提供了一个交互式的体验。如果你需要在后台运行服务,可以使用 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
是容器内部的路径。
我经常的做法除了讲数据库的数据挂载到容器外,也会将Nginx,或者其他容器的配置文件挂载到容器外,除了避免容器终止后数据的丢失,也能够方便的修改相关配置。
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}}'"
这样在查看容器ip的时候只需要di-ip [CONTAINER_ID_OR_NAME]
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)
这将删除所有本地镜像,所以请谨慎使用。
发表回复