Docker 常用命令可以分为:镜像管理、容器操作、镜像仓库操作、数据卷管理、网络管理等。
一 镜像管理
# 拉取镜像 - docker pull [镜像名]:[标签]
#拉取官方nginx镜像的最新版本
#拉去公共仓库的公共镜像无需docker login, 拉取私有仓库/私有镜像必须先 docker login [仓库地址]
$ docker pull nginx:latest
#列出所有已下载的镜像
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
apache/airflow 2.8.0 3accc302611d 21 months ago 1.44GB
apache/airflow 2.7.2 dad28d0405d6 21 months ago 1.54GB
postgres 13 135171763bd4 21 months ago 413MB
redis latest e40e2763392d 21 months ago 138MB
centos centos7 eeb6ee3f44bd 3 years ago 204MB
#删除镜像 - docker rmi [镜像ID/镜像名:标签]
$ docker rmi nginx:latest
# 为本地镜像创建一个新的标识,便于后续推送至远程仓库或进行版本管理。
# 当需要将本地镜像推送到远程仓库(如 Docker Hub、私有仓库)时,
# 仓库要求镜像标签必须包含用户名 / 组织名(类似代码仓库的 "用户名 / 项目名" 格式),否则无法推送.
# 构建本地镜像然后发布到dockerhub的流程如下:
## step1.本地构建了一个镜像 myapp:v1;
## step2.用 docker tag myapp:v1 username/myapp:v1 标记为符合仓库规范的标签;
## step3.推送至远程仓库:docker push username/myapp:v1;
## step4.其他人可以通过 docker pull username/myapp:v1 拉取这个镜像使用。
$ docker tag myapp:v1 username/myapp:v1
docker images 查看的本机镜像, 实际存储路径取决于操作系统和 Docker 的配置。
在 Linux 中,Docker 镜像、容器、数据卷等所有数据默认存储在 /var/lib/docker/ 目录下。其中镜像文件的核心数据位于/var/lib/docker/image/<存储驱动>/ 。
<存储驱动> 是 Docker 使用的镜像存储驱动(可通过 docker info | grep “Storage Driver” 查看),最常见的是 overlay2,因此实际路径通常为:/var/lib/docker/image/overlay2/
二 容器操作
2.1 查看容器
#查看docer是否安装以及docker版本
$ docker --version
Docker version 24.0.7, build afdd53b
#显示当前处于 Up 状态的容器(即已启动且正常运行的容器)
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
34d483f16a11 submit:xyz "/share/Scripts/real…" 4 minutes ago Up 4 minutes realtime_min_alpha
# 查看本机所有容器(无论是否运行,如已停止的、崩溃的)
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dd75d0e4e073 harbor.me/myname/myexe:1.1 "./myexe" 8 weeks ago Exited (137) 8 weeks ago myexec
# 查看容器「详细信息」(如 IP、挂载、环境变量)
$ docker inspect dd75d0e4e073
# inspect会输出非常多的信息,可以使用-f 选项来过滤信息
# 查看镜像名 + 镜像 ID
$ docker inspect -f 'Image: {{.Config.Image}}, ImageID: {{.Image}}' dd75d0e4e073
Image: harbor.me/myname/myexe:1.1, ImageID: sha256:57a9e4f68be6ed5a6d0c152b5cac6ee78c5ae2b617cb75be3901e3db93dc33ff
# 查看容器挂载的所有路径
$ docker inspect -f '{{range .Mounts}}{{.Source}} -> {{.Destination}} ({{.Type}}) {{end}}' dd75d0e4e073
/share/NFS/Data -> /opt/appdata (bind)
docker ps输出各字段含义:
- CONTAINER ID 容器唯一 ID(短 ID,用于后续操作如停止、删除容器)
- IMAGE 启动容器所用的镜像(如 nginx:latest、mysql:8.0)
- COMMAND 容器启动时执行的命令(如 nginx -g ‘daemon off;’)
- CREATED 容器创建时间(如 2 hours ago 表示 2 小时前)
- STATUS 容器状态(Up 2 hours 表示运行 2 小时,Up 5 minutes (healthy) 表示健康检查正常)
- PORTS 端口映射(如 0.0.0.0:8080->80/tcp 表示本机 8080 端口映射到容器 80 端口)
- NAMES 容器名称(默认自动生成,如 quirky_johnson,也可手动指定)
2.2 创建并运行容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
- -d: 后台运行容器并返回容器 ID
- –restart: 容器的重启策略(如 no、on-failure、always、unless-stopped)
no:容器退出时不重启
on-failure:容器故障退出(返回值非零)时重启
always:容器退出时总是重启 - -p: 端口映射,格式为 host_port:container_port
- -v: 挂载卷,格式为 host_dir:container_dir
比如使用如下kafka_start.sh脚本来启动kafka:
#!/bin/bash
docker run -d --restart always --name kafka \
-v /data/app/kafka/data:/app/kafka/data \
-v /app/kafka/log:/app/kafka/log \
-v /app/kafka/conf/server.properties:/app/kafka/config/server.properties \
-p 9091:9091 \
-p 9092:9092 \
harbor.me/myusername/kafka3.6.1:1.0.0
2.3 启动/停止/重启 容器
docker run 相当于「创建容器 + 启动容器」的组合操作;docker start 则是启动已经存在的容器(该容器可能是之前用 docker run 创建后被停止的,或者是通过docker create 创建但未启动的)。
docker run需要指定 镜像名,并可携带容器创建时的参数(如端口映射 -p、数据卷 -v、容器名 --name 等)。这些参数仅在创建容器时生效,一旦容器创建,参数无法修改。而docker start不需要指定镜像,只需提供 容器 ID 或容器名,且不能再添加创建时的参数(因为容器已存在,参数已固定)。
# 启动已停止的容器
docker start [容器ID/容器名]
# 停止运行中的容器
docker stop [容器ID/容器名]
# 重启容器
docker restart [容器ID/容器名]
2.4 进入运行中的容器
# docker exec -it [容器ID/容器名] [shell命令]
# 示例:进入mynginx容器的bash终端
docker exec -it mynginx /bin/bash
2.5 查看容器日志
# docker logs [-f] [容器ID/容器名]
# 示例:实时查看mynginx的日志 (-f表示实时跟踪)
docker logs -f mynginx
2.6 删除容器
docker rm [容器ID/容器名]
# 强制删除运行中的容器(谨慎使用)
docker rm -f [容器ID/容器名]
三 镜像仓库操作
docker login [仓库地址] # 不填地址默认登录Docker Hub
docker push [仓库地址/用户名/镜像名:标签] #推送至Docker Hub的个人仓库
docker logout [仓库地址] # 退出镜像仓库登录
四 数据卷管理
数据卷(Volume)用于持久化容器数据,避免容器删除后数据丢失。
docker volume create [卷名] #创建数据卷
docker volume ls #查看数据卷
docker volume inspect [卷名] #查看数据卷详情
docker volume rm [卷名] #删除数据卷
docker run -v 是在启动容器时挂载数据卷或绑定主机目录的命令,它有3种主要用法:
- 先通过 docker volume create 创建命名卷,再用 -v 挂载到容器;
- 如果 -v 中指定的卷名不存在,Docker 会自动创建一个匿名卷(随机名称);
- -v 也能直接挂载主机目录到容器。这种方式不是 docker volume 管理的卷,而是直接关联主机文件系统,适用于开发时实时同步代码。
五 网络管理
#创建网络
docker network create [网络名]
#查看网络
docker network ls
#连接容器到网络
docker network connect [网络名] [容器名]
#删除网络
docker network rm [网络名]
六 docker系统管理
#查看 Docker 系统信息,包括镜像、容器数量,存储使用等
docker info
#查看docker版本
docker version
七 Docker compose
Docker Compose 是 Docker 官方提供的工具,用于定义和运行多容器 Docker 应用。当你的应用需要多个容器协同工作(例如:一个 Web 服务 + 一个数据库 + 一个缓存服务)时,Compose 可以通过一个 YAML 配置文件定义所有容器的配置,然后用一条命令启动 / 管理整个应用栈。
参考资料【1】中是使用docker compose安装和启动airflow的官方文档,总结下来的步骤就是:
# 创建本地airflow目录 ,比如在自己home目录下创建airflow/目录
mkdir airflow
cd airflow
#下载官方给的 https://airflow.apache.org/docs/apache-airflow/3.0.6/docker-compose.yaml文件;
curl -LfO 'https://airflow.apache.org/docs/apache-airflow/3.0.6/docker-compose.yaml'
# Setting the right Airflow user
mkdir -p ./dags ./logs ./plugins ./config
echo -e "AIRFLOW_UID=$(id -u)" > .env
#Initialize airflow.cfg (Optional)
docker compose run airflow-cli airflow config list
#Initialize the database
docker compose up airflow-init
#启动airflow所有服务
docker compose up
docker-compose.yaml 可以根据需求改动的点:
#common中增加几个volume,增加ulimits限制文件数
x-airflow-common:
volumes:
- ${AIRFLOW_PROJ_DIR:-.}/airflow.cfg:/opt/airflow/airflow.cfg
- /etc/localtime:/etc/localtime
- public-nfs:/mnt/Public
ulimits:
nofile:
soft: 1048576
hard: 1048576
#postgres配置增加volume 本地目录与docker目录mapping
postgres:
volumes:
- /home/username/airflow/postgresql/data:/var/lib/postgresql/data
#airflow-cli增加volumes mapping
airflow-cli:
volumes:
- ${AIRFLOW_PROJ_DIR:-.}:/sources
- ${AIRFLOW_PROJ_DIR:-.}/dags:/opt/airflow/dags
- public-nfs:/mnt/Public
#增加通用的volume
volumes:
public-volume:
driver: local
driver_opts:
type: 'none'
device: '/mnt/public'
o: 'bind'
public-nfs:
driver: local
driver_opts:
type: 'nfs'
o: 'addr=10.1.110.120,nolock,rw'
device: ':/mnt/main/public'
#指定subnet用于services之间的通信
networks:
default:
name: airflow_network
ipam:
driver: default
config:
- subnet: 10.103.0.0/16
八 FAQ
8.1 如何判断一个docker容器是用docker run命令启动的还是用docker compose 启动的?
用如下命令检查容器的标签,如果标签里面带有com.docker.compse,则说明是使用docker compose启动的。
$ docker inspect airflow-airflow-webserver-1 --format '{{json .Config.Labels}}' | jq
{
"com.docker.compose.config-hash": "7aeca36c389b316ea20d31e4006af8db4e350dbfe9273a65997af7b1a2a33b1d",
"com.docker.compose.container-number": "1",
"com.docker.compose.depends_on": "postgres:service_healthy:false,airflow-init:service_completed_successfully:false,redis:service_healthy:false",
"com.docker.compose.image": "sha256:8dc5d7cb0f9d3adb7b1509f90bf879110eea65dd46666448fcb32c55bb967733",
"com.docker.compose.oneoff": "False",
"com.docker.compose.project": "airflow",
"com.docker.compose.project.config_files": "/home/username/airflow/docker-compose.yaml",
"com.docker.compose.project.working_dir": "/home/username/airflow",
"com.docker.compose.service": "airflow-webserver",
"com.docker.compose.version": "2.21.0",
8.2 如何给容器挂载NFS卷?
九 参考资料
【1】https://airflow.apache.org/docs/apache-airflow/stable/howto/docker-compose/index.html