一、Docker 介绍

Docker 是开源的应用程序容器引擎,环境打包可移植,不同容器相互隔离,目的是解决软件的跨环境迁移问题,Docker 内的配置不会对主机造成影响。

为什么要选择 Docker?

轻量级:比传统虚拟机占用更少资源
可移植:跨平台一致性,开发与生产环境无差异
敏捷性:开发者可快速构建、测试与部署
强大生态:拥有庞大的镜像仓库与社区支持

Docker 架构
Docker 是基于客户端-服务器 (C/S) 的架构模式,其中包括多个关键组件,使用远程 API 来管理和创建 Docker 容器,确保容器化应用的高效构建、管理和运行。

通过下图可以得知,Docker在运行时分为Docker引擎(服务端守护进程)和客户端工具,我们日常使用各种docker命令,其实就是在使用客户端工具与Docker引擎进行交互。

在这里插入图片描述

Client 客户端

Docker是一个客户端-服务器(C/S)架构程序。Docker客户端只需要向Docker服务器或者守护进程发出请求,服务器或者守护进程将完成所有工作并返回结果。Docker提供了一个命令行工具Docker以及一整套RESTful API。你可以在同一台宿主机上运行Docker守护进程和客户端,也可以从本地的Docker客户端连接到运行在另一台宿主机上的远程Docker守护进程。

Host 主机(Docker 引擎)

一个物理或者虚拟的机器用于执行Docker守护进程和容器。

Image 镜像

什么是Docker镜像?简单的理解,Docker镜像就是一个Linux的文件系统(Root FileSystem),这个文件系统里面包含可以运行在Linux内核的程序以及相应的数据。

通过镜像启动一个容器,一个镜像就是一个可执行的包,其中包括运行应用程序所需要的所有内容:包含代码,运行时间,库,环境变量和配置文件等。

Docker 把 App 文件打包成为一个镜像,并且采用类似多次快照的存储技术,可以实现:

多个App可以共用相同的底层镜像(初始的操作系统镜像);
App运行时的IO操作和镜像文件隔离;
通过挂载包含不同配置/数据文件的目录或者卷(Volume),单个App镜像可以用来运行无数个不同业务的容器。
#Container 容器
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
在这里插入图片描述

二、Docker 安装

1. Ubuntu 安装

由 Canonical 公司支持的开源操作系统,基于 Debian 发行版。它强调用户友好性和桌面体验,同时也非常适用于服务器环境。

它拥有庞大的社区和官方支持,为用户提供了一个图形界面来安装软件,对新手更加友好。更加频繁的更新,确保了系统的现代性和安全性。

更新软件包列表

确保你的本地软件包列表是最新的,执行命令:

sudo apt-get update

安装必要的软件包,以便可以通过 HTTPS 使用存储库:

sudo apt-get install apt-transport-https ca-certificates curl software-properties-common

添加 Docker 的官方 GPG 密钥:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

设置 Docker 稳定版存储库:

echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

安装 Docker 引擎:

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

验证安装是否成功

运行一个简单的Docker命令来验证是否正确安装了Docker引擎:

sudo docker run hello-world

如果一切正常,你将看到一条消息表明Docker已正确安装和运行。

2. CentOS 安装

CentOS 是一个基于 Red Hat Enterprise Linux (RHEL) 源代码的开源项目,旨在提供一个免费的企业级操作系统。它强调稳定性和安全性,适合需要长时间支持周期的服务器环境。

它适合那些寻求企业级稳定性和不需要商业支持的用户,受到专业IT管理员的青睐。CentOS 的更新周期较长,提供长期支持版本,确保系统的稳定性。

安装yum-utils包

yum install -y yum-utils

设置存储库

# 官方地址(比较慢)
yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
	
# 阿里云地址(国内地址,相对更快)
yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

卸载旧版本
首先,如果系统中已经安装了旧版本的Docker,建议卸载:

sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine 

安装依赖
安装所需的软件包以允许使用存储库:

sudo yum install -y yum-utils device-mapper-persistent-data lvm2  

设置 Docker 稳定版存储库:

sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo  

安装 Docker 引擎:

sudo yum install docker-ce docker-ce-cli containerd.io 

运行之后Is this ok [y/N]: 选择y

启动 Docker 服务

sudo systemctl start docker

配置镜像
Docker默认拉取镜像是从这里拉取(https://hub.docker.com),国外地址拉取的速度比较慢。我们也可以配置国内镜像源。

阿里云镜像加速器
访问地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors,进入容器镜像服务控制台创建加速器。
在这里插入图片描述
使用配置文件/etc/docker/daemon.json(没有时新建该文件)。
进入文件后按 i 进入编辑状态,然后把如下内容粘贴进文件中,然后按esc键结束编辑,在按 :wq 进行保存并退出

vim /etc/docker/daemon.json
# 添加如下内容,可以自己替换。默认地址是我的创建的
{
  "registry-mirrors" : ["https://docker.registry.cyou",
"https://docker-cf.registry.cyou",
"https://dtnwukyb.mirror.aliyuncs.com",
"https://dockercf.jsdelivr.fyi",
"https://docker.jsdelivr.fyi",
"https://dockertest.jsdelivr.fyi",
"https://mirror.aliyuncs.com",
"https://dockerproxy.com",
"https://mirror.baidubce.com",
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.iscas.ac.cn",
"https://docker.rainbond.cc",
"https://do.nark.eu.org",
"https://dc.j8.work",
"https://dockerproxy.com",
"https://gst6rzl9.mirror.aliyuncs.com",
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"http://mirrors.ustc.edu.cn/",
"https://mirrors.tuna.tsinghua.edu.cn/",
"http://mirrors.sohu.com/" 
],
 "insecure-registries" : [
    "registry.docker-cn.com",
    "docker.mirrors.ustc.edu.cn"
    ],
"debug": true,
"experimental": false
}

重启Docker Daemon即可。

systemctl daemon-reload

验证安装是否成功
运行一个简单的Docker命令来验证是否正确安装了Docker引擎:

sudo docker run hello-world

如果一切正常,你将看到一条消息表明Docker已正确安装和运行。

设置Docker开机自启

sudo systemctl enable docker 

3. windows 安装

开启Hyper-V
在这里插入图片描述
安装 WSL 2
提前下载安装包
wsl_update_x64.msi

以管理员身份打开 PowerShell(“开始”菜单 >“PowerShell” >单击右键 >“以管理员身份运行”),然后输入以下命令:

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

等待命令行加载结束,关闭命令行,重启电脑

以管理员身份打开 PowerShell 并运行:

dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

等待命令行加载结束,关闭命令行,重启电脑

运行提前下载安装包 (双击以运行 - 系统将提示你提供提升的权限,选择“是”以批准此安装。)

以管理员身份打开 PowerShell,将 WSL 2 设置为默认版本

wsl --set-default-version 2

下载Docker Desktop

Get Started with Docker
在这里插入图片描述
下载完成后,按照引导提示一步步安装完即可。

使用阿里云镜像加速
在这里插入图片描述
打开安装好的docker的主界面:在设置界面找到Docker Engin,将复制好的加速器地址填入即可。
在这里插入图片描述
安装完成后,Docker 会自动启动。通知栏上会出现个小鲸鱼的图标,这表示 Docker 正在运行。

以管理员身份打开 PowerShell,输入docker version 查看 docker 的版本信息:

三、Docker Compose 安装

Docker Compose 是 Docker 官方提供的容器编排工具,用于简化多容器应用的定义、配置和部署过程。它通过一个 YAML 格式的配置文件(docker-compose.yml)统一管理多个关联容器,解决以下核心问题:

简化多容器应用部署
允许通过单一配置文件定义多个服务(如 Web 应用、数据库、缓存等),无需手动编写复杂 docker run
命令链,实现一键启动 / 停止所有关联容器。

统一环境配置
将容器依赖(镜像版本、网络、端口映射、数据卷、环境变量等)集中声明,确保开发、测试、生产环境的一致性,避免因环境差异导致的运行问题。

自动化服务依赖管理
支持定义服务间的启动顺序和依赖关系(如先启动数据库再启动应用),确保容器按逻辑顺序初始化。

隔离与复用性
通过独立网络和卷配置,隔离不同项目的容器环境,同时复用同一物理机的资源,提升开发效率。

命令行快速安装(Linux/macOS)

# 安装
curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

授予执行权限

# 授予执行权限
sudo chmod +x /usr/local/bin/docker-compose

验证安装

docker-compose --version

基本使用

version: '3.8'  # 指定兼容的 Compose 规范版本

services:        # 服务定义区块
  webapp:        # 服务名称(自定义)
    image: nginx:alpine  # 基础镜像
    container_name: my-nginx  # 容器命名(可选)
    ports:
      - "80:80"               # 端口映射(主机:容器)
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf  # 挂载配置文件
      - html:/usr/share/nginx/html          # 使用命名卷
    networks:
      - frontend                            # 加入指定网络
    depends_on:
      - database  # 声明依赖关系

  database:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: secure_password  # 环境变量注入
    volumes:
      - mysql_data:/var/lib/mysql           # 数据持久化
    networks:
      - backend

volumes:   # 声明数据卷(自动创建)
  html:
  mysql_data:

networks:  # 自定义网络(隔离通信)
  frontend:
  backend:

常用命令

# 指定其他目录或文件名
docker compose -f /path/to/custom-compose.yml up

# 使用多个 Compose 文件(合并配置)
docker compose -f docker-compose.yml -f docker-compose.prod.yml up

在这里插入图片描述

四、Docker 命令

常用命令

查看容器

正在运行的容器: docker ps 

查看停止的容器
执行命令:docker ps -f status=exited

查看所有容器(包括运行和停止)。

执行命令:docker ps -a

查看最后一次运行的容器。

执行命令:docker ps -l

列出最近创建的 n 个容器。

执行命令:docker ps -n 5

在这里插入图片描述

停止容器

docker stop <容器ID或容器名> 

查看镜像列表

docker images 

在这里插入图片描述
这些镜像都是存储在Docker宿主机的/var/lib/docker目录下。

搜索镜像
如果你需要从网络中查找需要的镜像,可以通过以下命令搜索。

docker search 镜像名称

在这里插入图片描述

删除镜像

docker rmi <镜像ID或镜像名> 

数据卷

使用数据卷将本地目录与容器内目录关联:

docker run -v /本地目录:/容器目录 -d <镜像名> 

Dockerfile

通过 Dockerfile 构建镜像,实现环境自动化配置:

FROM ubuntu:latest
RUN apt-get update && apt-get install -y nginx  

通过以下命令构建镜像:

docker build -t mynginx:v1

多容器协作

使用 Docker Compose 管理多个容器,定义服务、网络、卷等:

version: '3'
services:
  web:
    image: nginx:alpine
  database:
    image: mysql:5.7 

通过以下命令启动服务:

docker-compose up -d 

创建与启动容器

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

docker run 设置项 镜像名 镜像启动运行的命令(镜像里面默认是有的,一般不用管)
# -restart=always 开机自启
docker run -name=MyNginx -restart=always nginx

# 更新容器的设置项
# 1、查看容器ID
docker ps
# 2、修修改配置
docker update 容器ID/名字 -restart=always

# 端口映射
docker run -name=MyNginx -restart=always -p 88:80 nginx

-i:表示运行容器;
-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端;
–name:为创建的容器命名;
-v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个 -v 做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上;
-d:在 run 后面加上 -d 参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加 -i -t 两个参数,创建容器后就会自动进容器里);
-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个 -p 做多个端口映射。
-P:随机使用宿主机的可用端口与容器内暴露的端口映射。

删除容器

# 删除容器
docker rm  容器ID/名字
# 强制删除运行中的容器
docker rm -f 容器ID/名字

创建并进入容器

下面这行命令的意思就是通过镜像 AA 创建一个容器 BB,运行容器并进入容器的/bin/bash。

docker run -it --name 容器名称 镜像名称:标签 /bin/bash

注意:Docker容器运行必须有一个前台进程,如果没有前台进程执行,容器认为是空闲状态,就会自动退出。

守护式方式创建容器

docker run -di --name 容器名称 镜像名称:标签

登录守护式容器方式(进入容器的内部系统,修改容器内容)

docker exec -it 容器名称|容器ID /bin/bash

退出当前容器

exit

文件拷贝

如果我们需要将文件拷贝到容器内可以使用cp命令。

docker cp 需要拷贝的文件或目录 容器名称:容器目录

也可以将文件从容器内拷贝出来。

docker cp 容器名称:容器目录 需要拷贝的文件或目录

目录挂载

我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器,而且这个操作是双向绑定的,也就是说容器内的操作也会影响到宿主机,实现备份功能。

但是容器被删除的时候,宿主机的内容并不会被删除。如果多个容器挂载同一个目录,其中一个容器被删除,其他容器的内容也不会受到影响。

创建容器添加-v参数,格式为宿主机目录:容器目录,例如:

docker run -di -v /home/project/data:/usr/local/data --name centos7-01 centos:7

# 多目录挂载
docker run -di -v /宿主机目录:/容器目录 -v /宿主机目录2:/容器目录2 镜像名

提示

目录挂载操作可能会出现权限不足的提示。这是因为CentOS7中的安全模块SELinux把权限禁掉了,在docker run时通过–privileged=true给该容器加权限来解决挂载的目录没有权限的问题。

匿名挂载

匿名挂载只需要写容器目录即可,容器外对应的目录会在/var/lib/docker/volumes中生成。

# 匿名挂载
docker run -di -v /usr/local/data --name centos7-02 centos:7
# 查看 volume 数据卷信息
docker volume ls

具名挂载

具名挂载就是给数据卷起了个名字,容器外对应的目录会在/var/lib/docker/volume中生成。

# 匿名挂载
docker run -di -v docker_centos_data:/usr/local/data --name centos7-03 centos:7
# 查看 volume 数据卷信息
docker volume ls

指定目录挂载

之前挂载方式就属于指定目录挂载,这种方式的挂载不会在/var/lib/docker/volume目录生成内容。

docker run -di -v /mydata/docker_centos/data:/usr/local/data --name centos7-01 centos:7
# 多目录挂载
docker run -di -v /宿主机目录:/容器目录 -v /宿主机目录2:/容器目录2 镜像名

查看目录挂载关系

通过docker volume inspect数据卷名称 可以查看该数据卷对应宿主机的目录地址。

执行命令:docker volume inspect docker_centos_data

通过docker inspect容器ID或名称 ,在返回的JSON节点中找到Mounts,可以查看详细的数据挂载信息。

查看容器 IP 地址

我们可以通过以下命令查看容器的元信息。

docker inspect 容器名称|容器ID

也可以直接执行下面的命令直接输出 IP 地址。

docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称|容器ID

提交镜像的改变(容器快照)

将自己修改好的镜像提交(相当于备份一份修改好的镜像)

docker commit [选项] 容器ID或容器名 新镜像名:标签

# 基本提交
docker commit container_name myimage:v1.0

# 带作者和描述信息
docker commit -a "Your Name" -m "Add new feature" container_id myrepo/myimage:latest

# 提交时修改启动命令
docker commit -c 'CMD ["nginx", "-g", "daemon off;"]' container_name nginx-custom:v1.0
# 查看是否提交成功
docker images

常用选项:
-a 或 --author:指定作者信息
-m 或 --message:提交信息
-c 或 --change:应用Dockerfile指令

镜像传输

# 将镜像保存成压缩包
docker save [选项] 镜像名[:标签] > 文件名.tar
# 或者如下方式
docker save -o 文件名.tar 镜像名[:标签]

# 备份单个镜像
docker save -o nginx-backup.tar nginx:latest

# 备份多个镜像
docker save -o multi-images.tar nginx:latest ubuntu:20.04 redis:alpine
# 传输到远程服务器
scp nginx-backup.tar user@remote-server:/path/to/destination/

# 完整的传输流程
# 本地操作:
docker save nginx:latest > nginx-backup.tar

# 传输到远程服务器:
scp nginx-backup.tar deploy@192.168.1.100:/home/deploy/images/


# 在传输过去的服务器上使用这个镜像
docker load [选项]

docker load -i nginx-backup.tar
# 或者
docker load < nginx-backup.tar
# 验证加载结果
docker images

常用选项:
-o, --output:指定输出文件名
可以同时保存多个镜像

搜索镜像

docker search [选项] 关键词

# 搜索nginx镜像
docker search nginx

# 搜索mysql镜像
docker search mysql

常用选项:
–limit:限制返回结果数量(默认25个)
–filter:过滤搜索结果

Dockerfile 将自己的JAVA应用打包成镜像

原来传统的部署方式

1、spring boot应用打包成可执行的jar包
2、把jar包上传服务器
3、在服务器上运行 java -jar xxx.jar

使用docker容器的方式进行部署

1、编写 Dockerfile 文件

# 所使用构建的基础镜像(可以自己在docker hub 仓库中匹配的镜像)
FROM penjdk:8-jdk-alpine
# 创建一个挂载点 /tmp 目录
# 容器运行时可以将此目录挂载到宿主机,便于日志文件等临时数据的持久化
VOLUME /tmp
# 将构建好的Java应用jar包复制到容器根目录下
# 更具自己上传jar包的位置对路径自行进行更改
COPY app-system.jar /app-system.jar
# 设置容器时区为上海时区(东八区)
RUN echo 'Asia/Shanghai' > /etc/timezone
# JVM参数配置
# 内存配置:
# -Xms512m:初始堆内存512MB
# -Xmx2048m:最大堆内存2048MB(2GB)
# -Xss256k:每个线程栈大小256KB
# 故障诊断:
# -XX:+HeapDumpOnOutOfMemoryError:发生OOM时生成堆转储文件
# -XX:HeapDumpPath=dump:堆转储文件保存到dump目录
# -XX:+PrintGCDetails:打印详细的GC信息
# -Xloggc:gc.log:GC日志输出到gc.log文件
# -XX:-OmitStackTraceInFastThrow:禁用快速抛异常时省略堆栈信息的优化

ENV JAVA_OPTS="-Xms512m -Xmx2048m -Xss256k -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=dump -XX:+PrintGCDetails -Xloggc:gc.log -XX:-OmitStackTraceInFastThrow"
# 使用shell执行Java应用
# $JAVA_OPTS 引用前面定义的JVM参数
# -Djava.security.egd=file:/dev/./urandom:加速随机数生成(避免阻塞)
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app-system.jar" ]

在这里插入图片描述

2、spring boot应用打包成可执行的jar包
3、把打好的jar包和编写好的Dockerfile 文件上传到服务器
4、使用docker命令构建镜像

docker build [OPTIONS] PATH | URL | -

主要参数说明
核心参数
PATH: 构建上下文路径(通常是包含 Dockerfile 的目录)
-t, --tag: 为镜像指定名称和标签,格式为 name:tag
-f, --file: 指定 Dockerfile 的路径(默认在构建上下文中查找 Dockerfile)
常用选项
–build-arg: 设置构建时变量
–no-cache: 不使用缓存进行构建
–pull: 构建前拉取基础镜像的最新版本
–rm: 构建成功后删除中间容器(默认行为)
–platform: 指定目标平台架构

# 基本语法 (在Dockerfile文件所在目录执行)
docker build -t myapp:latest .
# 指定 Dockerfile 路径
docker build -t myapp:latest -f ./docker/Dockerfile.prod .
# 带构建参数
docker build -t myapp:latest --build-arg VERSION=1.0.0 .
# 不使用缓存强制重新构建
docker build -t myapp:latest --no-cache .

5、查看镜像是否构建成功

docker images

6、启动容器

docker run -d -p 8080:8080 myapp:latest

7、查看是否启动成功

docker ps 
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐