docker常用命令
Takeout
镜像(image)是模板,容器(container)是实例。
# 查看正在运行的容器
docker ps
# 同上,包括已经停止的容器
docker ps -a
# 查看容器运行状态,CPU、MEM、NET
docker stats <container>
# 查看镜像
docker images
# 删除镜像
docker rmi <image>
# 删除容器
docker rm <container>
# 查看volume
docker volume ls
# 查看容器日志,追加显示,从倒数第十行显示
docker logs -f <container> --tail 10
# 查看volume详情
docker volume inspect <volume>
# 查看容器详情
docker inspect <container>
# 在已运行的容器中执行命令,下面是一个经典的案例
docker exec -it <container> /bin/bash
# 查看各镜像/容器/volume占用空间
docker system df -v
docker compose
# 拉起服务,-d表示detach
docker compose up -d
# 关闭服务,移除相关容器
docker compose down
# 列出当前app(compose.yml)相关的容器状态,相当于批量docker stats ...
docker compose stats
镜像拉取技巧
docker compose根据compose.yml中的配置自己拉取镜像,然后创建容器,启动容器。但受限于国内网络环境,很多时候镜像是拉不下来的。这时,可以自己使用国内镜像源pull镜像,然后给镜像打标签使之与compose.yml中保持一致。这样再执行docker compose up时,就会检测到已经有镜像了,直接创建启动。
docker compose 网络组织技巧
如果有某个容器可用于多个compose project,那么可将该容器单独拆出来,用一个compose或这docker run命令启动,为其创建一个专用的docker网络。然后在需要访问这个容器服务的compose project(全部service或部分service),加入之前创建的专用网络即可。
特别适用于redis、nginx之类的通用服务。
例如我创建了一个onlyoffice容器服务,
services:
office:
container_name: office
image: thomisus/onlyoffice-documentserver-unlimited:9.2.1
restart: always
ports:
- "8080:80"
volumes:
- ~/app/onlyoffice/logs:/var/log/onlyoffice
- ~/app/onlyoffice/data:/var/www/onlyoffice/Data
- ~/app/onlyoffice/lib:/var/lib/onlyoffice
- ~/app/onlyoffice/db:/var/lib/postgresql
environment:
- JWT_ENABLED=true
- JWT_SECRET=${OO_JWT_SECRET}
- ALLOW_PRIVATE_IP_ADDRESS=true
networks:
- office-lan # 使用这个专用网络
# 创建一个专用网络
networks:
office-lan:
name: office-lan在另一个compose project中,我可以这样使用,
services:
app:
image: docker.1ms.run/library/nextcloud:32-fpm-alpine
restart: always
...
web:
container_name: nginx-server
image: docker.1ms.run/library/nginx:alpine-slim
restart: always
depends_on:
- app
ports:
- 8081:80
volumes:
- ./nginx-alpine-add-user.sh:/docker-entrypoint.d/99-adduser.sh:ro
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./nextcloud-subpath.conf:/etc/nginx/nextcloud-subpath.conf:ro
- ~/app/nextcloud/data:/var/www/nextcloud
networks:
- default # keep default for other communications
- office-lan # for communication with onlyoffice
networks:
office-lan:
external: true # 告诉compose,这是外部网络,不用内部创建。否则会创建一个 <compose_project>_office-lan 的网络,且不会创建 <compose_project>_default 网络。如此一来web服务和office服务网络可以互通,而app服务和office之间不互通。
docker compose 会默认创建
<compose_project>_default网络,然后将所有服务加入这个网络。compose_proejct 一般是compose.yml所在的文件夹名称。
查看一个匿名卷是由哪个容器创建
$ docker volume ls
DRIVER VOLUME NAME
local 177ff7f7c86698e16d95db624acc827af3ccd59785bf6c58f4bfcf5f5aab01c1
local 710bc4384e882c974ebb51b6b5e5d9a2c0427e59f9705a909f70207f92317753
local 78665eb41d5d1986f347be859cb0b756a1aae9a28c62cb3a092af0b594ece754
local e83f58812409292e878c5c096385ee17ac69305178800404f14dbe51613f96eb
local paperless_data
local paperless_media
local paperless_pgdata
local paperless_redisdata
$ docker ps -a --filter volume=e83f58812409292e878c5c096385ee17ac69305178800404f14dbe51613f96eb
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
903861e37bb2 redis:latest "docker-entrypoint.s…" 19 hours ago Up 19 hours 6379/tcp nextcloud-redis-1