> 技术文档 > docker 安装 使用_安装docker 完整案例

docker 安装 使用_安装docker 完整案例


Docker安装

一键安装命令

sudo curl -fsSL https://get.docker.com| bash -s docker --mirror Aliyun

启动docker

sudo service docker start

pull镜像加速配置

sudo vi /etc/docker/daemon.json

输入下列内容,最后按ESC,输入 :wq! 保存退出。

{ \"registry-mirrors\": [ \"https://docker.m.daocloud.io\", \"https://docker.1panel.live\", \"https://hub.rat.dev\" ]}

重启docker

sudo service docker restart

镜像的获取和管理

获取Docker镜像:docker pull

docker pull 镜像名称:标签

比如:

docker pull nginx # 省略标签默认为latest,拉取最新Nginx官方镜像docker pull postgres:14 # PostgreSQL 14镜像docker pull your_docker_username/project:1.0

查看管理本地镜像

列出本地镜像:docker imagesdocker image ls

docker imagesdocker image ls

删除本地镜像:docker rmidocker image rm

docker rmi 镜像id或名称

注:如果镜像正在被容器使用(即使容器已经停止),需要先删除容器。
强制删除:docker rmi -f 镜像id或名称

将docker镜像保存为.tar文件

mkdir -p ~/docker_images/docker save -o ~/docker_images/project_images.tar 镜像名字:标签

在目标机器加载镜像

docker load -i ./project_images.tar

镜像的运行

运行镜像(创建容器): docker run

docker run 选项 镜像名称:标签 命令 参数

常用选项:

-d / --detach : 后台运行

docker run -d nginx

-p 主机端口:容器端口 / --publish 端口映射:将宿主机端口映射到容器内部端口,从外部访问容器中的服务

--name 容器名称:指定容器名称,如果不指定,docker随机生成

docker run -d -p 8080:80 --name my-nginx nginx# 将主机8080映射到容器80# 访问主机:http://localhost:8080

-it : 交互式运行
-i / --interactive : 保持标准输入打开
-t / --tty : 分配伪终端(TTY)

docker run -it ubuntu:22.04 bash# 启动一个ubuntu容器并进入bash shell

--rm : 容器退出时,自动删除容器

docker run -it --rm ubuntu:22.04 bash

-v: 宿主机路径:容器内路径:权限 / --volume
权限:ro(只读)或rw(读写)

# 将本地项目代码映射到容器docker run -it --rm -p 80:80 \\-v /home/a/java-app:/app \\java-dev-image:latest bash

--network 网络名称:将容器连接到指定的Docker网络

docker run -d --network my-custom-network my-app-image

容器的管理操作

查看正在运行的容器:docker ps

docker ps```查看所有容器(包括已经停止的):`docker ps -a````bashdocker ps -a

docker compose up:基于 docker-compose.yml 创建并启动容器。
docker compose down:删除容器,再次启动时重新创建。

docker compose updocker compose down

停止容器:docker stop
保留容器及其数据。

启动容器:docker start
用来启动已经创建好的容器,不会读取 docker-compose.yml

docker stop 容器id或名称docker start 容器id或名称

进入正在运行的容器:docker exec

docker exec -it 容器id或名称 bash# 退出容器shell: exit

从容器复制文件到宿主机:docker cp 容器id或名称:/path /path
从宿主机复制文件到容器:docker cp /path 容器id或名称:/path

Docker Compose 与多服务编排

在多服务应用场景下,手动编写和管理复杂的 docker run 命令会变得非常繁琐。docker-compose 应运而生,它允许你通过一个 YAML 文件(docker-compose.yml)来定义和运行多个 Docker 容器应用。它极大地简化了多容器应用的部署和管理。

Docker Compose 的核心作用

docker-compose.yml 的作用是在 Dockerfile 构建好的镜像基础上,进一步定义这些服务在运行时如何协同工作。它关注的是整个应用栈的运行时配置和生命周期管理,例如:

  • 服务定义:你的 appfrontenddb 等,每个都是一个服务。
  • 镜像来源:可以直接引用预构建的镜像 (image: nginx),也可以指定通过 Dockerfile 构建 (build: .)。
  • 端口映射:将容器的端口映射到宿主机的端口,这是实际的对外暴露。
  • 数据卷挂载:将宿主机的文件或目录挂载到容器内部,用于数据持久化或动态配置。
  • 环境变量:向容器注入运行时所需的环境变量。
  • 命令覆盖:覆盖 Dockerfile 中定义的默认启动命令,常用于传递运行时参数。
  • 服务依赖:定义服务启动顺序,确保依赖的服务先启动。
  • 网络配置:定义服务之间的通信方式,docker-compose 会自动处理服务发现。
  • 健康检查:定义如何判断服务是否正常运行。

Dockerfile 专注于构建一个独立的、可运行的镜像,它描述的是镜像在构建时的状态和内容。而 docker-compose.yml 则专注于如何将这些独立的镜像组装起来,形成一个完整的、可部署的应用系统,并处理它们之间的协作和运行环境。这种职责分离使得 Dockerfile 可以更简洁地专注于其核心任务,而将复杂的部署细节委托给 docker-compose.yml

单独构建与运行服务

虽然 docker-compose 极大地简化了多服务管理,但理解如何单独构建和运行每个服务仍然很重要。下面我们将以你的项目为例,展示如何为每个服务单独编写 Dockerfile(如果需要)并使用 docker run 命令来启动它们。

1. 数据库服务 (db)

docker-compose.yml 中,db 服务直接使用了 postgis/postgis:17-3.4-alpine 官方镜像。通常不需要为它单独编写 Dockerfile,直接拉取并使用即可。

  • Dockerfile

如果需要为 db 服务定制镜像(例如,在镜像中预装特定的数据库扩展或初始化脚本),创建一个 Dockerfile_db

# Dockerfile_dbFROM postgis/postgis:17-3.4-alpine# 示例:如果要在构建时加入初始化脚本# COPY ./db_init_scripts/ /docker-entrypoint-initdb.d/

构建镜像 (如果创建了 Dockerfile_db):

docker build -t my-custom-postgis -f Dockerfile_db .

单独运行 db 服务的 docker run 命令

docker-compose.ymldb 服务的所有配置转换为 docker run 命令的参数。首先手动创建一个 Docker 网络,因为 docker-compose 会自动创建。

# 1. 创建网络 (如果 app-network 不存在)docker network create app-network# 2. 运行 db 服务# 注意:以下命令中的环境变量值替换为默认值,实际使用时根据需要修改。docker run -d \\ --name postgres \\ -p 54321:5432 \\ --restart always \\ -e POSTGRES_USER=\"postgres\" \\ -e POSTGRES_PASSWORD=\"postgres\" \\ -e POSTGRES_DB=\"postgis_test\" \\ -e PGDATA=\"/var/lib/postgresql/data/pgdata\" \\ -v ./volumes/db/data:/var/lib/postgresql/data \\ -v /home/a/Downloads/数据库:/docker-entrypoint-initdb.d \\ --network app-network \\ postgis/postgis:17-3.4-alpine \\ postgres -c \'max_connections=100\' \\  -c \'shared_buffers=128MB\' \\  -c \'work_mem=4MB\' \\  -c \'maintenance_work_mem=64MB\' \\  -c \'effective_cache_size=4096MB\'
2. 前端服务 (frontend)

前端服务使用 Nginx 提供静态文件和反向代理。

Dockerfile

这是项目中用于构建 frontend 镜像的 Dockerfile

# Dockerfile (for frontend)FROM nginxCOPY ./ /home/mapsysCOPY default.conf /etc/nginx/nginx.conf

构建镜像:

docker build -t front .

单独运行 frontend 服务的 docker run 命令

# 运行 frontend 服务# 确保 app-network 已经创建 (见 db 服务部分)docker run -d \\ --name frontend \\ -p 18000:80 \\ --network app-network \\ front

注意: 如果 default.conf/home/mapsys 中的内容在容器启动后需要动态更新,需要在 docker run 命令中添加 -v 参数进行卷挂载,例如:
-v ./default.conf:/etc/nginx/nginx.conf
-v /path/to/your/front/files:/home/mapsys

3. 后端应用服务 (app)

后端应用是基于 Java 的 Spring Boot 应用。

Dockerfile

项目中用于构建 app 镜像的 Dockerfile_app

# Dockerfile_app (for app)FROM openjdk:8-jreCOPY ./server/geospatial-0.0.1-SNAPSHOT.jar /usr/app/geospatial-0.0.1-SNAPSHOT.jar

构建镜像:

docker build -t app -f Dockerfile_app .

单独运行 app 服务的 docker run 命令

# 运行 app 服务# 确保 db 服务和 app-network 已经创建并运行docker run -d \\ --name java-app \\ -p 18080:8080 \\ --network app-network \\ app \\ java -jar /usr/app/geospatial-0.0.1-SNAPSHOT.jar \\ --spring.datasource.url=jdbc:postgresql://db:54321/postgis_test?stringtype=unspecified \\ --spring.datasource.username=postgres \\ --spring.datasource.password=postgres

注意: 在这个 docker run 命令中,--network app-network 是关键,它使得 java-app 容器能够通过服务名 db 访问到 postgres 容器(数据库)。