1.概述
-
基于Go云开源,一次镜像处处运行,系统平滑移植,容器虚拟化技术。
-
Docker容器(启动速度快、占用体积小)是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,
&传统虚拟机则是在硬件层面实现虚拟化。
-
Docker组成(简易Linux):
1.镜像(相当于容器的"源代码",docker镜像文件类似于Java的类模板)
2.容器(类似于一个虚拟化的运行环境,容器实例类似于java中new出来的实例对象)
3.仓库(集中存放镜像文件的场所)
-
查看内核:
-
在 Ubuntu 中安装 Docker:推荐
并添加国内镜像:
systemctl status docker
sudo mkdir -p /etc/docker
vim /etc/docker/daemon.json
添加:
bash
{
"registry-mirrors" : ["https://docker.registry.cyou",
"https://docker-cf.registry.cyou",
"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
}
重载和重启dockers服务
sudo systemctl daemon-reload
sudo systemctl restart docker
docker info
2.命令

2.1 帮助启动类命令
命令 | 说明 |
---|---|
systemctl start docker |
启动 Docker |
systemctl stop docker |
停止 Docker |
systemctl restart docker |
重启 Docker |
systemctl status docker |
查看 Docker 状态 |
systemctl enable docker |
设置开机自启 |
docker info |
查看 Docker 系统信息(版本、容器/镜像数量等) |
docker --help |
查看 Docker 总体帮助文档 |
docker <具体命令> --help |
查看具体命令的帮助文档(如 docker run --help ) |
2.2 镜像命令
命令 | 说明 |
---|---|
docker images |
列出本地镜像 -q :仅显示镜像 ID;-a :显示所有镜像(含中间层) |
docker search <镜像名> |
从 Docker Hub 搜索镜像 --filter=stars=3000 :过滤星标 ≥3000 的镜像 |
docker pull <镜像名>[:tag] |
下载镜像(不指定 tag 时默认为 latest ) |
docker rmi <镜像名或ID> |
删除镜像 -f :强制删除;可同时删多个(如 docker rmi -f id1 id2 ) |
docker rmi $(docker images -qa) |
删除所有本地镜像 |
docker build -t <镜像名> . |
通过 Dockerfile 构建镜像 |
docker save -o <文件名>.tar <镜像名> |
将镜像保存为 tar 文件(如 docker save -o nginx.tar nginx:latest ) |
docker load -i <文件名>.tar |
从 tar 文件加载镜像 |
2.3 容器命令
基础操作
命令 | 说明 |
---|---|
docker run [参数] <镜像名> |
创建并启动容器 常用参数: --name :指定容器名称 -d :后台运行 -it :交互模式(如 docker run -it --name=mycentos centos /bin/bash ) -p :端口映射(主机端口:容器端口,如 -p 8080:80 ) -v :目录挂载(主机目录:容器目录) -e :设置环境变量(如 -e MYSQL_ROOT_PASSWORD=123456 ) |
docker start <容器名或ID> |
启动已停止的容器 |
docker restart <容器名或ID> |
重启容器 |
docker stop <容器名或ID> |
停止容器(优雅退出) |
docker kill <容器名或ID> |
强制停止容器 |
docker rm <容器名或ID> |
删除已停止的容器 -f :强制删除运行中的容器 docker rm -f $(docker ps -aq) :删除所有容器 |
docker ps |
查看运行中的容器 -a :显示所有容器;-q :仅显示容器 ID |
命令别名
进入/查看容器
命令 | 说明 |
---|---|
docker exec -it <容器名> /bin/bash |
ctrl+p+q 推荐:进入运行中的容器(退出后容器不停止) |
docker attach <容器名> |
进入容器(退出会导致容器停止) |
docker logs <容器名> |
查看容器日志 -f :实时跟踪;--tail=100 :显示最后100行 |
docker inspect <容器名> |
查看容器详细信息(IP、配置等) |
docker top <容器名> |
查看容器内运行的进程 |
docker cp <容器名>:<容器路径> <主机路径> |
从容器复制文件到主机(如 docker cp mynginx:/etc/nginx/nginx.conf ./ ) |
状态监控
命令 | 说明 |
---|---|
docker stats |
实时监控容器资源占用(CPU/内存/网络) |
docker update --memory=512m <容器名> |
动态调整容器内存限制 |
常用操作流程图
启动容器 docker run 后台运行 -d 交互模式 -it 端口映射 -p 目录挂载 -v 查看日志 docker logs 进入容器 docker exec 访问服务 http://host:port 主机与容器数据同步
3.镜像
- UnionFS(联合文件系统)分层(共享资源,方便复制迁移,复用)
- Docker镜像加载原理:
bootfs
(boot file system)主要包含bootloader(boot加载器)
和kernel(内核)
,bootloader
主要是引导加载kernel
, Linux刚启动时会加载bootfs
文件系统,在Docker镜像的最底层是引导文件系统bootfs
。 - 当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作"容器层","容器层"之下的都叫"镜像层"。
所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。
docker commit 命令
bash
docker commit [选项] <容器ID或名称> [仓库名[:标签]]
常用选项:
-m
或--message
: 提交的描述信息-a
或--author
: 作者信息--pause
或-p
: 在提交过程中暂停容器(默认为true)
eg.
初始情况
- 首先运行一个基础的Ubuntu容器:
bash
docker run -it ubuntu /bin/bash
- 进入容器后发现没有vim编辑器:
bash
vim
# 会提示命令未找到
修改容器
- 更新apt包管理器:
bash
apt-get update
- 安装vim:
bash
apt-get -y install vim
提交修改
- 在另一个终端中查看容器ID:
bash
docker ps
- 提交修改创建新镜像(假设容器ID为88270a4917e7):
bash
docker commit -m="Added vim support" -a="YourName" 88270a4917e7 my-ubuntu:v1
使用新镜像
- 运行新创建的镜像:
bash
docker run -it 79f3ce78e883 /bin/bash
- 现在新容器中已经包含了vim编辑器。
4.容器数据卷
4.容器数据卷
双向映射,改宿主机,容器跟着变
● 卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,
目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷
● 运行一个带有容器卷存储功能的容器实例docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
○ 当目录不存在时,Docker会自动创建
○ --privileged=true 赋予容器足够的权限
● 在执行docker run命令时,使用-v数据卷:容器内目录可以完成数据卷挂载
● 当创建容器时,如果挂载了数据卷且数据卷不存在,会自动创建数据卷
-
将运用与运行的环境打包镜像,run后形成容器实例运行 ,为了能保存数据在docker中我们使用卷。
-
容器与宿主机文件同步
- 在容器中操作
/tmp/docker_data
目录下的文件 - 在宿主机上查看
/tmp/host_data
目录会看到相同的变化 - 反之亦然,在宿主机上的修改也会同步到容器中
- 在容器中操作
docker inspect 容器ID
可以查看容器的详细信息,包括数据卷挂载的详情
4.1容器卷读写规则
docker run -it --privileged=true -v /宿主机路径:/容器内目录 镜像名
- 默认是读写模式(rw)
两种规则:
-
rw
: 可读可写(默认) -
ro
: 只读docker run -it --privileged=true -v /tmp/myubuntu1:/tmp/u1:ro --name=u1 ubuntu
-
容器内
/tmp/u1
目录将变为只读
4.2容器卷继承
操作步骤:
-
启动第一个容器(u1)并创建文件 a.txt
bash
docker run -it -v /宿主机路径:/容器路径 --name=u1 ubuntu
-
启动第二个容器(u2)继承 u1 的数据卷
bash
docker run -it --volumes-from u1 --name=u2 ubuntu
- u2 容器中也能看到 a.txt 文件
特点:
- 多个容器可以共享同一个数据卷
- 即使容器停止,数据仍然持久化
- 新创建的容器通过继承可以访问相同的数据
4.3本地目录挂载
查看容器详情Mounts:docker inspect
自动生成匿名卷docker inspect Mysql
5.安装软件
步骤:
- 搜索镜像
- 拉取镜像
- 查看镜像
- 启动镜像------------端口映射
- 停止容器
- 移除容器
6.DockerFile
- Dockerfile是用来构建镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。
- 构建三步骤:
- 编写Dockerfile文件
- docker build命令构建镜像
- docker run依镜像运行容器实例
Dockerfile 指令
- FROM
设置基础镜像
必须是Dockerfile第一条有效指令
语法:
dockerfile
FROM [--platform=<平台>] <镜像>[:<标签>] [AS <名称>]
-
LABEL
添加元数据(键值对)
替代已废弃的MAINTAINER指令
dockerfileLABEL version="1.0" description="示例镜像"
-
RUN
执行命令并提交结果
两种形式:
dockerfile
RUN <command> # shell形式
RUN ["可执行文件", "参数1", "参数2"] # exec形式
- CMD
指定容器启动时的默认命令
三种形式:
dockerfile
CMD ["executable","param1","param2"] # exec形式(推荐)
CMD ["param1","param2"] # 作为ENTRYPOINT默认参数
CMD command param1 param2 # shell形式
- EXPOSE
声明容器运行时监听的端口
语法:
dockerfile
EXPOSE <端口> [<端口>/<协议>...]
- ENV
设置环境变量
语法:
dockerfile
ENV <键>=<值> ...
- ADD
复制文件/目录/URL到镜像
支持自动解压tar文件
语法:
dockerfile
ADD [--chown=<用户>:<组>] <源路径>... <目标路径>
- COPY
复制文件/目录到镜像
比ADD更简单直接
语法:
dockerfile
COPY [--chown=<用户>:<组>] <源路径>... <目标路径>
- ENTRYPOINT
配置容器启动时运行的命令
不会被docker run参数覆盖
两种形式:
dockerfile
ENTRYPOINT ["executable", "param1", "param2"] # exec形式
ENTRYPOINT command param1 param2 # shell形式
-
VOLUME
创建挂载点
用于数据持久化
语法:
dockerfileVOLUME ["/data"]
-
USER
指定运行用户
语法:
dockerfileUSER <用户名>[:<用户组>]
-
WORKDIR
设置工作目录
语法:
dockerfileWORKDIR /path/to/workdir
7.Docker Network

Docker 提供了多种网络模式来管理容器间的通信:docker network ls
bridge
:默认网络模式,为每个容器创建独立的网络命名空间host
:容器直接使用宿主机的网络none
:禁用所有网络overlay
:用于跨多个 Docker 主机的网络通信macvlan
:为容器分配 MAC 地址,使其在物理网络中显示为物理设备
常用命令
docker network create
创建一个新的 Docker 网络
bash
docker network create [OPTIONS] NETWORK_NAME
常用选项:
-
--driver
或-d
:指定网络驱动(bridge, overlay等) -
--subnet
:指定子网(如 172.18.0.0/16) -
--gateway
:指定网关
bash
docker network create --driver bridge my-bridge-network
docker network ls
列出所有 Docker 网络
bash
c
docker network rm
删除一个或多个网络
bash
docker network rm NETWORK_NAME [NETWORK_NAME...]
docker network prune
删除所有未使用的网络
bash
docker network prune
docker network connect
将容器连接到网络
bash
docker network connect [OPTIONS] NETWORK CONTAINER
示例:
bash
docker network connect my-bridge-network my-container
docker network disconnect
断开容器与网络的连接
bash
docker network disconnect [OPTIONS] NETWORK CONTAINER
docker network inspect
显示网络的详细信息
bash
docker network inspect [OPTIONS] NETWORK [NETWORK...]
8.Docker Compose
- Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过一个 YAML 文件(通常是 docker-compose.yml)来配置应用程序的服务,然后使用单个命令创建并启动所有服务。
- 创建 docker-compose.yml 文件:定义服务、网络和卷
常用命令
-
启动服务:
bashdocker-compose up
-
后台启动服务:
bashdocker-compose up -d
-
停止服务:
bashdocker-compose down
-
查看运行中的服务:
bashdocker-compose ps
-
查看服务日志:
bashdocker-compose logs
-
构建服务:
bashdocker-compose build
-
启动服务:
bashdocker-compose start
-
停止服务:
bashdocker-compose stop
-
重启服务:
bashdocker-compose restart
-
扩展服务实例:
bashdocker-compose up --scale web=3
-
查看服务日志:
bashdocker-compose logs -f web
-
执行命令:
bashdocker-compose exec web bash