导图社区 Docker教程
这是一篇关于Docker教程的思维导图,梳理了Docker的核心知识与操作要点。从Docker在Ubuntu上的安装步骤,到容器与镜像管理的各类操作;从网络配置的细节,到数据卷管理的策略;还涵盖了Nginx操作以及React Docker部署指南等实用内容。无论你是刚刚踏入Docker领域的初学者,还是希望进一步提升技能的有经验者,这张思维导图都能成为你学习和实践Docker的宝贵指南。
编辑于2026-01-06 14:40:25Docker教程
安装Docker
Docker 在 Ubuntu 上的安装方法
配置虚拟机
安装虚拟机和Ubuntu系统
虚拟机不能复制粘贴的解决办法
 
设置Ubuntu初始密码
sudo passwd
安装SSH服务
在Ubuntu虚拟机上安装SSH服务。
sudo apt-get update sudo apt-get install openssh-server
安装完成后,启动SSH服务
sudo service ssh start
确认SSH服务正在运行:
sudo service ssh status
获取Ubuntu虚拟机的IP地址
安装ifconfig
sudo apt install net-tools
查看IP地址
ifconfig
更新软件包索引并安装依赖
sudo apt update
sudo apt install -y 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=$(dpkg --print-architecture) 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
再次更新软件包索引
sudo apt update
安装 Docker Engine
sudo apt install -y docker-ce docker-ce-cli containerd.io
验证 Docker 安装
sudo docker run hello-world
将当前用户添加到 Docker 组(可选,但推荐)
sudo usermod -aG docker $USER
设置 Docker 开机自启动
sudo systemctl enable docker
需要重新登录才能生效
如果您需要使用 Docker Compose
sudo apt install -y docker-compose
使用桌面版的Docker
如果与虚拟机冲突
解决 VMware 冲突
启用 Hyper-V(使用 Docker 时)
以管理员身份运行后重启
bcdedit /set hypervisorlaunchtype auto
临时禁用 Hyper-V(使用 VMware 时)
以管理员身份运行后重启
bcdedit /set hypervisorlaunchtype off
nginx操作
安装nginx
获取权限
sudo su
查看可用的 Nginx 版本
取最新版的 Nginx 镜像
docker pull nginx:latest
查看本地镜像
docker images
运行容器
docker run --name nginx-test -p 8080:80 -d nginx
参数说明: --name nginx-test:容器名称。 -p 8080:80: 端口进行映射,将本地 8080 端口映射到容器内部的 80 端口。 -d nginx: 设置容器在在后台一直运行
在浏览器打开网站
http:/虚拟机ip地址:8080
nginx容器操作
重新运行容器并映射 SSH 端口
退出容器
exit
强制终止容器进程
查找容器的进程 ID (PID)
docker inspect --format '{{.State.Pid}}' nginx-test
强制杀死进程
kill -9 容器ID
删除容器
docker rm -f nginx-test
运行新容器,映射 HTTP 80 和 SSH 22 端口
docker run -d --name nginx-test -p 8080:80 -p 2222:22 nginx
检查容器 IP 地址
ifconfig
没安装的话要先安装
apt-get update apt-get install net-tools
配置 SSH 服务
通过以下命令进入nginx容器:
docker container exec -it nginx-test bash
更新软件源并安装 SSH 服务与网络工具
apt update && apt install -y openssh-server net-tools
允许 root 登录(临时测试用,生产环境不推荐)
sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
设置 root 密码(用于 SSH 密码登录)
passwd root
启动 SSH 服务
service ssh start
检查 SSH 端口是否监听
netstat -tuln | grep :22
ssh连接容器
ssh root@宿主机IP -p 2222
React Docker部署指南
准备React应用
apt install npm
npx create-react-app my-react-app cd my-react-app
cd my-react-app
创建Dockerfile
安装vim
apt install vim
在React项目的根目录下创建一个名为Dockerfile的文件
# 构建阶段 FROM node:18-alpine as build # 设置工作目录 WORKDIR /app # 复制package.json和package-lock.json COPY package*.json ./ # 安装依赖 RUN npm install # 复制所有文件 COPY . . # 构建应用 RUN npm run build # 生产阶段 FROM nginx:alpine # 从构建阶段复制构建结果到nginx目录 COPY --from=build /app/build /usr/share/nginx/html # 添加自定义nginx配置(可选) # COPY nginx.conf /etc/nginx/conf.d/default.conf # 暴露80端口 EXPOSE 80 # 启动nginx CMD ["nginx", "-g", "daemon off;"]
创建.dockerignore文件(可选但推荐)
node_modules npm-debug.log build .git .gitignore README.md
创建nginx配置文件(可选)
创建nginx.conf文件
server { listen 80; location / { root /usr/share/nginx/html; index index.html index.htm; try_files $uri $uri/ /index.html; } # 其他配置,如API代理等 # location /api { # proxy_pass http://backend-service; # } }
docker-compose.yml (可选)
version: '3' services: frontend: build: . ports: - "8080:80" # 可选:挂载卷以便开发 # volumes: # - ./src:/app/src # 如果有后端服务,可以添加 # backend: # build: ./backend # ports: # - "5000:5000"
构建镜像
docker build -t my-react-app .
运行容器
docker run -p 8080:80 -d my-react-app
python操作
docker pull python:3.5
基本操作
下载镜像
检索
docker search 镜像名
下载
docker pull 镜像名
列表
docker images
删除的两种方法
docker rmi 镜像名:版本
docker rmi 镜像ID
Docer 核心命令
运行
docker run 容器ID 或者 镜像名:版本
后台启动,自定义名称
docker run -d -- 名称 镜像名
端口映射创建
docker run -d --name 名称 -p 外部端口:内部端口 镜像名
删除
删除容器
docker rm 容器ID
强制删除
docker rm -f 容器ID
删除所有容器
docker rm -f $(docker ps -aq)
删除所有已经停止的容器:
docker rm $(docker ps -a -q)
删除镜像
docker rmi 镜像ID
删除所有镜像
docker rmi -f $(docker images -aq)
常用参数说明
参数 作用 适用命令示例
-d 后台运行容器 docker run -d nginx
-it 分配交互式终端(通常组合使用) docker exec -it nginx bash
-p 端口映射(宿主机端口:容器端口) docker run -p 8080:80 nginx
-v 数据卷挂载(宿主机路径:容器路径) docker run -v /data:/app/data
--name 为容器命名 docker run --name my-nginx nginx
-e 设置环境变量 docker run -e "ENV=prod" nginx
--rm 容器退出后自动删除 docker run --rm alpine
可以组合使用例如 docker run -dit --rm nginx
命令大全
容器与镜像的关系

镜像管理

docker images 列出本地镜像
•作用: 列出本地镜像 •命令格式: docker images [OPTIONS] [REPOSITORY[:TAG]] 或者 docker image ls [OPTIONS] [REPOSITORY[:TAG]] •命令参数(OPTIONS): -a, --all 展示所有镜像 (默认隐藏底层的镜像) --no-trunc 不缩略显示 -q, --quiet 只显示镜像ID
-a(显示所有镜像)
docker rmi 删除镜像镜像名:标签 或 镜像ID
•作用: 将本地的一个或多个镜像删除 •命令格式: docker rmi [OPTIONS] IMAGE [IMAGE...] 或者 docker image rm [OPTIONS] IMAGE [IMAGE...] •命令参数(OPTIONS): -f, --force 强制删除
-f 强制删除
docker tag 为镜像创建新标签(别名)并新产生一个命名后镜像 原镜像名:标签 新镜像名:标签
docker tag nginx nginx-test:latest
docker build 通过 Dockerfile 构建镜像
-t(指定镜像名)、-f(指定 Dockerfile
docker commit 将容器当前状态保存为镜像容器名 新镜像名:标签
生成的镜像继承了父镜像的内容(保留历史信息)
-a :提交的镜像作者。
-c :使用 Dockerfile 指令来创建镜像。
-m :提交时的说明文字。
-p :提交镜像前暂停容器(默认为 true)。
docker import 从容器快照文件(打包后的容器文件)导入为镜像(不保留历史层)tar文件路径 镜像名:标签
生成的镜像为一个全新的镜像
-c, 在导入过程中应用 Dockerfile 指令
-m 为导入的镜像添加注释。
docker save 将镜像保存为 tar 文件(归档)
-o(指定输出文件)
docker save -o nginx-test.tar nginx:latest
保存多个镜像到同一个文件
docker save -o nginx-python.tar nginx:latest python:latest
docker load从 tar 文件加载镜像到本地
•作用: 将save命令打包的镜像导入本地镜像库中 •命令格式: docker load [OPTIONS] •命令参数(OPTIONS): -i, --input string 指定要打入的文件,如没有指定,默认是STDIN -q, --quiet 不打印导入过程信息
-i(指定输入文件)
docker load -i nginx-python.tar
-q, --quiet: 安静模式,减少输出信息。
docker history 查看镜像的构建历史镜像名:标签
docker history nginx
docker inspect 查看容器/镜像/卷/网络的详细信息容器名/ID
docker inspect nginx
-f, --format: 使用 Go 模板语法格式化输出。
docker inspect -f '{{ json .Id }}' nginx
-t 时间戳
容器生命周期管理
 
docker create 创建容器但不启动同 docker run 参数
•作用: 利用镜像创建出一个Created 状态的待启动容器 •命令格式: docker create [OPTIONS] IMAGE [COMMAND] [ARG...] •命令参数(OPTIONS):查看更多 -t, --tty 分配一个伪TTY,也就是分配虚拟终端 -i, --interactive 即使没有连接,也要保持STDIN打开 --name 为容器起名,如果没有指定将会随机产生一个名称 •命令参数(COMMAND\ARG): COMMAND 表示容器启动后,需要在容器中执行的命令,如ps、ls 等命令 ARG 表示执行 COMMAND 时需要提供的一些参数,如ps 命令的 aux、ls命令的-a等等
-t 分配虚拟终端
-i 即使没有连接也要报错STDIN打开
--name: 给容器指定一个名称
其他
-p, --publish: 端口映射,格式为 host_port:container_port。 -v, --volume: 挂载卷,格式为 host_dir:container_dir。 -e, --env: 设置环境变量。 --network: 指定容器的网络模式。 --restart: 容器的重启策略(如 no、on-failure、always、unless-stopped)。 -u, --user: 指定用户。 --entrypoint: 覆盖容器的默认入口点。 --detach: 在后台创建容器。
docker run 创建并启动新容器
•作用: 利用镜像创建并启动一个容器 •命令格式: docker run [OPTIONS] IMAGE [COMMAND] [ARG...] •命令参数(OPTIONS):查看更多 -t, --tty 分配一个伪TTY,也就是分配虚拟终端 -i, --interactive 即使没有连接,也要保持STDIN打开 --name 为容器起名,如果没有指定将会随机产生一个名称 -d, --detach 在后台运行容器并打印出容器ID --rm 当容器退出运行后,自动删除容器 •命令参数(COMMAND\ARG): COMMAND 表示容器启动后,需要在容器中执行的命令,如ps、ls 等命令 ARG 表示执行 COMMAND 时需要提供的一些参数,如ps 命令的 aux、ls命令的-a等等
-d 后台运行
-p 端口映射,格式为 host_port:container_port。
-v 挂载卷,格式为 host_dir:container_dir。
-w /usr/src/myapp 指定容器的 /usr/src/myapp 目录为工作目录。
--rm: 容器停止后自动删除容器。
如果无法删除可能是因为AppArmor
如果不想完全清除
检查状态
sudo aa-status
关闭并防止其重新启动
sudo systemctl disable apparmor.service --now
卸载 AppArmor 配置文件
sudo service apparmor teardown
检查状态
sudo aa-status
重启Ubuntu
--network: 指定容器的网络模式。
其他
-it: 交互式运行容器,分配一个伪终端。 --env 或 -e: 设置环境变量。 --restart: 容器的重启策略(如 no、on-failure、always、unless-stopped)。 -u: 指定用户。
docker start 启动已停止的容器容器名/ID
-a: 附加到容器的标准输入输出流。
-i: 附加并保持标准输入打开。
docker stop 优雅停止运行中的容器容器名/ID
•作用: 删除一个或多个容器 •命令格式: docker container rm [OPTIONS] CONTAINER [CONTAINER...] 或者 docker rm [OPTIONS] CONTAINER [CONTAINER...] •命令参数(OPTIONS): -f, --force 强行删除容器(会使用 SIGKILL信号) -v, --volumes 同时删除绑定在容器上的数据卷
-t 停止容器之前等待的秒数,默认是 10 秒。
docker stop -t 30 my_container
docker restart 重启容器容器名/ID
docker kill 强制终止容器(发送 SIGKILL 信号)容器名/ID
•作用: 强制并立即关闭一个或多个处于暂停状态或者运行状态的容器 •命令格式: docker kill [OPTIONS] CONTAINER [CONTAINER...] •命令参数(OPTIONS): -s, --signal string 指定发送给容器的关闭信号 (默认“KILL”信号)
docker rm 删除已停止的容器
•作用: 删除一个或多个容器 •命令格式: docker container rm [OPTIONS] CONTAINER [CONTAINER...] 或者 docker rm [OPTIONS] CONTAINER [CONTAINER...] •命令参数(OPTIONS): -f, --force 强行删除容器(会使用 SIGKILL信号) -v, --volumes 同时删除绑定在容器上的数据卷
-f(强制删除运行中的容器)
如果无法强制删除,重启服务器
docker pause 暂停容器内的所有进程容器名/ID
docker unpause 恢复暂停的容器进程容器名/ID
docker exec 在运行的容器内执行命令
•作用: 在容器中运行一个命令 •命令格式: docker exec [OPTIONS] CONTAINER COMMAND [ARG...] •命令参数(OPTIONS): -d, --detach 后台运行命令 -i, --interactive 即使没连接容器,也将当前的STDIN绑定上 -t, --tty 分配一个虚拟终端 -w, --workdir string 指定在容器中的工作目录 -e, --env list 设置容器中运行时的环境变量
-it(交互式终端)、bash
docker rename 重命名容器旧容器名 新容器名
容器操作与监控
docker ps 列出容器(默认显示运行中的容器)
-a(显示所有容器)
docker inspect 查看容器/镜像/卷/网络的详细信息容器名/ID
docker inspect nginx •作用: 查看本地一个或多个容器的详细信息 •命令格式: docker container inspect [OPTIONS] CONTAINER [CONTAINER...] 或者 docker inspect [OPTIONS] CONTAINER [CONTAINER...] •命令参数(OPTIONS): -f, --format string 利用特定Go语言的format格式输出结果 -s, --size 显示总大小
-f, --format: 使用 Go 模板语法格式化输出。
docker inspect -f '{{ json .Id }}' nginx
-t 时间戳
docker top 显示容器内运行的进程容器名/ID
docker attach 附加到容器的标准输入输出(慎用,可能阻塞)允许用户直接与容器交互 容器名/ID
•作用: 将当前终端的STDIN、STDOUT、STDERR绑定到正在运行的容器的主进程上实现连接 •命令格式: docker attach [OPTIONS] CONTAINER •命令参数(OPTIONS): --no-stdin 不绑定STDIN
docker logs 查看容器日志 COMMAND的信息
•作用: 查看容器的日志信息 •命令格式: docker logs [OPTIONS] CONTAINER •命令参数(OPTIONS): --details 显示日志的额外信息 -f, --follow 动态跟踪显示日志信息 --since string 只显示某事时间节点之后的 --tail string 显示倒数的行数(默认全部) -t, --timestamps 显示timestamps时间 --until string 只显示某事时间节点之前的 •注意: 容器日志中记录的是容器主进程的输出STDOUT\STDERR
-f(实时跟踪)、--tail N(显示最后N行)
docker stats 实时监控容器的资源使用(CPU/内存/网络)容器名/ID
docker port 显示容器的端口映射信息容器名/ID
docker diff 查看容器文件系统的变更容器名/ID
docker cp 在容器和宿主机之间复制文件宿主机路径 容器名:容器路径
docker export 将容器文件系统导出为 tar 归档文件
-o(指定输出文件)
docker wait 阻塞直到容器停止,返回退出代码容器名/ID
网络管理
安装ping工具
apt update
apt install iputils-ping -y
使用
ping baidu.com
Docker有五种网络驱动模式
bridge network 模式(网桥):默认的网络模式。类似虚拟机的nat模式
 特点: •宿主机上需要单独的bridge网卡,如默认docker默认创建的docker0。 •容器之间、容器与主机之间的网络通信,是借助为每一个容器生成的一对veth pair虚拟网络设备对,进行通信的。一个在容器上,另一个在宿主机上。 •每创建一个基于bridge网络的容器,都会自动在宿主机上创建一个veth**虚拟网络设备。 •外部无法直接访问容器。需要建立端口映射才能访问。 •容器借由veth虚拟设备通过如docker0这种bridge网络设备进行通信。 •每一容器具有单独的IP •作用: 启动的容器时,为容器进行端口映射 •命令格式: docker run/create -P … 或者 docker run/create –p … •命令参数(OPTIONS): -P, --publish-all 将容器内部所有暴露端口进行随机映射 -p, --publish list 手动指定端口映射 •注意: -p [HOST_IP]:[HOST_PORT]:CONTAINER_PORT 如:-p ::80 将容器的80端口随机(端口)映射到宿主机任意IP -p :8000:6379 将容器的6379端口映射到宿主机任意IP的8000端口 -p 192.168.5.1::3306 将容器的3306端口随机(端口)映射到宿主机的192.168.5.1IP上
端口映射

docker run/create -p
指定随机端口(有暴露的端口的镜像才行)
docker run -dti -p redis
手动指定端口映射
-p ::80 将容器的80端口随机(端口)映射到宿主机任意IP -p :8000:6379 将容器的6379端口映射到宿主机任意IP的8000端口 -p 192.168.5.1::3306 将容器的3306端口随机(端口)映射到宿主机的192.168.5.1IP上
host network 模式(主机):容器与宿主机之间的网络无隔离,即容器直接使用宿主机网络
 特点: •容器完全共享宿主机的网络。网络没有隔离。宿主机的网络就是容器的网络。 •容器、主机上的应用所使用的端口不能重复。例如:如果宿主机已经占用了8090端口,那么任何一个host模式的容器都不可以使用8090端口了;反之同理。 •外部可以直接访问容器,不需要端口映射。 •容器的IP就是宿主机的IP
特殊host 网络模式(Container网络模式)
 •Container网络模式,其实就是容器共享其他容器的网络。 •相当于该容器,,在网络层面上,将其他容器作为“主机”。它们之间的网络没有隔离。 •这些容器之间的特性同host模式。 使用方法: Docker run/create --network container:CONTAINER …
None network 模式:容器禁用所有网络。
•Container网络模式,其实就是容器共享其他容器的网络。 •相当于该容器,,在网络层面上,将其他容器作为“主机”。它们之间的网络没有隔离。 •这些容器之间的特性同host模式。 使用方法: Docker run/create --network container:CONTAINER …
Overlay network 模式(覆盖网络): 利用VXLAN实现的bridge模式
•Overlay 网络,也称为覆盖网络。 •Overlay 网络的实现方式和方案有多种。Docker自身集成了一种,基于VXLAN隧道技术实现。 •Overlay 网络主要用于实现跨主机容器之间的通信。 应用场景:需要管理成百上千个跨主机的容器集群的网络时。 
IP隧道网络原理

用于实现跨主机容器之间的通信

Macvlan network 模式:容器具备Mac地址,使其显示为网络上的物理设备

通信会直接基于mac地址进行转发。
docker network ls 列出所有 Docker 网络
•作用: 查看已经建立的网络对象 •命令格式: docker network ls [OPTIONS] •命令参数(OPTIONS): -f, --filter filter 过滤条件(如 'driver=bridge’) --format string 格式化打印结果 --no-trunc 不缩略显示 -q, --quiet 只显示网络对象的ID •注意: 默认情况下,docker安装完成后,会自动创建bridge、host、none三种网络驱动
-f 过滤条件
-q 只显示网络对象的ID
docker network create 创建自定义网络
•作用: 查看已经建立的网络对象 •命令格式: docker network ls [OPTIONS] •命令参数(OPTIONS): -f, --filter filter 过滤条件(如 'driver=bridge’) --format string 格式化打印结果 --no-trunc 不缩略显示 -q, --quiet 只显示网络对象的ID •注意: 默认情况下,docker安装完成后,会自动创建bridge、host、none三种网络驱动
-d 指定网络的驱动.默认bridge
docker network rm 删除网络网络名/ID
docker network connect 将容器连接到指定网络网络名 容器名
docker network disconnect 断开容器与网络的连接网络名 容器名
-f 强制断开连接
docker network inspect 查看网络详细信息
-f 根据format输出结果
docker run/create --network 为启动的容器指定网络模式
docker run --network host -dti ubuntu bash
数据卷管理
为什么用数据卷
宿主机无法直接访问容器中的文件
容器中的文件没有持久化,导致容器删除后,文件数据也随之消失
容器之间也无法直接访问互相的文件
挂载容器数据卷的三种方式

利用docker run/create的参数为容器挂载数据卷
bind mounts

将宿主机上的一个文件或目录被挂载到容器上。
方式一: -v, --volume参数
-v 宿主机文件或文件夹路径:容器中的文件或者文件夹路径
方式二:--mount参数
--mount type=bind, src=宿主机文件或文件夹路径, dst=容器中的文件或者文件夹路径
volumes(最常用)
由Docker创建和管理。使用docker volume命令管理
方式一: -v, --volume参数
-v VOLUME-NAME:容器中的文件或者文件夹路径
方式二:--mount 参数
--mount type=volume, src=VOLUME-NAME, dst=容器中的文件或者文件夹路径
对象管理
docker volume create 创建数据卷对象
docker volume inspect 查看数据卷详细信息
docker volume ls 查看已创建的数据卷对象
docker volume prune 删除未被使用的数据卷对象
docker volume rm 删除一个或多个数据卷对象
tmpfs mounts
tmpfs 是一种基于内存的临时文件系统。tmpfs mounts 数据不会存储在磁盘上。
docker run/create为容器挂载数据卷
--mount type=tmpfs, dst=PATH
镜像仓库操作
Docker 私有仓库搭建
搭建无认证私有仓库
第一步:在需要搭建仓库的服务器上安装docker。
第二步:在服务器上,从docker hub下载registry仓库
docker pull registry
第三步:在服务器上,启动仓库
docker run -d -ti --restart always --name my-registry -p 8000:5000 -v /my-registry/registry:/var/lib/registry registry
查看当前仓库中的存放的镜像列表
curl 127.0.0.1:8000/v2/_catalog
私有仓库--上传、下载镜像
注意: 必须重命名为服务器IP:端口/IMAGE_NAME 如果push出现了类似https的错误那么需要往配置文件/etc/docker/daemon.json里添加:”insecure-registries”:[“服务器IP:端口”] 然后重启docker。
第一步:利用docker tag重命名需要上传的镜像
docker tag IMAGE 服务器IP:端口/IMAGE_NAME
第二步:利用docker push上传刚刚重命名的镜像
docker push 服务器IP:端口/centos
删除私有仓库
docker rm -f my-registry
搭建带认证的私有仓库
搭建带认证的私有仓库
mkdir /my-registry/auth -p
创建密码验证文件
注意将将USERNAME和PASSWORD替换为设置的用户名和密码
docker run --entrypoint htpasswd registry -Bbn USERNAME PASSWORD > /my-registry/auth/htpasswd
重新启动仓库镜像
docker run -d -p 8000:5000 --restart=always --name docker-registry \ -v /my-registry/registry:/var/lib/registry \ -v /my-registry/auth:/auth \ -e "REGISTRY_AUTH=htpasswd" \ -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \ -e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" \ registry
带认证的私有仓库 -上传、下载镜像
在本地机器上
首先登录到服务器
docker login -u username -p password 47.94.153.230:8000
查看镜像
docker images
然后执行pull或者push命令
docker pull 47.94.153.230:8000/centos-latest
docker push 47.94.153.230:8000/centos-latest
退出登录
docker logout 47.94.153.230:8000
docker login 登录镜像仓库(如 Docker Hub)-u(用户名)、-p(密码)
docker logout 退出镜像仓库登录
docker pull 从仓库拉取镜像到本地镜像名:标签
•作用: 下载远程仓库(如Docker Hub)中的镜像 •命令格式: docker pull [OPTIONS] NAME[:TAG|@DIGEST] •命令参数(OPTIONS): -a, --all-tags 下载所有符合给定tag的镜像
docker push 将本地镜像推送到仓库镜像名:标签
docker search 在仓库中搜索镜像关键词
•作用: 搜索Docker Hub(镜像仓库)上的镜像 •命令格式: docker search [OPTIONS] TERM •命令参数(OPTIONS): -f, --filter filter 根据提供的格式筛选结果 --format string 利用Go语言的format格式化输出结果 --limit int 展示最大的结果数,默认25个 --no-trunc 内容全部显示
-f 根据提供的格式筛选结果
docker search -f is-official=true ubuntu
Dockerfile
创建Dockerfile文件
vi dockerfile
官方各种Dockerfile
创建镜像
docker build [OPTIONS] PATH | URL
PATH Dockerfile所在路径(文件夹路径),文件名必须是Dockerfile
URL Dockerfile所在URL地址
OPTIONS
-t, --tag list 为镜像设置名称和tag
-f, --file string 指定Dockerfile的路径
命令
FROM: 指定基础镜像
RUN: 构建镜像过程中需要执行的命令。可以有多条。docker build
WORKDIR:设置工作目录
CMD:添加启动容器时需要执行的命令。多条只有最后一条生效。可以在启动容器时被覆盖和修改。
ENTRYPOINT:同CMD,但这个一定会被执行,不会被覆盖修改。
:为镜像添加对应的数据。
MLABELAINTAINER:表明镜像的作者。将被遗弃,被LABEL代替。
EXPOSE:设置对外暴露的端口。
ENV:设置执行命令时的环境变量,并且在构建完成后,仍然生效
ARG:设置只在构建过程中使用的环境变量,构建完成后,将消失
ADD:将本地文件或目录拷贝到镜像的文件系统中。能解压特定格式文件,能将URL作为要拷贝的文件
COPY:将本地文件或目录拷贝到镜像的文件系统中。
VOLUME:添加数据卷
USER:指定以哪个用户的名义执行RUN, CMD 和ENTRYPOINT等命令
ONBUILD:如果制作的镜像被另一个Dockerfile使用,将在那里被执行Docekrfile命令
STOPSIGNAL:设置容器退出时发出的关闭信号。
HEALTHCHECK:设置容器状态检查。
SHELL:更改执行shell命令的程序。Linux的默认shell是[“/bin/sh”, “-c”],Windows的是[“cmd”, “/S”, “/C”]。
Docker Compose 命令
Docker Compose是一个能一次性定义和管理多个Docker容器的工具。
Compose中定义和启动的每一个容器都相当于一个服务(service) Compose中能定义和启动多个服务,且它们之间通常具有协同关系
Docker Compose安装
sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
创建Docker Compose文件
vi docker-compose.yaml
docker-compose --help
查看或者查看官方文档
Docker Compose File TOP配置参数概览

version:指定Docker Compose File版本号 services:定义多个服务并配置启动参数 volumes:声明或创建在多个服务中共同使用的数据卷对象 networks:定义在多个服务中共同使用的网络对象 configs:声明将在本服务中要使用的一些配置文件 secrets:声明将在本服务中要使用的一些秘钥、密码文件 x-***:自定义配置。主要用于复用相同的配置。
docker compose up 启动所有服务(构建+运行)
-d(后台运行)、--build(重新构建)
docker compose down 停止并删除所有服务(容器、网络、卷)
-v(同时删除数据卷)
docker compose ps 列出 Compose 管理的容器
docker compose build 构建 Compose 文件定义的服务镜像
--no-cache(禁用缓存)
docker compose start 启动已存在的服务容器服务名
docker compose restart 重启服务容器服务名
docker compose pause
暂停服务
docker compose unpause
取消暂停服务
docker compose stop
停止服务
docker compose kill
终止容器
docker compose rm
移除已停止的容器
docker compose down
停止并移除容器、网络、镜像和卷
docker compose logs 查看服务日志
-f(实时跟踪)
docker compose bundle
从 Compose 文件生成 Docker bundle
docker compose config
验证并查看 Compose 文件
docker compose create
创建服务
docker compose events
接收来自容器的实时事件
docker compose exec
在运行中的容器里执行命令
docker compose images
列出镜像
docker compose port
打印端口绑定的公网端口
docker compose pull
拉取服务镜像
docker compose push
推送服务镜像
docker compose run
运行一次性命令
docker compose scale
设置服务的容器数量
docker compose top
显示运行中的进程
docker compose version
显示 Docker - Compose 版本信息
案例一 小型web服务项目搭建
先创建一个文件夹workspce
mkdir workspce
进入文件夹
cd workspce
创建代码目录
mkdir case1-flask-web/flask-web-code -p
进入目录
cd case1-flask-web/flask-web-code
准备一个app.py
# encoding:utf-8 import time import redis from flask import Flask app = Flask(__name__) # 此处的 redis 为 docker-compose.yaml 配置文件中 redis 服务的名称 cache = redis.Redis(host='redis', port=6379) def get_hit_count(): """利用 redis 统计访问次数""" retries = 1 # 由于当 redis 重启时,可能会有短时间无法访问 redis # 因此循环的作用就是在这个期间重试,默认重试 5 次 while True: try: # redis 的 incr 方法,如果 hits 键存在则自动 +1,否则新增键,值为 1 return cache.incr('hits') except redis.exceptions.ConnectionError as exc: if retries == 0: raise exc retries -= 1 time.sleep(0.5) @app.route('/') def main(): count = get_hit_count() return "欢迎访问!网站已经累计访问 {} 次\n".format(count) if __name__ == "__main__": app.run(host="0.0.0.0", debug=True)
准备一个requirements.txt
redis flask
返回case1-flask-web文件夹
cd ..
创建dockerfile
# flask web app v1.0 # 第一步:获取一个镜像:python3.6 FROM python:alpine3.6 # 第二步:拷贝项目代码到镜像中 ADD COPY COPY ./flask-web-code /code # 第三步:安装项目的依赖环境:第三方模块 flask redis WORKDIR /code RUN pip install -r requirements.txt # 第四步:配置项目的启动 CMD参数 python app.py CMD ["python", "app.py"]
vi dockerfile
构建镜像
docker build . -t my-flask-image
创建docker-compose.yaml
# Docker Compose 文件的版本,3.6 是常用稳定版本 version: "3.6" # 定义要部署的服务(services),一个服务通常对应一个容器(可简单理解为运行的应用实例) services: # 服务名称:flask - web,用于标识这个 Flask web 应用相关的服务配置 flask-web: # 指定构建上下文路径,这里. 表示使用当前目录下的 Dockerfile 来构建镜像(若要构建自定义镜像时用) build: . # 端口映射,把宿主机的 5000 端口映射到容器内的 5000 端口,外部可通过宿主机 5000 访问容器服务 ports: - "5000:5000" # 给运行后的容器起一个自定义名称,方便识别和管理,这里叫 flask - web container_name: flask-web # 配置容器要加入的网络,这里加入名为 web 的自定义网络,用于和其他服务(如 redis)通信 networks: - web # 服务名称:redis,对应 Redis 数据库服务配置 redis: # 使用官方的 redis 镜像来创建容器(不需要自己构建,直接拉取公共镜像) image: redis # 给 Redis 容器起的自定义名称,这里叫 redis3 container_name: redis3 # 让 Redis 容器加入 web 这个自定义网络,实现和 flask - web 等服务的网络互通 networks: - web # 数据卷挂载,把宿主机上名为 redis - data 的数据卷(或本地目录,结合 volumes 定义看)挂载到容器内的 /data 目录,用于持久化 Redis 数据 volumes: - redis-data:/data # 自定义网络(networks)配置,用于服务之间的网络通信隔离或打通 networks: # 网络名称:web web: # 指定网络驱动为 bridge,这是 Docker 常用的桥接网络模式,容器间可通过该网络相互访问 driver: "bridge" # 数据卷(volumes)配置,用于持久化存储数据(如 Redis 的数据) volumes: # 数据卷名称:redis - data redis-data: # 指定数据卷驱动为 local,即使用本地机器的存储来保存数据卷内容 driver: "local"
vi docker-compose.yaml
启动(重启)服务
docker compose up -d
测试
curl 127.0.0.1:5000
系统信息与维护
docker info显示 Docker 系统信息(存储驱动、镜像数等)
docker version 显示 Docker 客户端和服务端版本
docker system prune 清理未使用的资源(容器、镜像、网络、缓存)