文章目录
- docker 概要
- Docker基础应用相关命令回顾
- 项目打包/部署/启用/关闭/自启动/进程监听等流程
- docker compose
- 基础用法
- 项目应用
- 其他特性
- docker compose 实例
docker 概要
Docker基础应用相关命令回顾
- 容器生命周期管理命令
run:用于创建并启动新容器,有众多参数可指定容器运行的各种配置,比如端口映射(-p、-P)、交互模式(-i、-t)、后台运行(-d)、设置环境变量(-e、--env)、指定网络模式(--net)等,示例如下:- 以后台模式启动名为
mynginx的nginx:latest镜像容器:docker run --name mynginx -d nginx:latest - 进行端口映射及目录挂载启动
nginx:latest镜像容器:docker run -p 8080:80 -v /host/data:/container/data -d nginx:latest
- 以后台模式启动名为
start、stop、restart:分别用于启动已停止的容器、停止正在运行的容器、重启容器,例如:- 启动已停止的
mynginx容器:docker start mynginx - 停止运行中的
mynginx容器:docker stop mynginx - 重启
mynginx容器:docker restart mynginx
- 启动已停止的
kill:杀掉正在运行的容器,可按容器名或容器ID操作,如:docker kill tomcat7或docker kill 65d4a94f7a39。rm:用于删除一个或多个容器,可强制删除、连带删除挂载的数据卷、删除所有已停止的容器等,例如:- 强制删除
db01、db02容器:docker rm -f db01 db02 - 删除
nginx01容器并删除其挂载的数据卷:docker rm -v nginx01 - 删除所有已停止的容器:
docker rm $(docker ps -a -q)
- 强制删除
create:创建新容器但不启动它,如:docker create --name mynginx nginx:latest。exec:在运行的容器中执行命令,有分离模式、保持标准输入打开、分配伪终端等参数选项,示例:- 在
mynginx容器中以交互模式执行/root/nginx.sh脚本:docker exec -it mynginx /bin/sh /root/nginx.sh
- 在
pause、unpause:分别用于暂停和恢复容器中所有的进程,例如暂停db01容器服务:docker pause db01,恢复其服务:docker unpause db01。
- 容器查看相关命令
ps:列出容器,有多个可选参数用于按不同条件过滤、显示内容,像显示所有容器(-a)、列出最近创建的n个容器(-n)等,例如:- 列出所有在运行的容器信息:
docker ps - 列出最近创建的5个容器信息:
docker ps -n 5
- 列出所有在运行的容器信息:
inspect:获取容器/镜像的元数据,可指定返回值的模板文件等参数,比如获取正在运行的容器mymysql的IP:docker inspect --format='{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mymysql。top:查看容器中运行的进程信息,支持ps命令参数,例如查看mymysql容器的进程信息:docker top mymysql。stats:监控容器资源消耗情况,默认每隔1秒钟刷新输出内容,也可通过参数只输出当前状态、指定要显示的容器等,如:docker stats或docker stats --no-stream或docker stats --no-stream 容器ID/容器名。events:获取实时事件,能根据条件过滤、指定时间范围显示相关事件,例如显示docker2016年7月1日后的所有事件:docker events --since="2016-07-01"。logs:获取容器的日志,可跟踪日志输出、指定开始时间、显示时间戳、限定显示最新条数等,例如跟踪查看mynginx容器的日志输出:docker logs -f mynginx。
- 容器文件系统相关命令
export:将文件系统作为一个tar归档文件导出到STDOUT,可指定输出到文件,如:docker export -o mysql-date +%Y%m%d.tar a404c6c174a2。port:列出指定容器的端口映射情况,如查看mymysql容器的端口映射:docker port mymysql。commit:从容器创建一个新的镜像,需指定提交的镜像作者、说明文字等参数,例如:docker commit -a "guodong" -m "my db" a404c6c174a2 mymysql:v1。cp:用于容器与主机之间的数据拷贝,有保持链接等参数选项,比如将主机目录拷贝到容器、将容器目录拷贝到主机等操作示例。diff:检查容器里文件结构的更改,如查看mymysql容器的文件结构更改:docker diff mymysql。
- 镜像仓库相关命令
login、logout:分别用于登录、登出Docker镜像仓库,可指定用户名、密码以及仓库地址,例如登录到Docker Hub:docker login -u 用户名 -p 密码,登录到私有远程镜像仓库:docker login harbor.guodong.io,登出Docker Hub:docker logout。pull:从镜像仓库中拉取或更新指定镜像,能拉取所有标记镜像、指定系统架构的镜像等,例如从Docker Hub下载java最新版镜像:docker pull java,下载指定架构的nginx:latest镜像:docker pull --platform=arm64 nginx:latest。push:将本地的镜像上传到镜像仓库,要先登录到镜像仓库,如上传本地镜像myapache:v1到镜像仓库中:docker push myapache:v1。search:从Docker Hub查找镜像,可按条件过滤列出指定的镜像,例如查找所有镜像名包含java且收藏数大于10的镜像:docker search -f stars=10 java。
- 本地镜像管理命令
images:列出本地镜像,有多个参数可按不同要求显示镜像信息,像列出本地所有镜像(-a)、显示满足条件的镜像(-f)等,例如查看本地镜像列表:docker images。rmi:删除本地一个或多个镜像,可强制删除,如强制删除本地镜像guodong/ubuntu:v4:docker rmi -f guodong/ubuntu:v4。tag:标记本地镜像,将其归入某一仓库,例如将ubuntu:15.10标记为runoob/ubuntu:v3镜像:docker tag ubuntu:15.10 runoob/ubuntu:v3。build:使用Dockerfile创建镜像,有众多参数可设置创建时的变量、网络模式、内存限制等各种配置,例如使用当前目录的Dockerfile创建镜像并指定标签:docker build -t runoob/ubuntu:v1.。history:查看指定镜像的创建历史,有格式化打印、显示完整记录等参数选项,比如查看本地镜像guodong/ubuntu:v3的创建历史:docker history guodong/ubuntu:v3。save:将指定镜像保存成tar归档文件,需指定输出到的文件,如:docker save -o my_ubuntu_v3.tar runoob/ubuntu:v3。load:导入使用docker save命令导出的镜像,例如:docker load --input fedora.tar。import:从归档文件中创建镜像,要指定应用的docker指令、提交说明文字等,如从my_ubuntu_v3.tar创建镜像并命名:docker import my_ubuntu_v3.tar runoob/ubuntu:v4。
- 基础版本信息命令
info:显示Docker系统信息,包括镜像和容器数等,使用命令:docker info。version:显示Docker版本信息,通过命令:docker version查看。
项目打包/部署/启用/关闭/自启动/进程监听等流程
- 打包:在Docker中,项目打包通常是通过编写
Dockerfile文件来定义镜像的构建过程,在Dockerfile中可以指定基础镜像、安装项目依赖、拷贝项目文件、设置环境变量、指定启动命令等内容,然后使用docker build命令基于Dockerfile构建出项目对应的镜像,这就完成了项目的打包操作,例如一个简单的Python项目的Dockerfile可能如下:
FROM python:3.8
WORKDIR /app
COPY requirements.txt.
RUN pip install -r requirements.txt
COPY..
CMD ["python", "app.py"]
接着执行docker build -t my_project_image:v1.来构建镜像(假设此Dockerfile在项目根目录下)。
- 部署:部署项目时,先确保所需的镜像存在(可以通过
docker pull拉取公共镜像或者自己构建好镜像),然后使用docker run命令按照项目需求启动容器,进行端口映射、挂载数据卷等配置,使项目在容器中运行起来,对外提供服务。比如部署一个Web应用,将容器内的80端口映射到主机的8080端口运行:docker run -d -p 8080:80 my_web_app_image。 - 启用:对应容器相关就是启动容器,使用
docker start命令针对已停止的容器启动让其运行,例如docker start my_container,对于项目而言就是启动容器让打包在里面的项目开始提供相应服务。 - 关闭:通过
docker stop命令可以停止正在运行的容器来关闭项目服务,像docker stop my_container,项目所在容器停止运行后就不再对外提供服务了。 - 自启动:Docker本身可以通过一些方式配置容器随宿主机启动而自动启动,一种常见的是使用
docker run时添加--restart=always参数,例如docker run --restart=always -d -p 8080:80 my_web_app_image,这样在宿主机重启后,对应的容器会自动启动,进而项目自动启动运行。另外,也可以通过一些系统层面的服务管理工具(如systemd等,在Linux系统下)结合相关的脚本配置来实现更复杂的自启动管理。 - 进程监听:在Docker中可以通过
docker top命令查看容器内运行的进程信息来了解项目相关进程的情况,也可以使用docker stats命令监控容器资源使用情况,间接了解项目进程对资源的占用情况以及是否正常运行等;还可以结合docker logs命令查看容器日志,从日志输出中分析项目进程的运行状态、是否有报错等信息来实现对项目进程的监听。
docker compose
以下是对Docker Compose基础用法及项目应用等常用信息的总结整理:
基础用法
- 文件结构与配置
docker-compose.yml文件:这是核心配置文件,是一个YAML格式文件。version:指定文件版本,不同版本语法和功能有差异,如3.8等常用版本。services:定义应用中的各个服务。image:指定服务使用的Docker镜像,例如image: nginx:latest。build:用于构建镜像的配置,包含context(Dockerfile所在目录)和dockerfile(Dockerfile文件名),如build: {context:./app, dockerfile: Dockerfile}。ports:设置端口映射,格式为"主机端口:容器端口",像- "80:80"。volumes:挂载卷,可实现数据持久化或主机与容器间目录共享,如-./html:/usr/share/nginx/html。networks:指定服务使用的网络,如- webnet。environment:配置环境变量,如environment: {POSTGRES_DB: mydatabase, POSTGRES_USER: user, POSTGRES_PASSWORD: password}。depends_on:定义服务依赖关系,确保相关服务按顺序启动,例如depends_on: - db。
volumes:定义数据卷,如db_data:,用于持久化数据,防止容器销毁导致数据丢失。networks:定义网络,Compose默认有bridge网络,也可自定义,如webnet:。
- 命令操作
- 启动服务:
docker-compose up:在前台启动所有定义在docker-compose.yml文件中的服务,并显示日志输出。docker-compose up -d:在后台启动服务,使容器在后台运行并返回终端控制权。
- 停止服务:
docker-compose down,停止并删除所有由docker-compose启动的容器,清理相关资源。 - 查看服务状态:
docker-compose ps,列出所有由docker-compose启动的容器及其状态,包括容器名、命令、状态、端口等信息。 - 查看服务日志:
docker-compose logs,可查看各个服务的日志信息,有助于排查问题。 - 重新构建服务:
docker-compose build,根据docker-compose.yml文件中的build配置重新构建服务对应的镜像。
- 启动服务:
项目应用
- 微服务架构实现:适用于现代微服务架构应用程序,可将应用拆分为多个独立服务(如数据库服务、Web服务、缓存服务等),每个服务运行在独立容器中,便于独立开发、部署和扩展。例如一个博客应用可拆分为前端Web服务器、后端API服务器、数据库服务器等分别在不同容器中运行。
- 依赖管理:能轻松定义和管理复杂应用程序的依赖关系。如Web应用依赖Web服务器、数据库和缓存系统等,通过
docker-compose.yml文件中的depends_on等配置确保所有组件按预期启动和运行。 - 简化开发和测试环境:保证开发环境与生产环境的一致性。通过
docker-compose可以定义统一的开发、测试和生产环境配置,减少因环境差异导致的问题,使在本地开发测试的环境与部署到服务器上的环境尽量相同。 - 网络配置优势:自动为所有定义的服务创建专用网络,服务之间可直接通过服务名互相通信,无需复杂的网络设置。例如在
docker-compose.yml文件中定义的服务,在同一网络下,web服务可直接通过db服务名访问数据库服务,而不需要知道数据库容器的具体IP地址。
其他特性
- 使用
.env文件设置环境变量:可以创建.env文件设置环境变量,在docker-compose.yml文件中通过${变量名}引用,便于在不同环境中灵活配置,如设置数据库连接信息等环境变量,避免在docker-compose.yml文件中硬编码敏感信息。 - 多个Compose文件使用:在复杂应用中,可使用多个Compose文件,如
docker-compose.yml作为基本配置,docker-compose.override.yml用于覆盖或扩展基本配置。启动时通过docker-compose -f docker-compose.yml -f docker-compose.override.yml up指定多个文件来灵活构建不同环境(如开发环境和生产环境)的应用配置。
docker compose 实例
以下是一个较为完整的docker-compose.yml项目应用示例文件,用于构建一个包含Web应用(使用Node.js + Express)、数据库(MySQL)以及缓存(Redis)的应用架构:
version: '3.8'
services:# Web应用服务web:build:context:.dockerfile: Dockerfile.webports:- "3000:3000"volumes:-.:/appnetworks:- app_networkdepends_on:- db- redisenvironment:DB_HOST: dbREDIS_HOST: redis# 数据库服务db:image: mysql:8.0ports:- "3306:3306"volumes:- db_data:/var/lib/mysqlnetworks:- app_networkenvironment:MYSQL_ROOT_PASSWORD: root_passwordMYSQL_DATABASE: my_database# 缓存服务redis:image: redis:latestports:- "6379:6379"networks:- app_networkvolumes:db_data:networks:app_network:
在上述示例中:
version指定了docker-compose文件的版本为3.8。services下定义了三个服务:web、db和redis。web服务通过build指定从当前目录下的Dockerfile.web构建镜像,将主机的3000端口映射到容器内的3000端口,挂载当前目录到容器内的/app目录,连接到app_network网络,依赖db和redis服务,并设置了数据库和缓存的主机环境变量。db服务使用mysql:8.0镜像,映射3306端口,定义db_data数据卷用于持久化数据,连接app_network网络,并设置了MySQL的 root 密码和数据库名等环境变量。redis服务使用redis:latest镜像,映射6379端口并连接app_network网络。
volumes定义了db_data数据卷。networks定义了app_network网络,供各个服务之间通信。
你可以根据实际项目需求修改上述示例,例如更改镜像版本、端口映射、环境变量设置等。
