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 images
或 docker image ls
docker images
docker image ls
删除本地镜像:docker rmi
或 docker 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````bash
docker ps -a
docker compose up
:基于 docker-compose.yml
创建并启动容器。
docker compose down
:删除容器,再次启动时重新创建。
docker compose up
docker 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
构建好的镜像基础上,进一步定义这些服务在运行时如何协同工作。它关注的是整个应用栈的运行时配置和生命周期管理,例如:
- 服务定义:你的
app
、frontend
、db
等,每个都是一个服务。 - 镜像来源:可以直接引用预构建的镜像 (
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_db
FROM 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.yml
中 db
服务的所有配置转换为 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 nginx
COPY ./ /home/mapsys
COPY 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
容器(数据库)。