文章目录
- 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
:获取实时事件,能根据条件过滤、指定时间范围显示相关事件,例如显示docker
2016年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
网络,供各个服务之间通信。
你可以根据实际项目需求修改上述示例,例如更改镜像版本、端口映射、环境变量设置等。