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

国内镜像

  1. https://1ms.run/
  2. https://docker.aityp.com/
  3. https://docker.xuanyuan.run/
  4. https://astrdark.cyou/
  5. https://github.com/DaoCloud/public-image-mirror
  6. https://linuxmirrors.cn/mirrors/
  7. Docker 镜像加速器列表