logo科技微讯

我常用的 docker 和 docker-compose 命令

作者:科技微讯
日期:2020-08-19
📜 文章

docker 我已经用了一段时间,还写了好几篇涉及 docker 的文章,但 docker 有些命令我用得少,隔一段时间再用又会忘记,影响工作效率,所以决定写下来,一方面加深记忆,另一方面是当我再忘记时,可以快速查询使用。

docker 命令

docker build

docker build -t image_name:latest .

根据 Dockerfile 创建一个 docker image,最后的 . 表示当前目录,当前目录需要包含一个 Dockerfile 文件,-t 表示 tag,后面是这个 docker image 的名称,这个名称可以选择性地添加标签。

docker run

docker run -d -p 8080:80 image_name

run 需要在 build 之后运行,-d 表示在后台运行,-p 绑定端口,8080 是本地端口,80 是 container 监听的端口,所以在本地访问 8080 端口其实就是访问 container 的 80 端口。

在 docker-compose.yml 文件中,通过 ports 属性绑定端口,也是 HOST:CONTAINER 的格式。在 Dockerfile 文件中,通过 expose 属性让 container 监听某个端口,但是如果通过 docker run -p 的方式运行这个 container,那这个 container 会监听 -p 后面的端口,忽略 expose 属性定义的端口。

-p 可以理解为 docker-compose.yml 文件中的 ports 属性,也可以理解为 publish。

写在 Dockerfile 中的 EXPOSE 属性更多地充当说明文档的作用,容器制作者通过这个属性告诉容器使用者这个容器希望暴露的端口是什么(代码中的端口是什么),但并没有 publish 出去。

The EXPOSE instruction does not actually publish the port. It functions as a type of documentation between the person who builds the image and the person who runs the container,about which ports are intended to be published. To actually publish the port when running the container,use the -p flag on docker run to publish and map one or more ports,or the -P flag to publish all exposed ports and map them to high-order ports.

写在 docker-compose.yml 文件中的 expose 属性定义的端口也没有 publish 出去,但可以用来和其他 service 进行通信,要 publish 端口,需要用 ports 属性

让 container 自动重启

在服务器运行 docker,如果服务器重启,或者 docker container 意外奔溃,如何让 container 自动重启运行呢?可以使用 --restart 命令,例如:

docker run -d --restart unless-stopped image_name

docker save

docker save -o ~/Desktop/docker_image image_name

把一个叫 image_name 的镜像导出为 tar 归档文件,并保存在桌面,后面可以接多个镜像名称。

docker save image_name | gzip > ~/Desktop/docker_image_zip

把镜像导出,并通过 gzip 压缩使其体积变小。

docker load

docker load -i ~/Desktop/docker_image

docker save 出来的文件可以通过 load 命令读取,可以 load 压缩过或没有压缩过的镜像文件。

docker logs

docker logs container_name

读取一个叫 container_name 的容器的日志记录,会展示从开始运行到现在的所有日志,如果日志很多,可能不容易查找到自己需要的信息。

docker logs -f container_name

增加一个 -f 选项,可以让日志实时显示在终端,f 的意思是 follow。

docker logs --since 2020-08-19T09:00:00 --until 2020-08-19T10:00:00 container_name

通过 since 和 until 可以查看某个区间的日志,时间采用 ISO 8601 Extended 格式。

docker exec

docker exec -it container_name /bin/bash
docker exec -it container_name /bin/sh

有时候是 /bin/bash 有时候是 /bin/sh,作用是进入 container_name 这个容器。

docker cp

docker cp container_name:/path/to/the/file/you/want/to/copy 。

把 docker container 中的文件复制到本地,如果不确定 container 的文件路径,可以用 docker exec 进入 container 确认一下。

docker system prune

docker system prune

删除所有没有使用的 container,network,images 等,这些东西可能会占据很多硬盘空间。

docker ps

docker ps
docker container ls

一样的,都是列出所有 container,docker images 就是列出所有 image。

docker-compose 命令

up

docker-compose up -d

执行这条命令会自动在当前目录寻找一个叫 docker-compose.yml 的文件,up 的意思是运行这个文件里声明的所有容器,-d 意思是在后台运行这些容器,它是 detach 的简称。

如果你的 yml 文件不叫 docker-compose.yml,可以通过 -f 指定 yml 文件:

docker-compose -f another-docker-compose.yml up -d

如果你只是希望运行 docker-compose.yml 文件中声明的某个容器,可以:

docker-compose  up -d container_name

docker-compose up 不同于 docker run,在更新一个容器时,前者不需要先停止这个容器,只需要重新 up 一次,后者需要先停止这个容器,然后再 run 一次。

down

docker-compose down

暂停并移除 docker-compose.yml 文件中声明的所有容器,这样 docker ps 的清单就看不到这些容器了。

logs

docker-compose logs container_name

如果后面没有加 container_name,就显示所有容器的 logs,可以加 -f 实时显示。


相关文章:

donation赞赏
thumbsup0
thumbsdown0
暂无评论