基本操作
Docker是一个开源的应用容器引擎,使用Docker可以更轻松地创建、部署和运行应用程序。下面介绍Docker的一些基本操作,主要包括镜像操作、容器操作、仓库操作这几个方面:
镜像操作
- 搜索镜像:使用
docker search
命令可以搜索Docker Hub上的镜像。例如,搜索Nginx镜像:
docker search nginx
该命令会列出与Nginx相关的镜像,包含镜像的名称、描述、星级评价等信息。
- 拉取镜像:通过
docker pull
命令将镜像从仓库拉取到本地。比如拉取最新版本的Nginx镜像:
docker pull nginx
也可以指定镜像的标签(版本号),例如拉取Nginx的1.23.3版本:
docker pull nginx:1.23.3
- 查看本地镜像:使用
docker images
命令查看本地已下载的镜像列表,包括镜像的仓库名、标签、镜像ID、创建时间和大小等信息。
docker images
- 删除镜像:利用
docker rmi
命令可以删除本地镜像。例如删除名为nginx
的镜像:
docker rmi nginx
如果镜像被多个容器引用,需要先停止并删除相关容器才能删除镜像;若要强制删除,可以使用-f
选项。
- 创建镜像:常见的创建镜像方式是通过编写
Dockerfile
文件,然后使用docker build
命令构建。例如,在包含Dockerfile
的目录下执行以下命令构建镜像,-t
参数用于指定镜像的名称和标签:
docker build -t my-nginx .
.
表示Dockerfile所在的当前目录。
- 镜像打标签:
docker tag
命令用于给镜像添加标签,方便镜像的管理和分发。比如给本地的nginx
镜像添加一个新标签my-nginx:v1
:
docker tag nginx my-nginx:v1
容器操作
- 运行容器:使用
docker run
命令可以基于镜像创建并运行一个容器。例如,运行一个Nginx容器,并将容器的80端口映射到主机的8080端口:
docker run -d -p 8080:80 nginx
其中,-d
表示以后台模式运行容器;-p
指定端口映射规则,格式为主机端口:容器端口
。
- 查看容器:
docker ps
命令用于查看正在运行的容器列表,包括容器的ID、镜像、状态、端口映射等信息。如果要查看所有容器(包括已停止的),可以使用docker ps -a
命令。
docker ps
docker ps -a
- 停止和启动容器:通过
docker stop
命令可以停止正在运行的容器,例如停止ID为container_id
的容器:
docker stop container_id
要重新启动已停止的容器,使用docker start
命令:
docker start container_id
- 进入容器:
docker exec
命令允许在正在运行的容器中执行命令。例如,进入正在运行的Nginx容器的Shell环境:
docker exec -it container_id bash
-i
选项表示交互式操作,-t
选项分配伪终端。
- 删除容器:使用
docker rm
命令删除已停止的容器。例如删除ID为container_id
的容器:
docker rm container_id
如果要删除正在运行的容器,可以使用-f
选项强制删除。
- 查看容器日志:
docker logs
命令用于查看容器的日志信息。例如查看Nginx容器的日志:
docker logs container_id
仓库操作
- 登录Docker Hub:使用
docker login
命令登录Docker Hub仓库,需要输入用户名和密码:
docker login
- 推送镜像到仓库:在登录成功后,使用
docker push
命令可以将本地镜像推送到Docker Hub仓库。例如推送名为my-nginx:v1
的镜像:
docker push my-nginx:v1
- 从仓库拉取镜像:除了前面提到的
docker pull
命令外,当镜像推送至私有仓库时,登录私有仓库后,同样使用docker pull
命令拉取指定镜像。
以上就是Docker的一些基本操作,通过这些操作,能够满足日常开发、测试和部署容器化应用的大部分需求。
日志操作
在Docker中查看容器日志是排查应用问题、监控运行状态的关键操作。以下是查看容器日志的常用方法及场景说明:
一、基础命令:docker logs
1. 查看完整日志
docker logs <容器ID或名称>
- 示例:查看Nginx容器的所有日志
docker logs nginx-container
2. 实时跟踪日志(类似tail -f
)
docker logs -f <容器ID或名称>
- 场景:调试启动失败的容器(如应用崩溃)
docker logs -f my-app
3. 查看最近N行日志
docker logs --tail <行数> <容器ID或名称>
- 示例:查看最近50行日志
docker logs --tail 50 my-container
4. 按时间戳过滤日志
docker logs --since <时间点> <容器ID或名称>
- 示例:查看从2023-01-01之后的日志
docker logs --since "2023-01-01T00:00:00" my-container
二、进阶技巧
1. 格式化输出时间戳
docker logs --timestamps <容器ID或名称>
- 输出示例:
2023-10-15T12:34:56.789000000Z Hello from container
2. 结合grep
搜索关键词
docker logs <容器ID或名称> | grep "ERROR"
- 场景:快速定位错误信息
docker logs my-app | grep "Exception"
3. 查看JSON格式日志(原始格式)
docker logs --details <容器ID或名称>
- 场景:获取完整元数据(如容器标签、环境变量)
三、日志驱动与持久化
1. 查看当前日志驱动
docker inspect <容器ID或名称> | grep LogDriver
- 常见驱动:
json-file
(默认)、journald
、syslog
、fluentd
等
2. 自定义日志存储位置
在docker run
时通过--log-opt
参数配置:
docker run --log-opt max-size=10m --log-opt max-file=3 ...
- 作用:限制单日志文件大小(10MB)和文件数量(3个),防止磁盘占满
四、第三方工具
1. 容器编排平台集成
- Kubernetes:使用
kubectl logs
命令kubectl logs <Pod名称>
- Docker Compose:使用
docker-compose logs
命令docker-compose logs -f service-name
2. 日志聚合工具
- ELK Stack(Elasticsearch + Logstash + Kibana)
- 配置容器日志发送到Logstash,通过Kibana可视化查询
- Fluentd + Grafana
- Fluentd收集日志,Grafana实现实时监控
五、常见问题排查
1. 日志为空
- 检查容器是否真的有日志输出(应用内是否打印日志)
- 查看日志驱动是否配置为
none
(禁用日志)
2. 日志文件过大
- 清理旧日志:
docker system prune -a
- 配置日志轮转(Log Rotation):
重启Docker服务生效:# 创建/etc/docker/daemon.json { "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } }
systemctl restart docker
小结
- 基础命令:
docker logs
+ 选项(-f
,--tail
,--since
) - 高级用法:结合
grep
、时间过滤、JSON格式 - 持久化与聚合:配置日志驱动、集成ELK/Fluentd等工具
合理利用这些方法,可高效定位容器运行问题,提升运维效率。
docker中执行命令
在Docker中执行命令主要有以下几种常见的方式,分别适用于不同的场景,以下是详细介绍:
一、在运行容器时执行命令
使用docker run
命令在基于镜像创建并启动容器的同时,可以指定要执行的命令。
- 执行一次性命令:
当你希望容器执行一个特定的任务后就退出,可以直接在docker run
命令后加上要执行的命令。例如,使用busybox
镜像来执行一个简单的echo
命令:
docker run busybox echo "Hello, Docker!"
上述命令会基于busybox
镜像启动一个容器,在容器中执行echo "Hello, Docker!"
命令,输出结果后容器就会停止运行。
- 进入容器的交互式Shell:
若要进入容器的交互式Shell环境,以便在容器中执行多个命令,可以使用-it
选项。例如,进入一个基于ubuntu
镜像的容器的Shell:
docker run -it ubuntu bash
这里,-i
表示以交互模式运行容器,-t
为容器分配一个伪终端,bash
是要在容器中执行的Shell命令。进入后,就可以在容器内执行诸如apt update
、apt install
等其他命令了,操作完成后,输入exit
即可退出容器。
二、在已运行的容器中执行命令
对于已经在运行的容器,可以使用docker exec
命令来执行命令。
- 执行单个命令:
比如,你已经启动了一个nginx
容器,现在想查看容器内nginx
的配置文件内容,可以使用以下命令:
docker exec <容器ID或容器名称> cat /etc/nginx/nginx.conf
将<容器ID或容器名称>
替换为实际的容器标识,上述命令会在运行的nginx
容器中执行cat /etc/nginx/nginx.conf
命令,输出nginx
的配置文件内容。
- 进入容器的交互式Shell:
同样使用-it
选项,例如进入正在运行的ubuntu
容器的Shell:
docker exec -it <容器ID或容器名称> bash
进入后,就可以进行各种交互式操作,如安装软件、查看日志等,退出时同样输入exit
。
- 在容器中执行脚本:
如果有一个脚本文件需要在容器中执行,可以先将脚本文件复制到容器内(使用docker cp
命令),然后再通过docker exec
来执行。例如,将本地的test.sh
脚本复制到容器my-container
的/tmp
目录下,然后执行:
docker cp test.sh my-container:/tmp/
docker exec my-container bash /tmp/test.sh
三、使用Dockerfile定义默认执行命令
在编写Dockerfile
时,可以使用CMD
或ENTRYPOINT
指令来定义容器启动时默认执行的命令。
- CMD指令:
CMD
指令用于指定一个容器启动时要执行的默认命令。一个Dockerfile
中只能有一个CMD
指令,如果指定了多个,只有最后一个会生效。例如:
FROM ubuntu
CMD ["echo", "This is a default command"]
当使用这个镜像创建并启动容器时,会执行echo "This is a default command"
这条命令。
- ENTRYPOINT指令:
ENTRYPOINT
指令也用于指定容器启动时要执行的命令,但它更常用于设置一个可执行的“入口点”,后续通过docker run
传入的参数会被当作该命令的参数。例如:
FROM ubuntu
ENTRYPOINT ["bash", "-c"]
CMD ["echo", "This is a default command"]
此时,你可以在启动容器时传入额外的参数来覆盖CMD
中的命令,如:
docker run <镜像名称> echo "Override default command"
上述命令会执行bash -c echo "Override default command"
,覆盖了原来CMD
指定的默认命令。
通过以上不同方式,你可以根据具体需求在Docker容器中灵活地执行各种命令,实现对容器内应用的管理和操作。