docker 我已经用了一段时间,还写了好几篇涉及 docker 的文章,但 docker 有些命令我用得少,隔一段时间再用又会忘记,影响工作效率,所以决定写下来,一方面加深记忆,另一方面是当我再忘记时,可以快速查询使用。
docker build -t image_name:latest .
根据 Dockerfile 创建一个 docker image,最后的 .
表示当前目录,当前目录需要包含一个 Dockerfile 文件,-t
表示 tag,后面是这个 docker image 的名称,这个名称可以选择性地添加标签。
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 属性。
在服务器运行 docker,如果服务器重启,或者 docker container 意外奔溃,如何让 container 自动重启运行呢?可以使用 --restart
命令,例如:
docker run -d --restart unless-stopped image_name
docker save -o ~/Desktop/docker_image image_name
把一个叫 image_name 的镜像导出为 tar 归档文件,并保存在桌面,后面可以接多个镜像名称。
docker save image_name | gzip > ~/Desktop/docker_image_zip
把镜像导出,并通过 gzip 压缩使其体积变小。
docker load -i ~/Desktop/docker_image
docker save
出来的文件可以通过 load 命令读取,可以 load 压缩过或没有压缩过的镜像文件。
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 -it container_name /bin/bash
docker exec -it container_name /bin/sh
有时候是 /bin/bash
有时候是 /bin/sh
,作用是进入 container_name 这个容器。
docker cp container_name:/path/to/the/file/you/want/to/copy 。
把 docker container 中的文件复制到本地,如果不确定 container 的文件路径,可以用 docker exec
进入 container 确认一下。
docker system prune
删除所有没有使用的 container,network,images 等,这些东西可能会占据很多硬盘空间。
docker ps
docker container ls
一样的,都是列出所有 container,docker images
就是列出所有 image。
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 一次。
docker-compose down
暂停并移除 docker-compose.yml
文件中声明的所有容器,这样 docker ps
的清单就看不到这些容器了。
docker-compose logs container_name
如果后面没有加 container_name,就显示所有容器的 logs,可以加 -f
实时显示。
相关文章: