注意:后续技术分享,第一时间更新,以及更多更及时的技术资讯和学习技术资料,将在公众号CTO Plus发布,请关注公众号:CTO Plus
Docker是一种基于Linux的开源的应用容器引擎,它能够实现一个隔离的、安全的、独立的容器环境,在这个容器中可以安装各种产品,例如MySQL、Nginx、Python、Redis等,并且能够实现秒级启动和关闭。让开发者可以打包应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,进行容器化部署,也可以实现虚拟化。
Docker的应用场景
- Web 应用的自动化打包和发布。
- 自动化测试和持续集成、发布。
- 在服务型环境中部署和调整数据库或其他的后台应用。
- 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。
Docker的优点
Docker 是一个用于开发,交付和运行应用程序的开放平台。Docker 使能够将应用程序与基础架构分开,从而可以快速交付软件。借助 Docker,可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付,测试和部署代码,可以大大减少编写代码和在生产环境中运行代码之间的延迟。
1、快速,一致地交付的应用程序
Docker 允许开发人员使用提供的应用程序或服务的本地容器在标准化环境中工作,从而简化了开发的生命周期。
容器非常适合持续集成和持续交付(CI / CD)工作流程,请考虑以下示例方案:
- 的开发人员在本地编写代码,并使用 Docker 容器与同事共享他们的工作。
- 他们使用 Docker 将其应用程序推送到测试环境中,并执行自动或手动测试。
- 当开发人员发现错误时,他们可以在开发环境中对其进行修复,然后将其重新部署到测试环境中,以进行测试和验证。
- 测试完成后,将修补程序推送给生产环境,就像将更新的镜像推送到生产环境一样简单。
2、响应式部署和扩展
Docker 是基于容器的平台,允许高度可移植的工作负载。Docker 容器可以在开发人员的本机上,数据中心的物理或虚拟机上,云服务上或混合环境中运行。
Docker 的可移植性和轻量级的特性,还可以使轻松地完成动态管理的工作负担,并根据业务需求指示,实时扩展或拆除应用程序和服务。
3、在同一硬件上运行更多工作负载
Docker 轻巧快速。它为基于虚拟机管理程序的虚拟机提供了可行、经济、高效的替代方案,因此可以利用更多的计算能力来实现业务目标。Docker 非常适合于高密度环境以及中小型部署,可以用更少的资源做更多的事情。
Docker版本变更
Docker从1.13.x版本开始,版本分为企业版EE和社区版CE,版本号也改为按照时间线来发布,比如17.03就是2017年3月。Docker的linux发行版的软件仓库从以前的https://apt.dockerproject.org和https://yum.dockerproject.org变更为目前的https://download.docker.com, 软件包名字改为docker-ce和docker-ee。
Docker架构
Docker 包括三个基本概念:
- 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
- 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。Docker 容器通过 Docker 镜像来创建。
- Docker 镜像(Images)
Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统。
- Docker 容器(Container)
容器是独立运行的一个或一组应用,是镜像运行时的实体。
- Docker 客户端(Client)
Docker客户端通过命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 与 Docker 的守护进程通信。
- Docker 主机(Host)
一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。
- Docker Registry
Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。
Docker Hub(https://hub.docker.com)提供了庞大的镜像集合供使用。
一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。
通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。
- Docker Machine
Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。
Windows安装Docker
Docker 并非是一个通用的容器工具,它依赖于已存在并运行的 Linux 内核环境。
Docker 实质上是在已经运行的 Linux 下制造了一个隔离的文件环境,因此它执行的效率几乎等同于所部署的 Linux 主机。
因此,Docker 必须部署在 Linux 内核的系统上。如果其他系统想部署 Docker 就必须安装一个虚拟 Linux 环境。
Docker Desktop 是 Docker 在 Windows 10 和 macOS 操作系统上的官方安装方式,这个方法依然属于先在虚拟机中安装 Linux 然后再安装 Docker 的方法。
Docker Desktop 官方下载地址: Install Docker Desktop on Windows
注意:此方法仅适用于 Windows 10 操作系统专业版、企业版、教育版和部分家庭版。
安装 Hyper-V
Hyper-V 是微软开发的虚拟机,类似于 VMWare 或 VirtualBox,仅适用于 Windows 10。这是 Docker Desktop for Windows 所使用的虚拟机。
但是,这个虚拟机一旦启用,QEMU、VirtualBox 或 VMWare Workstation 15 及以下版本将无法使用!如果必须在电脑上使用其他虚拟机(例如开发 Android 应用必须使用的模拟器),请不要使用 Hyper-V
开启 Hyper-V
也可以通过命令来启用 Hyper-V ,请右键开始菜单并以管理员身份运行 PowerShell,执行以下命令:
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V –All
安装完成后重启系统
安装 Docker Desktop for Windows
双击下载的 Docker for Windows Installer 安装文件,一路 Next,点击 Finish 完成安装。
安装完成后,Docker Desktop提示重启操作系统,重启即可。
可以在命令行执行 docker version 来查看版本号,docker run hello-world 来载入测试镜像测试。
如果没启动,可以在 Windows 搜索 Docker 来启动。
错误信息:error during connect: In the default daemon configuration on Windows, the docker client must be run with elevated privileges to connect.: Get "http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.24/version": open //./pipe/docker_engine: The system cannot find the file specified.
以管理员方式启动Docker Desktop即可
启动Desktop
升级WSL
如果启动中遇到因 WSL 2 导致地错误,请安装 WSL2。
安装之后,可以打开 PowerShell 并运行以下命令检测是否运行成功:
docker run hello-world
能成功运行即可
win7、win8 系统
win7、win8 等需要利用 docker toolbox 来安装,国内可以使用阿里云的镜像来下载,下载地址:docker-toolbox-windows-docker-toolbox安装包下载_开源镜像站-阿里云
安装比较简单,双击运行,点下一步即可,可以勾选自己需要的组件:
docker toolbox 是一个工具集,它主要包含以下一些内容:
- Docker CLI - 客户端,用来运行 docker 引擎创建镜像和容器。
- Docker Machine - 可以让在 Windows 的命令行中运行 docker 引擎命令。
- Docker Compose - 用来运行 docker-compose 命令。
- Kitematic - 这是 Docker 的 GUI 版本。
- Docker QuickStart shell - 这是一个已经配置好Docker的命令行环境。
- Oracle VM Virtualbox - 虚拟机。
下载完成之后直接点击安装,安装成功后,桌边会出现三个图标,如下图所示:
点击 Docker QuickStart 图标来启动 Docker Toolbox 终端。
如果系统显示 User Account Control 窗口来运行 VirtualBox 修改的电脑,选择 Yes。
输入docker run hello-world
docker run -it ubuntu bash
Linux安装Docker
离线的安装参考:云主机-生产环境下离线安装Docker部署应用_SteveRocket的博客-CSDN博客
Docker的社区版(Docker Community Edition)叫做docker-ce。老版本的Docker包叫做docker或者docker-engine,如果安装了老版本的docker得先卸载然后再安装新版本的docker。docker的发展非常迅速,apt源的更新往往比较滞后。
所以docker官网推荐的安装方式都是下载docker安装脚本安装。
curl -fsSL get.docker.com -o get-docker.sh
# 卸载老旧的版本(若未安装过可省略此步):
1. 移除之前docker版本并更新更新 apt 包索引
sudo apt-get remove docker docker-engine docker.io
sudo apt-get update
2. 安装 apt 依赖包,用于通过HTTPS来获取仓库
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
3. 添加 Docker 的官方 GPG 密钥
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add –
4. 设置docker稳定版仓库,这里使用阿里云仓库
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
5. 安装免费的docker Community版本docker-ce
sudo apt-get -y install docker-ce
sudo apt-get install -y docker-ce=<VERSION> #该命令可以选择docker-ce版本
6. 查看docker版本及运行状态
sudo docker -v
sudo systemctl status docker
7. 本步非必需。使用阿里云设置Docker镜像加速,注意下面链接请使用阿里云给自己的URL
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://ua3456xxx.mirror.aliyuncs.com"] } EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
容器生命周期管理命令
run
docker run:创建一个新的容器并运行一个命令
用法:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
镜像名:版本号 :启动镜像作为容器,可以带有以下参数:
-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项
-i: 以交互模式运行容器,通常与-t同时使用;
-t: 为容器重新分配一个伪输入终端,通常与-i同时使用;
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口,将主机端口映射到容器的端口
-P: 随机端口映射,容器内部端口随机映射到主机的端口
-d: 后台运行容器,并返回容器ID
--name: 指定一个容器名称
--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
--dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
-h "mars": 指定容器的hostname;
--env-file=[]: 从指定文件读入环境变量;
--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
-m :设置容器使用内存最大值;
--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
--expose=[]: 开放一个端口或一组端口;
-e: 设置环境变量,如:-e version=1.0.1
-volume: -v绑定卷
-link=[]: 添加链接到另一个容器
使用docker镜像nginx:latest以后台模式启动一个容器,并将容器命名为mynginx
docker run --name mynginx -d nginx:latest
使用镜像nginx:latest以后台模式启动一个容器,并将容器的80端口映射到主机随机端口
docker run -P -d nginx:latest
使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data。
docker run -p 80:80 -v /data:/data -d nginx:latest
docker run --name mynginx -it -p 8080:80 mynginx:1.0
绑定容器的 8080 端口,并将其映射到本地主机 127.0.0.1 的 80 端口上。
docker run -p 127.0.0.1:80:8080/tcp ubuntu bash
使用镜像nginx:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。
docker run -it nginx:latest /bin/bash
使用镜像ubuntu以交互模式启动一个容器,在容器内执行/bin/bash命令。
docker run -it ubuntu /bin/bash
在 Docker 容器退出时,默认容器内部的文件系统仍然被保留,以方便调试并保留用户数据。但是,对于 foreground 容器,由于其只是在开发调试过程中短期运行,其用户数据并无保留的必要,因而可以在容器启动时设置 --rm 选项,这样在容器退出时就能够自动清理容器内部的文件系统。
docker run --rm ba-208
或
docker run --rm=true ba-208
--rm 选项不能与 -d 同时使用(或者说同时使用没有意义),即只能自动清理 foreground 容器,不能自动清理detached容器。
注意,--rm 选项也会清理容器的匿名data volumes。
所以,执行 docker run 命令带 --rm命令选项,等价于在容器退出后,执行 docker rm -v。
start/stop/restart
启动容器:docker start + 容器名
docker start mynginx
停止一个正在运行的容器: docker stop 容器
docker stop mynginx
重启容器:docker restart + 容器名
docker restart mynginx
kill
docker kill :杀掉一个运行中的容器。
参数:
-s:向容器发送一个信号
docker kill -s KILL mynginx
rm
删除一个或多个容器。
参数:
-f :通过 SIGKILL 信号强制删除一个运行中的容器。
-l :移除容器间的网络连接,而非容器本身。
-v :删除与容器关联的卷。
删除一个容器:docker rm 容器名
docker rm mynginx
强制删除三个正在运行的容器:docker rm -f 容器名
docker rm -f mynginx mynginx2 mynginx3
移除容器 nginx01 对容器 db01 的连接,连接名 db
docker rm -l db
删除容器 nginx01, 并删除容器挂载的数据卷
docker rm -v nginx01
删除所有已经停止的容器:
docker rm $(docker ps -a -q)
pause/unpause
docker pause :暂停容器中所有的进程。
docker unpause :恢复容器中所有的进程。
暂停数据库容器db01提供服务。
docker pause db01
恢复数据库容器 db01 提供服务。
docker unpause db01
create
docker create :创建一个新的容器但不启动它,用法同run
创建容器: docker create + 选项(-i, -t, -d, -p, -v, -e) + 镜像
参数:
-i:以交互模式运行容器,通常与-t 同时使用;
-d:后台运行容器,并返回容器ID;
-p:端口隐射, 宿主机在前,容器在后
-t:为容器重新分配一个伪输入终端,通常与-i 同时使用;
-v:目录挂载
--entrypoint: 指定进入点
--restart=always: 服务重启
使用docker镜像nginx:latest创建一个容器,并将容器命名为nginx_test
docker create --name nginx_test nginx:latest
docker create --name mynginx_1 -it -p 8080:80 mynginx:1.0
exec
docker exec :在运行的容器中执行命令
参数:
-d :分离模式: 在后台运行
-i :即使没有附加也保持STDIN 打开
-t :分配一个伪终端
-it 容器名 /bin/bash :进入容器内部
# 进入运行的容器,执行命令: docker exec + 选项 + 容器名 + 命令 + 参数
# 推荐使用 docker exec命令,因为此退出容器终端,不会导致容器的停止
在容器 mynginx 中开启一个交互模式的终端
docker exec -i -t mynginx /bin/bash
或
docker exec -it mynginx /bin/bash
在容器 mynginx 中以交互模式执行容器内 start.sh 脚本
docker exec -it mynginx /bin/bash start.sh
可以通过 docker ps -a 命令查看已经在运行的容器,然后使用容器 ID 进入容器。
查看已经在运行的容器 ID:
docker ps -a
通过 exec 命令对指定的容器执行 bash
docker exec -it {container_id} /bin/bash
容器操作命令
ps
列出容器,查看当前运行的容器
-a 查看全部容器, 包括停止运行的容器。
-f :根据条件过滤显示的内容。
--format :指定返回值的模板文件。
-l :显示最近创建的容器。
-n :列出最近创建的n个容器。
--no-trunc :不截断输出。
-q :静默模式,只显示容器编号。
-s :显示总的文件大小。
查看正在运行中的容器:docker ps
字段描述:
CONTAINER ID: 容器 ID。
IMAGE: 使用的镜像。
COMMAND: 启动容器时运行的命令。
CREATED: 容器的创建时间。
STATUS: 容器状态。
状态有7种:
- created(已创建)
- restarting(重启中)
- running(运行中)
- removing(迁移中)
- paused(暂停)
- exited(停止)
- dead(死亡)
PORTS: 容器的端口信息和使用的连接类型(tcp\udp)。
NAMES: 自动分配的容器名称。
查看所有容器,包括停止运行的容器: docker ps -a
docker ps -a
列出最近创建的5个容器信息
docker ps -n 5
列出所有创建的容器ID
docker ps -a -q
根据标签过滤显示的内容
docker run -d --name=test-nginx --label color=blue nginx
docker ps --filter "label=color"
docker ps --filter "label=color=blue"
根据名称过滤显示的内容
docker ps --filter "name=test-nginx"
根据状态过滤显示的内容
docker ps -a --filter 'exited=0'
docker ps --filter status=running
docker ps --filter status=paused
根据镜像名称过滤显示的内容
docker ps --filter ancestor=nginx
根据镜像ID过滤显示的内容
docker ps --filter ancestor=d0e008c6cf02
根据启动顺序过滤显示的内容
docker ps -f before=9c3527ed70ce
docker ps -f since=6e63f6ff38b0
inspect
获取容器/镜像的元数据。查看容器详细情况,包括主机内ip地址等。
语法:docker inspect [OPTIONS] NAME|ID [NAME|ID...]
参数:
-f :指定返回值的模板文件。
-s :显示总的文件大小。
--type :为指定类型返回JSON。
查看容器的底层信息:docker inspect + 容器名
docker inspect ubuntu
利用inspect命令查看容器的IP地址
docker inspect web | grep "IPAddress"
获取正在运行的容器mymysql的IP
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mymysql
获取镜像mysql:5.6的元信息
docker inspect mysql:5.6
top
查看容器中运行的进程信息,支持 ps 命令参数。
语法:docker top [OPTIONS] CONTAINER [ps OPTIONS]
容器运行时不一定有/bin/bash终端来交互执行top命令,而且容器还不一定有top命令,可以使用docker top来实现查看container中正在运行的进程。
查看容器内运行进程信息:docker top + 容器名
docker top mynginx
查看所有运行容器的进程信息
for i in `docker ps |grep Up|awk '{print $1}'`;do echo \ &&docker top $i; done
attach
连接到正在运行中的容器。
要attach上去的容器必须正在运行,可以同时连接上同一个container来共享屏幕(与screen命令的attach类似)。
官方文档中说attach后可以通过CTRL-C来detach,但实际上经过测试,如果container当前在运行bash,CTRL-C自然是当前行的输入,没有退出;如果container当前正在前台运行进程,如输出nginx的access.log日志,CTRL-C不仅会导致退出容器,而且还stop了。这不是我们想要的,detach的意思按理应该是脱离容器终端,但容器依然运行。好在attach是可以带上--sig-proxy=false来确保CTRL-D或CTRL-C不会关闭容器。
容器mynginx将访问日志指到标准输出,连接到容器查看访问信息。
docker attach --sig-proxy=false mynginx
events
从服务器获取实时事件.
参数:
-f :根据条件过滤事件;
--since :从指定的时间戳后显示所有事件;
--until :流水时间显示到指定的时间为止;
显示docker 2023年4月1日后的所有事件。
docker events --since="1678801542"
显示docker镜像为mysql:5.6 2023年4月1日后的相关事件。
docker events -f "image"="mysql:5.6" --since="1678801542"
如果指定的时间是到秒级的,需要将时间转成时间戳。如果时间为日期的话,可以直接使用,如--since="2023-04-01"。
logs
获取容器的日志。
参数:
-f : 跟踪日志输出
--since :显示某个开始时间的所有日志
-t : 显示时间戳
--tail :仅列出最新N条容器日志
查看容器日志:docker logs + 容器名
docker logs mynginx
跟踪查看容器mynginx的日志输出。
docker logs -f mynginx
查看容器mynginx从2023年4月1日后的最新10条日志
docker logs --since="2023-04-01" --tail=10 mynginx
wait
阻塞运行直到容器停止,然后打印出它的退出代码。
docker wait CONTAINER
export
将文件系统作为一个tar归档文件导出到STDOUT。
参数:
-o :将输入内容写到文件。
将id为a404c6c174a2的容器按日期保存为tar文件。
docker export -o mysql-`date +%Y%m%d`.tar a404c6c174a2
ls mysql-`date +%Y%m%d`.tar
port
用于列出指定的容器的端口映射,或者查找将 PRIVATE_PORT NAT 到面向公众的端口。
查看容器端口映射:docker port 容器名
docker port mynginx
stats
显示容器资源的使用情况,包括:CPU、内存、网络 I/O 等。
参数:
--all , -a :显示所有的容器,包括未运行的。
--format :指定返回值的模板文件。
--no-stream :展示当前状态就直接退出了,不再实时更新。
--no-trunc :不截断输出。
查看所有在运行容器的信息:docker stats
docker stats
参数:
CONTAINER ID 与 NAME: 容器 ID 与名称。
CPU % 与 MEM %: 容器使用的 CPU 和内存的百分比。
MEM USAGE / LIMIT: 容器正在使用的总内存,以及允许使用的内存总量。
NET I/O: 容器通过其网络接口发送和接收的数据量。
BLOCK I/O: 容器从主机上的块设备读取和写入的数据量。
PIDs: 容器创建的进程或线程数。
根据容器等 ID 或名称现实信息:
docker stats {CONTAINER ID} {NAME}
JSON 格式输出:
docker stats nginx --no-stream --format "{{ json . }}"
指定的信息:
docker stats --all --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}" fervent_panini 5acfcb1b4fd1 drunk_visvesvaraya big_heisenberg
{"BlockIO":"0B / 13.3kB","CPUPerc":"0.03%","Container":"nginx","ID":"ed37317fbf42","MemPerc":"0.24%","MemUsage":"2.352MiB / 982.5MiB","Name":"nginx","NetIO":"539kB / 606kB","PIDs":"2"}
rename
容器重命名:docker rename 老名字 新名字
docker rename mynginx_1 mynginx_2
container
删除已停止运行的所有容器: docker container prune
docker container prune
容器rootfs命令
commit
根据容器创建一个新的镜像。
语法:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
参数:
-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
-p :在commit时,将容器暂停。
根据容器创建镜像:docker commit 容器名 镜像名
docker commit
将容器a404c6c174a2 保存为新的镜像,并添加提交人信息和说明信息。
docker commit -a "steverocket" -m "nginx server" a404c6c174a2 nginxserver:v1
docker images nginxserver:v1
cp
用于容器与主机之间的数据拷贝。
语法:
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
或
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
参数:
-L :保持源目标中的链接
拷贝文件,从容器到宿主机:docker cp 容器名:容器内路径 宿主机文件路径
docker cp myweb_1:/index.html index.html
拷贝文件,从宿主机到容器:docker cp 宿主机文件路径 容器名:容器内路径
docker cp index.html myweb_1:/index.html
将主机/www/steverocket目录拷贝到容器96f7f14e99ab的/www目录下。
docker cp /www/steverocket 96f7f14e99ab:/www/
将主机/www/steverocket目录拷贝到容器96f7f14e99ab中,目录重命名为www。
docker cp /www/steverocket 96f7f14e99ab:/www
将容器96f7f14e99ab的/www目录拷贝到主机的/tmp目录中。
docker cp 96f7f14e99ab:/www /tmp/
diff
检查容器里文件结构的更改。
查看容器内已修改文件:docker diff 容器名
docker diff mynginx_1
镜像仓库命令
login/logout
docker login : 登陆到一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub
docker logout : 登出一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub
参数:
-u :登陆的用户名
-p :登陆的密码
登陆到Docker Hub
docker login -u 用户名 -p 密码
登出Docker Hub
docker logout
pull
从镜像仓库中拉取或者更新指定镜像,拉取docker hub中的镜像,如果不指定镜像名版本则为最新版本的镜像。
语法:docker pull [OPTIONS] NAME[:TAG|@DIGEST]
参数:
-a :拉取所有 tagged 镜像
--disable-content-trust :忽略镜像的校验,默认开启
从registry拉取镜像:docker pull + 镜像名字:版本号
docker pull nginx:latest
docker pull redis:latest
从Docker Hub下载java最新版镜像。
docker pull java
从Docker Hub下载REPOSITORY为java的所有镜像。
docker pull -a java
用于获取指定编译平台的镜像
docker pull --platform=arm64|amd64... image_name
push
将本地的镜像上传到镜像仓库,要先登陆到镜像仓库。
语法:docker push [OPTIONS] NAME[:TAG]
参数:
--disable-content-trust :忽略镜像的校验,默认开启
从registry仓库提交镜像:docker push + 仓库名:标签
上传本地镜像mynginx:v1.0到镜像仓库中。
docker push mynginx:v1.0
search
从Docker Hub查找镜像
语法:docker search [OPTIONS] TERM
参数:
--automated :只列出 automated build类型的镜像;
--no-trunc :显示完整的镜像描述;
-f <过滤条件>:列出收藏数不小于指定值的镜像。
搜索镜像:docker search + 镜像名字
docker search nginx
从 Docker Hub 查找所有镜像名包含 java,并且收藏数大于 10 的镜像
docker search -f stars=10 java
参数:
NAME: 镜像仓库源的名称
DESCRIPTION: 镜像的描述
OFFICIAL: 是否 docker 官方发布
stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。
AUTOMATED: 自动构建。
本地镜像管理命令
images
列出本地镜像,查看所有拉取到的镜像。
语法:docker images [OPTIONS] [REPOSITORY[:TAG]]
参数:
-a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);
--digests :显示镜像的摘要信息;
-f :显示满足条件的镜像;
--format :指定返回值的模板文件;
--no-trunc :显示完整的镜像信息;
-q :只显示镜像ID。
查看本地镜像
docker images
列出本地镜像中REPOSITORY为ubuntu的镜像列表
docker images ubuntu
rmi
删除本地一个或多个镜像。
语法:docker rmi [OPTIONS] IMAGE [IMAGE...]
参数:
-f :强制删除;
--no-prune :不移除该镜像的过程镜像,默认移除;
强制删除本地多个镜像
docker rmi mynginx:1.0 mynginx:2.0
强制删除本地镜像 steverocket/ubuntu:v4
docker rmi -f steverocket/ubuntu:v4
prune
删除停止的容器、删除所有未被容器使用的网络、删除所有none的镜像。
prune 命令用来删除不再使用的 docker 对象。
删除所有未被 tag 标记和未被容器使用的镜像:
docker image prune
删除所有未被容器使用的镜像:
docker image prune -a
删除所有停止运行的容器:
docker container prune
删除所有未被挂载的卷:
docker volume prune
删除所有网络:
docker network prune
删除 docker 所有资源:
docker system prune
tag
标记本地镜像,将其归入某一仓库。
语法:docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
给镜像加标记:docker tag 镜像标签 新镜像标签名
docker tag mynginx:1.0 nginx1
将镜像ubuntu:15.10标记为 steverocket/ubuntu:v3 镜像
docker tag ubuntu:15.10 steverocket/ubuntu:v3
docker images steverocket/ubuntu:v3
build
命令用于使用 Dockerfile 创建镜像。
语法:docker build [OPTIONS] PATH | URL | -
参数:
--build-arg=[] :设置镜像创建时的变量;
--cpu-shares :设置 cpu 使用权重;
--cpu-period :限制 CPU CFS周期;
--cpu-quota :限制 CPU CFS配额;
--cpuset-cpus :指定使用的CPU id;
--cpuset-mems :指定使用的内存 id;
--disable-content-trust :忽略校验,默认开启;
-f :指定要使用的Dockerfile路径;
--force-rm :设置镜像过程中删除中间容器;
--isolation :使用容器隔离技术;
--label=[] :设置镜像使用的元数据;
-m :设置内存最大值;
--memory-swap :设置Swap的最大值为内存+swap,"-1"表示不限swap;
--no-cache :创建镜像的过程不使用缓存;
--pull :尝试去更新镜像的新版本;
--quiet, -q :安静模式,成功后只输出镜像 ID;
--rm :设置镜像成功后删除中间容器;
--shm-size :设置/dev/shm的大小,默认值是64M;
--ulimit :Ulimit配置。
--squash :将 Dockerfile 中所有的操作压缩为一层。
--tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
--network: 默认 default。在构建期间设置RUN指令的网络模式
使用Dockerfile创建镜像: docker build + 目录,.代表当前目录,-t表示加标签
docker build -t mynginx:1.0 .
使用当前目录的 Dockerfile 创建镜像,标签为 steverocket/ubuntu:v1。
docker build -t steverocket/ubuntu:v1 .
使用URL github.com/creack/docker-firefox 的 Dockerfile 创建镜像。
docker build github.com/creack/docker-firefox
也可以通过 -f Dockerfile 文件的位置:
docker build -f /path/to/a/Dockerfile .
在 Docker 守护进程执行 Dockerfile 中的指令前,首先会对 Dockerfile 进行语法检查,有语法错误时会返回:
docker build -t test/myapp
history
查看指定镜像的创建历史。
语法:docker history [OPTIONS] IMAGE
参数:
-H :以可读的格式打印镜像大小和日期,默认为true;
--no-trunc :显示完整的提交记录;
-q :仅列出提交记录ID。
查看本地镜像steverocket/ubuntu:v3的创建历史
docker history steverocket/ubuntu:v3
save
将指定镜像保存成 tar 归档文件。
语法:docker save [OPTIONS] IMAGE [IMAGE...]
参数:
-o :输出到的文件。
将镜像 steverocket/ubuntu:v3 生成 my_ubuntu_v3.tar 文档
docker save -o my_ubuntu_v3.tar steverocket/ubuntu:v3
把镜像保存为.tar文件: docker save 镜像 > 文件
docker save mynginx:1.0 > mynginx_v1.tar
docker 镜像导入导出有两种方法:一种是使用 save 和 load 命令
docker save ubuntu:load>/root/ubuntu.tar
docker load<ubuntu.tar
一种是使用 export 和 import 命令
docker export 98ca36> ubuntu.tar
cat ubuntu.tar | sudo docker import - ubuntu:import
注意:两种方法不可混用
export 和 import 导出的是一个容器的快照, 不是镜像本身, 也就是说没有 layer。
dockerfile 里的 workdir, entrypoint 之类的所有东西都会丢失,commit 过的话也会丢失。
快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也更大。
- docker save 保存的是镜像(image),docker export 保存的是容器(container);
- docker load 用来载入镜像包,docker import 用来载入容器包,但两者都会恢复为镜像;
- docker load 不能对载入的镜像重命名,而 docker import 可以为镜像指定新名称。
load
导入使用 docker save 命令导出的镜像。
语法:docker load [OPTIONS]
参数:
--input , -i : 指定导入的文件,代替 STDIN。
--quiet , -q : 精简输出信息。
从.tar文件载入镜像: docker load -i .tar文件
docker load -i mynginx_v1.tar
导入镜像:
docker image ls
docker load < busybox.tar.gz
docker images
docker load --input fedora.tar
docker images
import
从归档文件中创建镜像。
语法:docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
参数:
-c :应用docker 指令创建镜像;
-m :提交时的说明文字;
从镜像归档文件my_ubuntu_v3.tar创建镜像,命名为steverocket/ubuntu:v4
docker import my_ubuntu_v3.tar steverocket/ubuntu:v4
docker images steverocket/ubuntu:v4
网络操作命令
Docker network 是主要是用做容器之间的通信,即组建容器之间的局域网,然后加入这个网络的容器可以使用别名(network-alias, 比如web, db)或者IP地址进行通信,就如同局域网中主机之间的相互访问。
备注:使用-link 也可以实现容器之间简单的网络,但是容器较多而且通信关系较为复杂时,使用network就更有条理。除此以外,官方也已经很早不建议使用-link方式进行容器互联,-link未来可能会被删除。
Docker网络驱动模式
Docker的网络驱动默认情况下有四个:bridge、host、overlay 和 macvlan,还有一个特殊的网络驱动 none 用于禁止容器访问网络。
- bridge:默认的网络驱动程序。如果在创建的时候没有指定网络驱动,则默认使用 bridge,也就是桥接网络。跟虚拟机的网络地址转换差不多,通过一个内部的子网向容器提供 IP 和网络。
- host:容器会直接与宿主系统共享 IP 地址和网络,但是其它(例如存储,进程命名空间和用户命名空间)相对宿主机隔离的。
- overlay:覆盖网络模式可以将不同的Dockerd守护进程连接在一起,该网络模式支持集群容器之间相互通信,以及集群和某个单机版独立容器直接相互通信。该网络模式使用场景比较广泛,通常集群部署时会使用该模式。
- macvlan:这个网络驱动有点像虚拟机的桥接模式,它可以让的容器直接连接到的物理网络,比如连接到的路由器,让物理网络来提供 IP 地址和网络。
- none: 禁用容器所有网络。通常与自定义网络驱动程序一起使用。
创建一个network
mylocal1-network是局域网的名字,可以自定义。默认bridge模式。
docker network create mylocal1-network
利用--driver或-d指定使用bridge驱动,创建mylocal2-network网络
docker network create –-driver bridge mylocal2-network
查看已创建的network列表
docker network ls
查看网络详情
docker network inspect mylocal1-network
将容器连接到network
运行新的容器,并加入到mylocal1-network网络中
--network 表示这个容器要连接到的网络
--network-alias 表示这个容器在此网络中的名称,也可以使用--ip来指定容器的ip
docker run --name=docker-web -d --network=mylocal1-network --network-alias=web docker-web-image
将已经在运行的容器加入网络使用以下命令, 容器名为docker-web,别名为web
docker network connect --alias=web --network=mylocal1-network docker-web
连接网络时为docker-web容器指定ip地址
docker network connect --ip=192.10.36.122 multi-host-network docker-web
断开docker-web容器与mylocal1-network的连接
docker network disconnet mylocal1-network docker-web
删除network
删除mylocal1-network网络
docker network rm mylocal1-network
其他命令
info
显示 Docker 系统信息,包括镜像和容器数
version
显示 Docker 版本信息。
参数:
-f :指定返回值的模板文件。
参考链接
- Docker 官网:https://www.docker.com
- Docker Docs:Docker Docs: How to build, share, and run applications
- Docker Blog: Blog | Docker
- Docker Store: https://store.docker.com
- Docker Cloud: https://cloud.docker.com
- Docker Hub: https://hub.docker.com
- Docker GitHub: GitHub - moby/moby: Moby Project - a collaborative project for the container ecosystem to assemble container-based systems
- Docker Release: Docker release notes
- Docker Engine:Docker Engine 23.0 release notes
- Docker Desktop:Docker Desktop release notes
- Docker Hub:Docker Hub release notes
- Docker Compose:Docker Compose release notes
- Docker Build:https://docs.docker.com/build/release-notes/
- Docker Fag: Docker frequently asked questions (FAQ)
- Docker SDK API: Develop with Docker Engine SDKs
- Docker CE:GitHub - docker/docker-ce: This repository is deprecated and will be archived (Docker CE itself is NOT deprecated) see the https://github.com/docker/docker-ce/blob/master/README.md
更多资料 · 微信公众号搜索【CTO Plus】关注后,获取更多,我们一起学习交流。
关于公众号的描述访问如下链接