Docker:修订间差异
(创建页面,内容为“Docker 是一个容器引擎的开源软件, ==简介== ===时间轴=== ===虚拟机与容器=== 虚拟机可以在一种操作系统里面运行另一种操…”) |
|||
(未显示同一用户的34个中间版本) | |||
第1行: | 第1行: | ||
Docker | Docker 是一个开源软件的容器引擎软件。 | ||
==简介== | ==简介== | ||
===时间轴=== | ===时间轴=== | ||
* 2013年3月13日,发布初始版本。 | |||
===虚拟机与容器=== | ===虚拟机与容器=== | ||
第19行: | 第20行: | ||
方法一,添加Docker源进行安装: | 方法一,添加Docker源进行安装: | ||
<syntaxhighlight lang="bash"> | |||
#安装所需的软件包 | |||
sudo yum install -y yum-utils device-mapper-persistent-data lvm2 | |||
#安装containerd.io软件包,不然会报错requires containerd.io >= 1.2.2-3 | |||
sudo yum install https://download.docker.com/linux/fedora/30/x86_64/stable/Packages/containerd.io-1.2.6-3.3.fc30.x86_64.rpm | |||
#设置官网的稳定版仓库源 | |||
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo | |||
#可选,体验版和测试版默认是关闭的,可以通过命令打开,详细见文档。 | |||
#安装最新版本的docker CE | |||
sudo yum install docker-ce | |||
#启动守护进程 | |||
sudo systemctl start docker | |||
</syntaxhighlight> | |||
也可以使用dnf命令安装,dnf为下一代yum命令。 | 也可以使用dnf命令安装,dnf为下一代yum命令。 | ||
<syntaxhighlight lang="bash"> | |||
sudo dnf -y install dnf-plugins-core | |||
sudo dnf install https://download.docker.com/linux/fedora/30/x86_64/stable/Packages/containerd.io-1.2.6-3.3.fc30.x86_64.rpm | |||
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo | |||
sudo dnf install docker-ce | |||
sudo systemctl start docker | |||
</syntaxhighlight> | |||
方法二,下载RPM包,离线安装: | 方法二,下载RPM包,离线安装: | ||
<syntaxhighlight lang="bash"> | |||
#在联网的计算机下载RPM软件包,从官网地址选一个版本下载:https://download.docker.com/linux/fedora/ | |||
#比如:docker-ce-cli-19.03.4-3.fc31.x86_64.rpm | |||
#复制到计算机的某个目录,执行安装 | |||
sudo dnf -y install docker-ce-cli-19.03.4-3.fc31.x86_64.rpm | |||
#启动守护进程 | |||
sudo systemctl start docker | |||
</syntaxhighlight> | |||
方法三,使用脚本安装: | 方法三,使用脚本安装: | ||
Docker提供脚本安装方式,快捷安装。 | Docker提供脚本安装方式,快捷安装。 | ||
<syntaxhighlight lang="bash"> | |||
#下载脚本 | |||
curl -fsSL https://get.docker.com -o get-docker.sh | curl -fsSL https://get.docker.com -o get-docker.sh | ||
#运行脚本安装 | #运行脚本安装 | ||
第61行: | 第69行: | ||
#如果以非root用户使用docker(推荐), 需要添加一个用户到'docker'用户组中 | #如果以非root用户使用docker(推荐), 需要添加一个用户到'docker'用户组中 | ||
#查看是否添加成功,如果添加当前登录的用户,需要重新登录,组权限才会生效。 | |||
sudo usermod -aG docker your-user-name | sudo usermod -aG docker your-user-name | ||
#查看是否安装成功 | #查看是否安装成功 | ||
docker --version</ | docker --version | ||
</syntaxhighlight> | |||
{{了解更多 | {{了解更多 | ||
|[https://docs.docker.com/engine/install/centos/ Docker文档-centos安装Docker引擎] | |[https://docs.docker.com/engine/install/centos/ Docker文档-centos安装Docker引擎] | ||
}} | }} | ||
====Ubuntu==== | ====Ubuntu==== | ||
[[Ubuntu]]安装Docker也有三种方法,与[[CentOS]]安装docker类似。 | [[Ubuntu]]安装Docker也有三种方法,与[[CentOS]]安装docker类似。 | ||
方法一,添加Docker源进行安装: | 方法一,添加Docker源进行安装: | ||
<syntaxhighlight lang="bash"> | |||
#获取apt可用最新列表 | |||
sudo apt-get update | sudo apt-get update | ||
#使用apt安装下列软件包 | #使用apt安装下列软件包 | ||
第101行: | 第113行: | ||
#使用非root用户使用docker,可以将用户添加到docker组: | #使用非root用户使用docker,可以将用户添加到docker组: | ||
sudo gpasswd -a ${USER} docker #将当前用户添加到docker组,重新登录后生效 | sudo gpasswd -a ${USER} docker #将当前用户添加到docker组,重新登录后生效 | ||
sudo usermod -aG docker your-user #将其他用户添加到docker组</ | sudo usermod -aG docker your-user #将其他用户添加到docker组 | ||
</syntaxhighlight> | |||
{{了解更多 | {{了解更多 | ||
第107行: | 第120行: | ||
}} | }} | ||
== | ==快速入门== | ||
== | ==镜像== | ||
镜像(Image)是只读文件,容器是运行在镜像之上,运行容器时会复制镜像然后启动。镜像的一些属性: | |||
*REPOSITORY:表示镜像的仓库源 | *REPOSITORY:表示镜像的仓库源 | ||
*TAG:镜像的标签 | *TAG:镜像的标签 | ||
第121行: | 第131行: | ||
*SIZE:镜像大小 | *SIZE:镜像大小 | ||
当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。 | |||
==== | ===镜像使用=== | ||
可以命令行输入<code>命令 --help</code>查看帮助,如在命令行输入<code>docker search --help</code> | |||
{| class="wikitable" style="width: 100%; | |||
docker pull ubuntu | ! 命令 | ||
! 描述 | |||
docker pull ubuntu:18.04 </ | ! 示例 | ||
|- | |||
| [https://docs.docker.com/engine/reference/commandline/image_ls/ docker image ls] <br /><br />[https://docs.docker.com/engine/reference/commandline/images/ docker images] | |||
| '''查看镜像''' <br />列出本地主机上的镜像 | |||
| <code>docker image ls</code>查看本地镜像 <br /><code>docker images -a </code>列出本地主机上的镜像,包括默认隐藏的中间镜像。 | |||
docker search nginx | |- | ||
| [https://docs.docker.com/engine/reference/commandline/tag/ docker tag] <br />docker image tag | |||
docker search --filter=is-offical=true mysql | | '''创建引用标签''' <br />为镜像创建新标签,方便使用。 | ||
| <code>docker tag 0e1234567893 ubuntu:V20</code>为ID:0e1234567893的镜像加多个标签ubuntu:V20 <br /><code>docker tag ubuntu:18.04 mytest/ubuntu:18</code>为ubuntu:18.04镜像添加标签mytest/ubuntu:18 | |||
docker search --filter=stars=100 mysql</ | |- | ||
| docker image rm <br /> <br />docker rmi | |||
| '''删除镜像''' <br />删除镜像正在使用的镜像会报错 | |||
| <code>docker image rm Ubuntu</code> <br /> <code>docker rmi Ubuntu</code> | |||
|- | |||
| docker image prune | |||
| '''清理镜像''' <br />删除未使用的镜像 | |||
| <code>docker image prune</code>删除未使用的镜像 | |||
|- | |||
| [https://docs.docker.com/engine/reference/commandline/image_pull/ docker pull] | |||
| '''下载镜像''' <br />默认从Docker镜像仓库[https://hub.docker.com/ Docker Hub]上下载。 | |||
| <code>docker pull ubuntu</code>默认下载tag: latest的版本 <br /><code>docker pull ubuntu:18.04</code>指定镜像版本 | |||
|- | |||
| docker search | |||
| '''搜索镜像''' <br />默认从Docker镜像仓库[https://hub.docker.com/ Docker Hub]上搜索。<br />输出结果说明:<br />NAME: 镜像仓库源的名称<br />DESCRIPTION: 镜像的描述<br />OFFICIAL: 是否docker官方发布<br />START: 表示点赞数量<br />AUTOMATED: 自动构建 | |||
| <code>docker search nginx</code>搜索nginx软件的镜像 <br /><code>docker search --filter=is-offical=true mysql</code>搜索mysql软件的镜像 <br /><code>docker search --filter=stars=100 mysql</code>搜索star超过100的mysql镜像 | |||
|- | |||
|docker push | |||
|'''上传镜像''' <br />默认上传到Docker镜像仓库[https://hub.docker.com/ Docker Hub],公共仓库为免费,私有仓库需要付费使用。先注册一个免费Docker 账号,接下来可以在终端操作。 | |||
|<syntaxhighlight lang="bash"> | |||
#登录使用docker login,再输入账号密码 | |||
docker login | docker login | ||
#上传镜像使用docker push,需要登录再使用。username为个人的账户名 | #上传镜像使用docker push,需要登录再使用。username为个人的账户名 | ||
docker push username/ubuntu:18.04 | docker push username/ubuntu:18.04 | ||
#退出使用docker logout | #退出使用docker logout | ||
docker logout</ | docker logout | ||
</syntaxhighlight> | |||
|- | |||
| docker history | |||
| '''镜像历史''' <br />查看制作镜像的命令 <br />格式:<code>docker history [参数] 镜像</code> | |||
|<code>docker history nginx</code>查看nginx镜像制作的历史 | |||
|} | |||
{{了解更多 | |||
|[https://docs.docker.com/engine/reference/commandline/image/ Docker 参考:docker image] | |||
|[https://docs.docker.com/engine/reference/commandline/images/ Docker 参考:docker images] | |||
}} | |||
===常用镜像=== | |||
====操作系统基础镜像==== | |||
{| class="wikitable" | |||
! 镜像名称 | |||
! 大小 | |||
! 描述 | |||
! 网址 | |||
|- | |||
| busybox | |||
| | |||
| | |||
| | |||
|- | |||
| alpine | |||
| 5 MB | |||
| Alpine Linux是一个面向安全的轻型的Linux发行版。Alpine不包含 bash 因此进入某个alpine docker容器,可以使用sh命令,如:<br /><code>docker exec -it container_name sh</code>进入某个容器并运行sh。 <br /><code>docker run -it -v data_volume:/data alpine:3.16.9 sh</code>启动一个容器,挂在data_volume卷到容器的/data目录。 | |||
| 官网:https://www.alpinelinux.org/ <br />镜像:https://hub.docker.com/_/alpine/ | |||
|- | |||
| ubuntu | |||
| 30 MB | |||
| | |||
|官网:http://www.ubuntu.com/ <br />镜像:https://hub.docker.com/_/ubuntu/ | |||
|- | |||
| | |||
| | |||
| | |||
| | |||
|- | |||
| | |||
| | |||
| | |||
| | |||
|- | |||
| | |||
| | |||
| | |||
| | |||
|- | |||
| | |||
| | |||
| | |||
| | |||
|} | |||
====编程语言基础镜像==== | |||
{| class="wikitable" | |||
! 镜像名称 | |||
! 大小 | |||
! 描述 | |||
! 网址 | |||
|- | |||
| python | |||
| 50 MB <br />350 MB <br />2.64G | |||
| | |||
| <br />镜像: https://hub.docker.com/_/python/ | |||
|- | |||
| node | |||
| | |||
| Node.js是一个基于JavaScript的平台,用于服务器端和网络应用程序。 | |||
| <br />镜像:https://hub.docker.com/_/node/ | |||
|- | |||
| | |||
| | |||
| | |||
| | |||
|- | |||
| | |||
| | |||
| | |||
| | |||
|} | |||
第172行: | 第268行: | ||
====容器打包为镜像==== | ====容器打包为镜像==== | ||
修改容器,通过命令 docker commit 将容器打包为新镜像。如: | 修改容器,通过命令 docker commit 将容器打包为新镜像。如: | ||
<syntaxhighlight lang="bash"> | |||
#启动一个名称ubuntu-18为容器,并进入容器终端 | |||
docker run --name ubuntu-18 -it ubuntu:18.04 /bin/bash | docker run --name ubuntu-18 -it ubuntu:18.04 /bin/bash | ||
#在容器内修改,如更新软件, | #在容器内修改,如更新软件, | ||
apt-get update | apt-get update | ||
#退出这个容器 | #退出这个容器 | ||
exit | exit | ||
#提交打包镜像 | #提交打包镜像 | ||
docker commit ubuntu-18 ubuntu-updated </ | docker commit ubuntu-18 ubuntu-updated | ||
</syntaxhighlight> | |||
====Dockerfile创建镜像==== | ====Dockerfile创建镜像==== | ||
第291行: | 第392行: | ||
}} | }} | ||
== 容器 == | |||
容器(Container)是运行在镜像之上,运行容器时会复制镜像然后启动。 | |||
{| class="wikitable" style="width: 100%; | |||
! 命令 | |||
! 描述 | |||
! 示例 | |||
|- | |||
| [https://docs.docker.com/engine/reference/commandline/run/ docker run] | |||
| '''运行容器''' <br />docker run [参数] 镜像 [COMMAND] [ARG...]<br />从镜像启动一个新容器。该命令会检查本地是否有镜像,没有就从docker仓库中下载。 <br \><br \>常用参数:<br \><code>--name</code> 容器命名,如<code>--name test</code> <br \><code>--restart</code> 重启策略,如停止后自动重启:<code>--restart=always</code> <br \><code>-P</code> 绑定端口 <br \><code>-v</code> 挂载 | |||
| <code>docker run -it ubuntu</code>使用 ubuntu 镜像启动一个容器 <br /><code>docker run -it ubuntu /bin/bash</code>启动一个ubuntu容器,并进入终端。要退出容器里的终端输入exit。<code>docker run -itd --name ubuntu-test ubuntu /bin/bash</code>启动一个名称ubuntu-test为容器,并后台运行。参数-d表示后台运行。 | |||
|- | |||
| [https://docs.docker.com/engine/reference/commandline/update/ docker update] | |||
| '''更新容器''' <br />动态更新容器配置。 <br \><br \>常用参数:<br \><code>--memory</code> , <code>-m</code> 内存限制 <br \><code>--restart</code> 重启策略 | |||
| <code>docker update --restart=unless-stopped mynginx</code> 配置mynginx容器重启策略为unless-stopped | |||
|- | |||
| docker start | |||
| '''启动容器''' <br />启动已经停止的容器。 | |||
| <code>docker start dw3342531d3</code> 启动一个容器id为dw3342531d3的容器。 | |||
|- | |||
| docker restart | |||
|'''重启容器''' <br />重启正在运行的容器。 | |||
| <code>docker restart ubuntu-test</code> 重启容器ubuntu-test。 | |||
|- | |||
| [https://docs.docker.com/engine/reference/commandline/ps/ docker ps] | |||
|'''查看本地容器列表''' <br />重启正在运行的容器。<br \><br \>常用参数:<br \><code>--no-trunc</code> 显示完整内容,不截断。 | |||
|<code>docker ps</code>查看正在运行的容器<br /><code>docker ps -a</code>查看所用容器,包括停止的 <br \><code>docker ps --no-trunc</code> | |||
|- | |||
|[https://docs.docker.com/engine/reference/commandline/inspect/ docker inspect] | |||
|'''查看容器信息'''<br />查看容器底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。 <br \><br \>常用参数:<br \><code>-f, --format </code> 使用Go语言template格式化输出。 | |||
|<code>docker inspect ubuntu-test</code> 查看ubuntu-test容器信息 <br \><code><nowiki>docker inspect --format='{{.NetworkSettings.IPAddress}}' test2</nowiki></code> 查看test2容器ip <br \><code><nowiki>docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks }} {{.IPAddress}} {{end}}' $(docker ps -aq)</nowiki></code> 查看所有容器ip地址。 <br \><code><nowiki>docker inspect -f '{{range .NetworkSettings.Networks}}{{.MacAddress}}{{end}}' test2</nowiki></code> 查看test2容器MAC <br \> <code><nowiki>docker inspect --format='{{.LogPath}}' test2</nowiki></code> 查看test2容器的log地址 <br \><code><nowiki>docker inspect -f '{{.Config.Image}}' test2</nowiki></code> 查看test2容器的镜像名称 | |||
|- | |||
|[https://docs.docker.com/engine/reference/commandline/stats/ docker stats] | |||
|'''实时统计容器使用资源''' <br \>统计容器使用主机CUP、内存的百分比,通过网络发送和接收的数据量,从主机上的块设备读取和写入的数据量。 | |||
|<code>docker stats</code> | |||
|- | |||
|[https://docs.docker.com/engine/reference/commandline/logs/ docker logs] | |||
|'''查看容器日志'''<br />查看容器内部的标准输出。 | |||
|<code>docker logs ubuntu-test</code>查看ubuntu-test容器内部的标准输出 <br \><code>docker logs -f ubuntu-test</code>跟踪日志输出 | |||
|- | |||
| docker top | |||
|'''查看容器进程'''<br />查看容器内部运行的进程 | |||
| <code>docker top static_web</code> 查看static_web容器内部运行的进程 | |||
|- | |||
| [https://docs.docker.com/engine/reference/commandline/exec/ docker exec] | |||
|'''运行命令'''<br />在容器中运行命令。该命令退出容器终端,容器不会停止。 | |||
|<code>docker exec ubuntu-test ls</code>在ubuntu-test容器工作目录运行ls命令 <br /><code>docker exec -it ubuntu-test bash</code>进入ubuntu-test容器交互式终端 <br /><code>docker exec -u 0 -it test bash</code>以root用户进入名称为test的容器 | |||
|- | |||
| docker attach | |||
|'''附着终端'''<br />将本地终端标准输入、输出和错误流连接到运行的容器中。该命令退出容器终端,容器会停止,推荐使用<code>docker exec -it</code>。 | |||
|<code>docker attach ubuntu-test</code> | |||
|- | |||
|docker stop | |||
|'''停止容器'''<br />停止运行中的容器 | |||
|<code>docker stop dw3342531d3</code> #停止一个id为dw3342531d3的容器 <br /><code>docker stop $(docker ps -a -q)</code>停止所有运行中的容器 | |||
|- | |||
|docker rm | |||
|'''删除容器'''<br />删除容器,需要容器停止运行。参数-f表示强制删除,可以不用等容器停止后再删除。 | |||
|<code>docker rm ubuntu-test</code>删除ubuntu-test容器<br /><code>docker rm -f ubuntu-test</code>强制删除ubuntu-test容器<br /> <code>docker rm -f $(docker ps -a -q)</code>'''注意,该命令会强制删除所有容器''' | |||
|- | |||
|docker container prune | |||
|'''清理容器'''<br />删除所有停止的容器。 | |||
|<code>docker container prune</code>删除所有停止的容器。 | |||
|- | |||
|docker commit | |||
|'''容器构建镜像'''<br />将容器打包为一个镜像。 | |||
|<code>docker commit ubuntu-test ubuntu-updated</code>#将ubuntu-test容器打包为一个名称为ubuntu-updated镜像。 | |||
|} | |||
== 仓库 == | |||
仓库(Repository)是集中存放镜像的地方。 Docker的官方镜像仓库为[https://hub.docker.com/ Docker Hub],公共仓库为免费,私有仓库需要付费使用。 | |||
===Docker Hub=== | ===Docker Hub=== | ||
大部分需求都可以通过在Docker Hub中直接下载镜像来实现。在[https://hub.docker.com https://hub.docker.com]免费注册一个 Docker 账号。接下来可以在终端操作 | 大部分需求都可以通过在Docker Hub中直接下载镜像来实现。在[https://hub.docker.com https://hub.docker.com]免费注册一个 Docker 账号。接下来可以在终端操作 | ||
<syntaxhighlight lang="bash"> | |||
#登录使用docker login,再输入账号密码 | |||
docker login | docker login | ||
#在Docker Hub仓库中搜索使用docker search,这命令可以不登录。 | #在Docker Hub仓库中搜索使用docker search,这命令可以不登录。 | ||
docker search ubuntu | docker search ubuntu | ||
#下载镜像使用docker pull,这命令可以不登录。 | #下载镜像使用docker pull,这命令可以不登录。 | ||
docker | docker pull ubuntu | ||
#上传镜像使用docker push,需要登录再使用。username为个人的账户名 | #上传镜像使用docker push,需要登录再使用。username为个人的账户名 | ||
docker push username/ubuntu:18.04 | docker push username/ubuntu:18.04 | ||
#退出使用docker logout | #退出使用docker logout | ||
docker logout</ | docker logout | ||
</syntaxhighlight> | |||
可能出现问题: | 可能出现问题: | ||
*登录时出现:Error saving credentials: error storing credentials - err: exit status 1, out: `Cannot autolaunch D-Bus without X11 $DISPLAY` | *登录时出现:Error saving credentials: error storing credentials - err: exit status 1, out: `Cannot autolaunch D-Bus without X11 $DISPLAY` | ||
第389行: | 第491行: | ||
docker push username/ubuntu:18.04 | docker push username/ubuntu:18.04 | ||
=== | ===其他公有镜像仓库=== | ||
==== 常用仓库 ==== | |||
{| class="wikitable" style="width: 100%; | |||
! 提供方 | |||
! 仓库地址 | |||
! 描述 | |||
! 网址 | |||
|- | |||
| 阿里云 | |||
| https://xxxxxxxx.mirror.aliyuncs.com | |||
| 需要注册阿里云,在镜像加速器可以看到仓库地址。 | |||
| [https://cr.console.aliyun.com/ 官网] [https://developer.aliyun.com/article/110806 文档] | |||
|- | |||
| 网易 | |||
| https://hub.c.163.com | |||
| | |||
| [https://sf.163.com/help/documents/56918246390157312 文档] | |||
|- | |||
| 百度云 | |||
| https://mirror.baidubce.com | |||
| | |||
|[https://cloud.baidu.com/doc/CCE/s/Yjxppt74z#如何使用dockerhub镜像加速器 文档] | |||
|- | |||
| Google | |||
| | |||
| | |||
|[https://cloud.google.com/container-registry/docs/pulling-cached-images 文档] | |||
|} | |||
==== 使用方法 ==== | |||
{| class="wikitable" style="width: 100%; | |||
! 方法 | |||
! 描述 | |||
|- | |||
| 拉取时指定仓库 | |||
| 单次有效 <br \>仓库地址不包含协议(如<code>https://</code>),公有镜像仓库一般使用<code>library</code>。<br \>如指定阿里镜像仓库拉取ubuntu: <br \><code>docker pull xxxxxxxx.mirror.aliyuncs.com/library/ubuntu</code> | |||
|- | |||
| 编辑配置文件 | |||
| 永久有效 <br \>步骤:<br \>1.编辑配置文件,<code>sudo vim /etc/docker/daemon.json</code>,输入如下内容<syntaxhighlight lang="json"> | |||
{ | |||
"registry-mirrors": [ | |||
"https://hub-mirror.c.163.com" | |||
] | |||
} | |||
</syntaxhighlight> | |||
2.重启docker服务,<code>sudo service docker restart</code> <br \>3.查看是否成功,<code>docker info</code> 输出含有Registry Mirrors | |||
|- | |||
| | |||
| | |||
|} | |||
===搭建私有镜像仓库=== | ===搭建私有镜像仓库=== | ||
==网络== | ==网络== | ||
===概览=== | |||
Docker的网络是可拔插的子系统,使用驱动程序。docker内置了几个驱动程序,提供了核心网络功能。 | |||
{| class="wikitable" style="width: 100%; | |||
! 网络模式 | |||
! 描述 | |||
! 示例 | |||
|- | |||
| 桥接模式 <br />[https://docs.docker.com/network/bridge/ bridge] | |||
| bridge是默认的桥接网络,当没有指定网络驱动,新启动的容器会连接到这个名称为bridge的bridge网络。也可以自定义一个网桥,只有连接到该网络的容器才能相互通信,从而起到隔离效果。自定义的网桥可以动态的连接或断开。<br /><br />创建自定义网桥:<code>docker network create 网桥名称</code> <br />删除自定义网桥:<code>docker network rm 网桥名称</code> <br />查看网桥详细信息:<code>docker network inspect 网桥名称</code> <br />容器启动时连接到网桥:<code>--network 网桥名称</code> <br />运行中的容器连接到网桥:<code>docker network connect 网桥名称 容器名称</code><br />断开容器与网桥:<code>docker network disconnect 网桥名称 容器名称</code> <br /><br /> 注意:默认网桥bridge的<code>--link</code>命令已不建议使用,后面版本可能会被删除。默认网桥bridge内容器只能通过ip地址通信,需要添加<code>--link</code> 来添加名称,而自定义网桥可以使用容器名称或设置别名来通信。 | |||
| <code>docker network rm my-net</code>创建自定义网桥my-net <br /> | |||
|- | |||
| 主机模式 <br />[https://docs.docker.com/network/host/ host] | |||
| 当使用host网络模式,容器共享主机的网络命名空间,而且容器不会分配自己的 IP 地址。如果容器中某个程序绑定到端口,直接访问主机的该端口即可。该模式端口全部暴露,端口映射不生效,即-p、--publish、-P和--publish-all选项都将被忽略。主机模式网络可用于优化性能,并且在容器需要处理大量端口的情况下,因为它不需要网络地址转换 (NAT),并且没有为每个端口创建“用户空间代理”。 <br /><br />容器启动时设置:<code>--network host</code>或 <code>--net=host</code> | |||
| | |||
|- | |||
| 覆盖模式 <br />[https://docs.docker.com/network/overlay/ overlay] | |||
| 跨主机的分布式网络。该模式允许连接到它的容器(包括群服务容器)通过加密安全地通信。 | |||
| | |||
|- | |||
| [https://docs.docker.com/network/macvlan/ macvlan] | |||
| | |||
| | |||
|- | |||
| [https://docs.docker.com/network/ipvlan/ ipvlan] | |||
| | |||
| | |||
|- | |||
| 禁用网络 <br />[https://docs.docker.com/network/none/ none] | |||
| 禁用容器的网络。 <br /><br />容器启动时设置:<code>--network none</code> | |||
| | |||
|- | |||
| 网络插件 [https://docs.docker.com/engine/extend/plugins_services/#network-plugins Network plugins] | |||
| | |||
| | |||
|} | |||
{{了解更多 | {{了解更多 | ||
|[https://docs.docker.com/network/ Docker 文档:网络概览] | |[https://docs.docker.com/network/ Docker 文档:网络概览] | ||
}} | }} | ||
== | ==数据== | ||
===概览=== | |||
默认情况下,所有文件将会存储在容器里的可写的容器层(container layer)。意味着: | 默认情况下,所有文件将会存储在容器里的可写的容器层(container layer)。意味着: | ||
* 数据与容器为一体。当容器删除时,数据会一起被删除。 | * 数据与容器为一体。当容器删除时,数据会一起被删除。 | ||
第417行: | 第593行: | ||
* 容器的写入层的是通过 存储驱动(storage driver) 管理文件系统。存储驱动会使用Linux内核的 链合文件系统(union filesystem)进行挂载。相比起直接操作于宿主机器文件系统的 数据卷(data volumes),这额外的抽象层将会降低性能。 | * 容器的写入层的是通过 存储驱动(storage driver) 管理文件系统。存储驱动会使用Linux内核的 链合文件系统(union filesystem)进行挂载。相比起直接操作于宿主机器文件系统的 数据卷(data volumes),这额外的抽象层将会降低性能。 | ||
Docker提供两种将数据存储在宿主机的方法:''' | Docker提供两种将数据存储在宿主机的方法:'''数据卷(volumes)'''和 '''绑定挂载(bind mounts)'''。另外,Linux用户还可使用'''tmpfs 挂载''';window用户还可以使用 命名管道(named pipe)。可用参数 <code>-v</code> 或 <code>--mount </code>来使用数据卷或绑定挂载,一般推荐--mount,更明确和详细。 | ||
{{了解更多 | |||
|[https://docs.docker.com/storage/ Docker 文档:Docker上管理数据] | |||
}} | |||
=== 数据存储类型 === | |||
{| class="wikitable" style="width: 100%; | |||
! 类型 | |||
! 描述 | |||
! 示例 | |||
|- | |||
| 数据卷 <br /> [https://docs.docker.com/storage/volumes/ volumes] | |||
| Docker 推荐的容器数据持久化方法,volumes完全由 Docker 管理。分为命名卷和匿名卷, 匿名卷在容器删除时会被 Docker 引擎删除,或者启动容器时加入--rm时,容器退出匿名卷会自动删除。<br /><br />创建数据卷:<code>docker volume create 卷名称</code> <br />列出数据卷: <code>docker volume ls</code> <br />数据卷详细信息:<code>docker volume inspect 卷名称 </code> <br />启动容器时连接卷(不存在卷会自动创建):<code>--mount source=卷名称,target=/容器的/目录</code> 或 <code>-v 卷名称:/容器的/目录 </code> <br />启动容器时连接匿名卷:<code>-v /容器的/目录</code> <br />删除卷:<code>docker volume rm 卷名称</code><br />清理没有使用的卷:<code>docker volume prune</code> | |||
| | |||
|- | |||
| 绑定挂载<br /> [https://docs.docker.com/storage/bind-mounts/ bind mounts] | |||
| 将主机上的文件或目录挂载到容器中。主机的路径可以是相对路径。 <br /><br />启动容器时绑定挂载:<code>--mount type=bind,source=主机/目录,target=/容器/目录</code> 或 <code>-v 主机/目录:/容器/目录</code> <br />只读绑定挂载:<code>--mount type=bind,source=主机/目录,target=/容器/目录,readonly</code> 或 <code>-v 主机/目录:/容器/目录:ro</code> | |||
| | |||
|- | |||
|tmpfs 挂载 <br />[https://docs.docker.com/storage/tmpfs/ tmpfs mounts] | |||
|tmpfs挂载是临时的,仅保留在主机内存中。当容器停止时,tmpfs挂载被移除,写入的文件不会被持久化。这对于临时存储您不想保留在主机或容器可写层中的敏感文件很有用。<br />可用命令 <code>-tmpfs </code> 或 <code>--mount </code> | |||
| | |||
|} | |||
{{了解更多 | {{了解更多 | ||
第423行: | 第622行: | ||
}} | }} | ||
=== | === -v和--mount 参数 === | ||
使用命令 <code>docker inspect 容器名称</code> 可以查看容器详情,其中Mounts部分可以看到容器的挂载详细情况。 | |||
{| class="wikitable" style="width: 100%; | |||
! 参数 | |||
! -v 或 --volume | |||
! --mount | |||
|- | |||
! 特点 | |||
| 简洁,但有时出现混乱。 | |||
| 类型指定明确,推荐写法。 | |||
|- | |||
! 支持类型 | |||
| <code>volumes</code>、<code>bind mounts</code> | |||
| <code>volumes</code>、<code>bind mounts</code>、<code>tmpfs</code> | |||
|- | |||
! volumes | |||
| <code>-v 卷名称:/容器的/目录 </code> | |||
| <code>--mount source=卷名称,target=/容器的/目录</code> | |||
|- | |||
! bind mounts | |||
| <code>-v 主机/目录:/容器/目录</code> | |||
| <code>--mount type=bind,source=主机/目录,target=/容器/目录</code> | |||
|- | |||
! tmpfs mounts | |||
| 不支持 | |||
| <code>--mount type=tmpfs,destination=/app</code> | |||
|} | |||
{{了解更多 | |||
|[https://docs.docker.com/storage/volumes/ Docker 文档:Use volumes] | |||
|[https://docs.docker.com/storage/bind-mounts/ Docker 文档:Use bind mounts] | |||
|[https://docs.docker.com/storage/tmpfs/ Docker 文档:Use tmpfs mounts] | |||
}} | |||
== 命令行 == | |||
{| class="wikitable" | |||
! 名称 | |||
! 描述 | |||
! 示例 | |||
|- | |||
| | |||
| | |||
| | |||
|- | |||
| | |||
| | |||
| | |||
|- | |||
|[https://docs.docker.com/engine/reference/commandline/system/ docker system] | |||
| 管理docker 。 如使用docker system prune能清理docker占用的磁盘空间,包括不使用的空间,构建镜像时的缓存等。 | |||
| docker system prune -a | |||
|} | |||
{{了解更多 | |||
|[https://docs.docker.com/engine/reference/commandline/cli/ Docker 文档:使用 Docker 命令行] | |||
}} | |||
==Compose== | |||
Docker Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用[[YML]]文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从[[YML]]文件配置中创建并启动所有服务。 | |||
=== 安装=== | |||
====版本==== | |||
{| class="wikitable" | |||
! 名称 | |||
! 命令 | |||
! 描述 | |||
|- | |||
| Compose 旧版 | |||
| docker-compose | |||
| Compose 旧版为独立版,下载可执行文件使用。 | |||
|- | |||
| Compose V2 | |||
| docker compose | |||
| Compose V2也叫Compose插件版,作为插件和docker集成,安装升级方便。新版也提供更多的功能。 | |||
|} | |||
{{了解更多 | |||
|[https://docs.docker.com/compose/ Docker Compose 文档] | |||
}} | |||
====Compose V2安装==== | |||
<syntaxhighlight lang="bash" > | |||
# Ubuntu and Debian 安装 | |||
sudo apt-get update | |||
sudo apt-get install docker-compose-plugin | |||
# RPM-based distros 安装 | |||
sudo yum update | |||
sudo yum install docker-compose-plugin | |||
</syntaxhighlight> | |||
{{了解更多 | |||
|[https://docs.docker.com/compose/install/ Docker 文档:安装Docker Compose] | |||
}} | |||
====Compose 旧版安装==== | |||
以Linux系统为例,使用<code>curl</code>命令在终端从GitHub上下载[https://github.com/docker/compose/releases Docker Compose]二进制文件。 | |||
<syntaxhighlight lang="bash" line='line'> | |||
# 查看系统类型 | |||
echo $(uname -s)-$(uname -m) | |||
# GitHub上右键复制系统对应版本,如linux-x86_64。 如下载当前最新版compose 2.2.2 | |||
sudo curl -L "https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-linux-x86_64" -o /usr/local/bin/docker-compose | |||
# 为compose程序文件添加执行权限 | |||
sudo chmod +x /usr/local/bin/docker-compose | |||
# 查看compose版本,验证是否安装成功 | |||
docker-compose --version | |||
</syntaxhighlight> | |||
== | {{了解更多 | ||
=== | |[https://docs.docker.com/compose/install/other/ Docker 文档:安装 Compose 独立版] | ||
Compose | }} | ||
=== 快速入门 === | |||
===Compose 命令=== | |||
进入<code>docker-compose.yml</code>配置文件所在目录,执再行命令。 | |||
常用选项: | |||
* -f, --file 指定其他名称配置文件。 如:<code>docker compose -f docker-compose.prod.yml up</code> | |||
*-p, --project-name 制定项目名称。如:<code>docker compose -p myproject up</code> | |||
Compose 常用命令: | |||
{| class="wikitable" | |||
! 命令 | |||
! 描述 | |||
! 示例 | |||
|- | |||
| [https://docs.docker.com/engine/reference/commandline/compose_up/ up] | |||
| 自动执行一些列操作:构建镜像、创建服务、启动服务和关联服务相关容器。 | |||
| <code>docker compose up</code> <br /><code>docker compose up -d</code> <br /> <code>docker compose -f docker-compose.dev.yml up --build </code> | |||
|- | |||
| stop | |||
| | |||
| | |||
|- | |||
| logs | |||
| | |||
| <code>logs</code>默认以不同颜色显示服务内容器的日志。 | |||
|- | |||
| config | |||
| 显示 Docker Compose 配置,包括环境变量。 | |||
| <code>docker compose config</code> 查看当前目录docker-compose.yml配置 <code>docker-compose -f docker-compose.dev.yml config</code> 查看当前docker-compose.dev.yml配置 | |||
|- | |||
| | |||
| | |||
| | |||
|- | |||
| rm | |||
| | |||
| <code>docker compose rm -f</code> 强制删除服务内容器。 <br /><code>docker rm -f $(docker compose ps -a -q)</code> 删除服务内所有容器。 | |||
|- | |||
| | |||
| | |||
| | |||
|} | |||
{{了解更多 | {{了解更多 | ||
|[https://docs.docker.com/compose/ | |[https://docs.docker.com/compose/reference/ Docker 文档:docker compose CLI ] | ||
}} | }} | ||
==Swarm Mode== | |||
Swarm | Swarm Mode是Docker集群管理工具,从Docker1.2开始Docker Swarm内置到Docker中为Swarm Mode。 | ||
{{了解更多 | {{了解更多 | ||
|[https://docs.docker.com/engine/swarm/ Docker文档-Swarm mode] | |[https://docs.docker.com/engine/swarm/ Docker文档-Swarm mode] | ||
}} | }} | ||
=== | ==安全== | ||
==国内加速== | |||
=== Docker CE镜像 === | |||
用于安装docker社区版软件。 | |||
{| class="wikitable" | |||
! 名称 | |||
! 描述 | |||
|- | |||
| 中国科学技术大学 USTC | |||
| 手动安装时把 download.docker.com 地址换成 mirrors.ustc.edu.cn/docker-ce 即可 。<br /> 地址:https://mirrors.ustc.edu.cn/docker-ce/ <br />文档:https://mirrors.ustc.edu.cn/help/docker-ce.html | |||
|- | |||
| | |||
| | |||
|- | |||
| | |||
| | |||
|} | |||
=== Docker Hub镜像 === | |||
=== 周边加速 === | |||
{| class="wikitable" | |||
! 名称 | |||
! 描述 | |||
|- | |||
| Dockerfile中apt更换软件源 | |||
| Debian换阿里源: <code>RUN sed -i s@/deb.debian.org/@/mirrors.aliyun.com/@g /etc/apt/sources.list</code> | |||
|- | |||
| Github镜像网站 | |||
| kgithub.com : 将Dockerfile中的github.com换成kgithub.com | |||
|- | |||
| 设置DNS | |||
| echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf > /dev/null | |||
|} | |||
==实例== | |||
====Docker安装Nginx==== | ====Docker安装Nginx==== | ||
====Docker安装Flask==== | ====Docker安装Flask==== | ||
[[Flask]]是一个使用[[Python]]编写的轻量级Web应用框架。下面使用Dockerfile生成一个简单flask镜像,并启动。 | [[Flask]]是一个使用[[Python]]编写的轻量级Web应用框架。下面使用Dockerfile生成一个简单flask镜像,并启动。 | ||
<syntaxhighlight lang="bash"> | |||
#创建一个文件夹来保存项目 | |||
mkdir hello_flask | mkdir hello_flask | ||
#利用 cd 命令切换到这个目录 | #利用 cd 命令切换到这个目录 | ||
cd hello_flask </ | cd hello_flask | ||
接下来使用vim app.py命令创建一个app.py文件,内容如下: | </syntaxhighlight>接下来使用vim app.py命令创建一个app.py文件,内容如下: | ||
<syntaxhighlight lang="python"> | |||
from flask import Flask | |||
app = Flask(__name__) | app = Flask(__name__) | ||
第464行: | 第841行: | ||
if __name__=='__main__': | if __name__=='__main__': | ||
app.run(debug=True, host='0.0.0.0') </ | app.run(debug=True, host='0.0.0.0') | ||
然后使用vim Dockerfile命令创建一个Dockerfile文件,内容如下: | </syntaxhighlight>然后使用vim Dockerfile命令创建一个Dockerfile文件,内容如下: | ||
<syntaxhighlight lang="bash"> | |||
app = Flask(__name__) | |||
FROM python:alpine | FROM python:alpine | ||
第476行: | 第854行: | ||
ENTRYPOINT ["python"] | ENTRYPOINT ["python"] | ||
CMD ["app.py"]</ | CMD ["app.py"] | ||
现在hello_flask文件夹下有两个文件app.py和Dockerfile, | </syntaxhighlight>现在hello_flask文件夹下有两个文件app.py和Dockerfile, | ||
<syntaxhighlight lang="bash"> | |||
#在hello_flask文件夹下使用docker build命令生成镜像 | |||
docker build -t flask:1.1.1-min . | docker build -t flask:1.1.1-min . | ||
#使用 docker run 命令运行刚刚创建的镜像: | #使用 docker run 命令运行刚刚创建的镜像: | ||
docker run --name flask -d -p 8080:5000 flask:1.1.1-min</ | docker run --name flask -d -p 8080:5000 flask:1.1.1-min | ||
</syntaxhighlight> | |||
现在在浏览器打开ip;10000,可以看到Hello, World! | 现在在浏览器打开ip;10000,可以看到Hello, World! | ||
第494行: | 第874行: | ||
方法一:利用Docker Hub上现成镜像 | 方法一:利用Docker Hub上现成镜像 | ||
<syntaxhighlight lang="bash"> | |||
#运行mediawiki镜像,没有就从docker hub下载mediawiki再运行 | |||
docker run --name some-mediawiki -p 8080:80 -d mediawiki | docker run --name some-mediawiki -p 8080:80 -d mediawiki | ||
</syntaxhighlight>{{了解更多 | |||
|[https://hub.docker.com/_/mediawiki Docker Hub:Mediawiki ] | |||
}} | |||
==资源== | ==资源== | ||
===官网=== | ===官网=== | ||
* | *Docker 官网:https://www.docker.com | ||
* | *Docker Hub:https://hub.docker.com/ | ||
*Docker 文档:https://docs.docker.com | |||
* | *Docker 文档 > 参考:https://docs.docker.com/reference | ||
* | *Docker 文档 > 示例:https://docs.docker.com/samples | ||
*Docker CE 的 Github:https://github.com/docker/docker-ce | |||
== | ===相关网页=== | ||
*[https://zh.wikipedia.org/wiki/Docker 维基百科:Docker] | *[https://zh.wikipedia.org/wiki/Docker 维基百科:Docker] | ||
*[https://zh.wikipedia.org/wiki/操作系统层虚拟化 维基百科:操作系统层虚拟化] | *[https://zh.wikipedia.org/wiki/操作系统层虚拟化 维基百科:操作系统层虚拟化] | ||
[[分类:编程工具]] |
2024年5月13日 (一) 08:15的最新版本
Docker 是一个开源软件的容器引擎软件。
简介
时间轴
- 2013年3月13日,发布初始版本。
虚拟机与容器
虚拟机可以在一种操作系统里面运行另一种操作系统,但虚拟机,资源占用多,启动慢。
容器是操作系统层虚拟化,容器化的优势在于占用服务器空间少,通常几秒内即可引导。
Docker 是一种容器的管理方式。下文的容器主要指Docker的容器。
安装
CentOS
官网建议安装在CentOS 7及以上的系统。如果之前有安装docker,先卸载之前版本。三种安装方法:
- 添加Docker源进行安装,安装和升级方便,这是推荐的方法。
- 下载RPM软件包,手动安装。
- 官方一键安装脚本,一些测试和开发用户会选择这种方法。
方法一,添加Docker源进行安装:
#安装所需的软件包
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
#安装containerd.io软件包,不然会报错requires containerd.io >= 1.2.2-3
sudo yum install https://download.docker.com/linux/fedora/30/x86_64/stable/Packages/containerd.io-1.2.6-3.3.fc30.x86_64.rpm
#设置官网的稳定版仓库源
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#可选,体验版和测试版默认是关闭的,可以通过命令打开,详细见文档。
#安装最新版本的docker CE
sudo yum install docker-ce
#启动守护进程
sudo systemctl start docker
也可以使用dnf命令安装,dnf为下一代yum命令。
sudo dnf -y install dnf-plugins-core
sudo dnf install https://download.docker.com/linux/fedora/30/x86_64/stable/Packages/containerd.io-1.2.6-3.3.fc30.x86_64.rpm
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf install docker-ce
sudo systemctl start docker
方法二,下载RPM包,离线安装:
#在联网的计算机下载RPM软件包,从官网地址选一个版本下载:https://download.docker.com/linux/fedora/
#比如:docker-ce-cli-19.03.4-3.fc31.x86_64.rpm
#复制到计算机的某个目录,执行安装
sudo dnf -y install docker-ce-cli-19.03.4-3.fc31.x86_64.rpm
#启动守护进程
sudo systemctl start docker
方法三,使用脚本安装: Docker提供脚本安装方式,快捷安装。
#下载脚本
curl -fsSL https://get.docker.com -o get-docker.sh
#运行脚本安装
sudo sh get-docker.sh
#如果以非root用户使用docker(推荐), 需要添加一个用户到'docker'用户组中
#查看是否添加成功,如果添加当前登录的用户,需要重新登录,组权限才会生效。
sudo usermod -aG docker your-user-name
#查看是否安装成功
docker --version
了解更多 >> Docker文档-centos安装Docker引擎
Ubuntu
Ubuntu安装Docker也有三种方法,与CentOS安装docker类似。
方法一,添加Docker源进行安装:
#获取apt可用最新列表
sudo apt-get update
#使用apt安装下列软件包
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
#添加docker官方GPG密钥,验证密钥指纹9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
#添加docker的稳定源
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
#获取apt可用最新列表
sudo apt-get update
#安装最新版的Docker CE
sudo apt-get install docker-ce docker-ce-cli containerd.io
#检验是否安装成功
sudo docker run hello-world
#使用非root用户使用docker,可以将用户添加到docker组:
sudo gpasswd -a ${USER} docker #将当前用户添加到docker组,重新登录后生效
sudo usermod -aG docker your-user #将其他用户添加到docker组
了解更多 >> Docker文档-Ubuntu安装Docker CE
快速入门
镜像
镜像(Image)是只读文件,容器是运行在镜像之上,运行容器时会复制镜像然后启动。镜像的一些属性:
- REPOSITORY:表示镜像的仓库源
- TAG:镜像的标签
- IMAGE ID:镜像ID
- CREATED:镜像创建时间
- SIZE:镜像大小
当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。
镜像使用
可以命令行输入命令 --help
查看帮助,如在命令行输入docker search --help
命令 | 描述 | 示例 |
---|---|---|
docker image ls docker images |
查看镜像 列出本地主机上的镜像 |
docker image ls 查看本地镜像 docker images -a 列出本地主机上的镜像,包括默认隐藏的中间镜像。
|
docker tag docker image tag |
创建引用标签 为镜像创建新标签,方便使用。 |
docker tag 0e1234567893 ubuntu:V20 为ID:0e1234567893的镜像加多个标签ubuntu:V20 docker tag ubuntu:18.04 mytest/ubuntu:18 为ubuntu:18.04镜像添加标签mytest/ubuntu:18
|
docker image rm docker rmi |
删除镜像 删除镜像正在使用的镜像会报错 |
docker image rm Ubuntu docker rmi Ubuntu
|
docker image prune | 清理镜像 删除未使用的镜像 |
docker image prune 删除未使用的镜像
|
docker pull | 下载镜像 默认从Docker镜像仓库Docker Hub上下载。 |
docker pull ubuntu 默认下载tag: latest的版本 docker pull ubuntu:18.04 指定镜像版本
|
docker search | 搜索镜像 默认从Docker镜像仓库Docker Hub上搜索。 输出结果说明: NAME: 镜像仓库源的名称 DESCRIPTION: 镜像的描述 OFFICIAL: 是否docker官方发布 START: 表示点赞数量 AUTOMATED: 自动构建 |
docker search nginx 搜索nginx软件的镜像 docker search --filter=is-offical=true mysql 搜索mysql软件的镜像 docker search --filter=stars=100 mysql 搜索star超过100的mysql镜像
|
docker push | 上传镜像 默认上传到Docker镜像仓库Docker Hub,公共仓库为免费,私有仓库需要付费使用。先注册一个免费Docker 账号,接下来可以在终端操作。 |
#登录使用docker login,再输入账号密码
docker login
#上传镜像使用docker push,需要登录再使用。username为个人的账户名
docker push username/ubuntu:18.04
#退出使用docker logout
docker logout
|
docker history | 镜像历史 查看制作镜像的命令 格式: docker history [参数] 镜像
|
docker history nginx 查看nginx镜像制作的历史
|
常用镜像
操作系统基础镜像
镜像名称 | 大小 | 描述 | 网址 |
---|---|---|---|
busybox | |||
alpine | 5 MB | Alpine Linux是一个面向安全的轻型的Linux发行版。Alpine不包含 bash 因此进入某个alpine docker容器,可以使用sh命令,如:docker exec -it container_name sh 进入某个容器并运行sh。 docker run -it -v data_volume:/data alpine:3.16.9 sh 启动一个容器,挂在data_volume卷到容器的/data目录。
|
官网:https://www.alpinelinux.org/ 镜像:https://hub.docker.com/_/alpine/ |
ubuntu | 30 MB | 官网:http://www.ubuntu.com/ 镜像:https://hub.docker.com/_/ubuntu/ | |
编程语言基础镜像
镜像名称 | 大小 | 描述 | 网址 |
---|---|---|---|
python | 50 MB 350 MB 2.64G |
镜像: https://hub.docker.com/_/python/ | |
node | Node.js是一个基于JavaScript的平台,用于服务器端和网络应用程序。 | 镜像:https://hub.docker.com/_/node/ | |
制作镜像
当docker镜像仓库没有想要的镜像,可以通过以下两种方式制作镜像。
- 在已有容器中修改,再提交保存为新镜像。
- 使用Dockerfile文件,从头创建一个新的镜像。
容器打包为镜像
修改容器,通过命令 docker commit 将容器打包为新镜像。如:
#启动一个名称ubuntu-18为容器,并进入容器终端
docker run --name ubuntu-18 -it ubuntu:18.04 /bin/bash
#在容器内修改,如更新软件,
apt-get update
#退出这个容器
exit
#提交打包镜像
docker commit ubuntu-18 ubuntu-updated
Dockerfile创建镜像
Docker可以自动读取Dockerfile文件里的指令生成一个镜像。Dockerfile是一个文本文件,都是一些关于组装镜像的指令。通过docker build命令来生成一个镜像。
Dockerfile语法
Dockerfile文件格式如下:
# Comment 注释 INSTRUCTION arguments
注释使用#号,指令不区分大小写,但一般指令使用大写,这样容易和后面参数区分开来。
Dockerfile指令
指令 | 格式 | 描述 | 示例 |
---|---|---|---|
FROM | FROM [--platform=<platform>] <image>[:<tag>] [AS <name>] | 初始化,设置基准镜像。这个指令必须放开头。 | FROM debian:buster-slim |
RUN | RUN <command> 或 RUN ["executable", "param1", "param2"] | 执行命令 | RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME' |
CMD | CMD ["param1","param2"] CMD command param1 param2 CMD ["executable","param1","param2"] |
容器启动时执行的命令。该指令只能有一个,当有多个RUN指令只会执行最后一个 | |
LABEL | LABEL <key>=<value> <key>=<value> <key>=<value> ... | 给镜像添加元数据。如添加一些作者信息,版本信息等。可以使用docker image inspect命令查看镜像所有信息,包括标签。 | LABEL maintainer="yourname@domain.com" version="1.0" |
EXPOSE | EXPOSE <port> [<port>/<protocol>...] | 开放容器某个端口,默认协议为TCP。运行主机可以通过docker run命令增加-p参数来对接这个端口。 | EXPOSE 80/udp |
ENV | ENV <key> <value> ENV <key>=<value> ... |
设置环境变量 | ENV myName John Doe |
ADD | ADD [--chown=<user>:<group>] <src>... <dest> ADD [--chown=<user>:<group>] ["<src>",... "<dest>"] |
复制文件、目录或URLs到镜像中。src的路径支持Go语言的filepath.Match规则。 | ADD test.txt /etc/test/ 拷贝主机的test.txt文件到镜像/etc/test/目录中 |
COPY | COPY [--chown=<user>:<group>] <src>... <dest> COPY [--chown=<user>:<group>] ["<src>",... "<dest>"] |
复制文件或目录到镜像中。src的路径支持Go语言的filepath.Match规则。 | COPY test.txt /etc/test/ 拷贝主机的test.txt文件到镜像/etc/test/目录中 |
ENTRYPOINT | ENTRYPOINT ["executable", "param1", "param2"] ENTRYPOINT command param1 param2 |
容器启动时执行的命令。 | ENTRYPOINT ["top", "-b"] |
VOLUME | VOLUME ["/data"] | 创建挂载点 | VOLUME /myvol |
USER | USER <user>[:<group>] USER <UID>[:<GID>] |
设置启动容器的用户,可以是用户名或UID。 | USER username |
WORKDIR | WORKDIR /path/to/workdir | 设置工作目录,对RUN, CMD, ENTRYPOINT, COPY 和 ADD指令有效。 | WORKDIR /home/foo/work |
ARG | ARG <name>[=<default value>] | 设置构建镜像时变量,构建docker build时使用--build-arg <varname>=<value>传递变量值。 | ARG user1=someuser |
ONBUILD | ONBUILD <INSTRUCTION> | 设置触发指令,当该镜像作为基准镜像,构建时执行。 | |
STOPSIGNAL | STOPSIGNAL signal | ||
HEALTHCHECK | HEALTHCHECK [OPTIONS] CMD command HEALTHCHECK NONE |
告诉dockers该镜像的容器正常工作状况 | HEALTHCHECK --interval=5m --timeout=3s CMD curl -f http://localhost/ || exit 1 |
SHELL |
docker build构建镜像
了解更多 >> Docker参考:Dockerfile
容器
容器(Container)是运行在镜像之上,运行容器时会复制镜像然后启动。
命令 | 描述 | 示例 |
---|---|---|
docker run | 运行容器 docker run [参数] 镜像 [COMMAND] [ARG...] 从镜像启动一个新容器。该命令会检查本地是否有镜像,没有就从docker仓库中下载。 常用参数: --name 容器命名,如--name test --restart 重启策略,如停止后自动重启:--restart=always -P 绑定端口 -v 挂载
|
docker run -it ubuntu 使用 ubuntu 镜像启动一个容器 docker run -it ubuntu /bin/bash 启动一个ubuntu容器,并进入终端。要退出容器里的终端输入exit。docker run -itd --name ubuntu-test ubuntu /bin/bash 启动一个名称ubuntu-test为容器,并后台运行。参数-d表示后台运行。
|
docker update | 更新容器 动态更新容器配置。 常用参数: --memory , -m 内存限制 --restart 重启策略
|
docker update --restart=unless-stopped mynginx 配置mynginx容器重启策略为unless-stopped
|
docker start | 启动容器 启动已经停止的容器。 |
docker start dw3342531d3 启动一个容器id为dw3342531d3的容器。
|
docker restart | 重启容器 重启正在运行的容器。 |
docker restart ubuntu-test 重启容器ubuntu-test。
|
docker ps | 查看本地容器列表 重启正在运行的容器。 常用参数: --no-trunc 显示完整内容,不截断。
|
docker ps 查看正在运行的容器docker ps -a 查看所用容器,包括停止的 docker ps --no-trunc
|
docker inspect | 查看容器信息 查看容器底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。 常用参数: -f, --format 使用Go语言template格式化输出。
|
docker inspect ubuntu-test 查看ubuntu-test容器信息 docker inspect --format='{{.NetworkSettings.IPAddress}}' test2 查看test2容器ip docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks }} {{.IPAddress}} {{end}}' $(docker ps -aq) 查看所有容器ip地址。 docker inspect -f '{{range .NetworkSettings.Networks}}{{.MacAddress}}{{end}}' test2 查看test2容器MAC docker inspect --format='{{.LogPath}}' test2 查看test2容器的log地址 docker inspect -f '{{.Config.Image}}' test2 查看test2容器的镜像名称
|
docker stats | 实时统计容器使用资源 统计容器使用主机CUP、内存的百分比,通过网络发送和接收的数据量,从主机上的块设备读取和写入的数据量。 |
docker stats
|
docker logs | 查看容器日志 查看容器内部的标准输出。 |
docker logs ubuntu-test 查看ubuntu-test容器内部的标准输出 docker logs -f ubuntu-test 跟踪日志输出
|
docker top | 查看容器进程 查看容器内部运行的进程 |
docker top static_web 查看static_web容器内部运行的进程
|
docker exec | 运行命令 在容器中运行命令。该命令退出容器终端,容器不会停止。 |
docker exec ubuntu-test ls 在ubuntu-test容器工作目录运行ls命令 docker exec -it ubuntu-test bash 进入ubuntu-test容器交互式终端 docker exec -u 0 -it test bash 以root用户进入名称为test的容器
|
docker attach | 附着终端 将本地终端标准输入、输出和错误流连接到运行的容器中。该命令退出容器终端,容器会停止,推荐使用 docker exec -it 。
|
docker attach ubuntu-test
|
docker stop | 停止容器 停止运行中的容器 |
docker stop dw3342531d3 #停止一个id为dw3342531d3的容器 docker stop $(docker ps -a -q) 停止所有运行中的容器
|
docker rm | 删除容器 删除容器,需要容器停止运行。参数-f表示强制删除,可以不用等容器停止后再删除。 |
docker rm ubuntu-test 删除ubuntu-test容器docker rm -f ubuntu-test 强制删除ubuntu-test容器docker rm -f $(docker ps -a -q) 注意,该命令会强制删除所有容器
|
docker container prune | 清理容器 删除所有停止的容器。 |
docker container prune 删除所有停止的容器。
|
docker commit | 容器构建镜像 将容器打包为一个镜像。 |
docker commit ubuntu-test ubuntu-updated #将ubuntu-test容器打包为一个名称为ubuntu-updated镜像。
|
仓库
仓库(Repository)是集中存放镜像的地方。 Docker的官方镜像仓库为Docker Hub,公共仓库为免费,私有仓库需要付费使用。
Docker Hub
大部分需求都可以通过在Docker Hub中直接下载镜像来实现。在https://hub.docker.com免费注册一个 Docker 账号。接下来可以在终端操作
#登录使用docker login,再输入账号密码
docker login
#在Docker Hub仓库中搜索使用docker search,这命令可以不登录。
docker search ubuntu
#下载镜像使用docker pull,这命令可以不登录。
docker pull ubuntu
#上传镜像使用docker push,需要登录再使用。username为个人的账户名
docker push username/ubuntu:18.04
#退出使用docker logout
docker logout
可能出现问题:
- 登录时出现:Error saving credentials: error storing credentials - err: exit status 1, out: `Cannot autolaunch D-Bus without X11 $DISPLAY`
执行下面命令即可:sudo apt install gnupg2 pass
- docker push报错:denied: requested access to the resource is denied
镜像名和用户名不匹配,使用tag将镜像名改为username/镜像名,username为个人的用户名,然后再推送,如:
docker tag ubuntu:18.04 username/ubuntu:18.04 docker push username/ubuntu:18.04
其他公有镜像仓库
常用仓库
提供方 | 仓库地址 | 描述 | 网址 |
---|---|---|---|
阿里云 | https://xxxxxxxx.mirror.aliyuncs.com | 需要注册阿里云,在镜像加速器可以看到仓库地址。 | 官网 文档 |
网易 | https://hub.c.163.com | 文档 | |
百度云 | https://mirror.baidubce.com | 文档 | |
文档 |
使用方法
方法 | 描述 |
---|---|
拉取时指定仓库 | 单次有效 仓库地址不包含协议(如 https:// ),公有镜像仓库一般使用library 。如指定阿里镜像仓库拉取ubuntu: docker pull xxxxxxxx.mirror.aliyuncs.com/library/ubuntu
|
编辑配置文件 | 永久有效 步骤: 1.编辑配置文件, sudo vim /etc/docker/daemon.json ,输入如下内容{
"registry-mirrors": [
"https://hub-mirror.c.163.com"
]
}
2.重启docker服务, |
搭建私有镜像仓库
网络
概览
Docker的网络是可拔插的子系统,使用驱动程序。docker内置了几个驱动程序,提供了核心网络功能。
网络模式 | 描述 | 示例 |
---|---|---|
桥接模式 bridge |
bridge是默认的桥接网络,当没有指定网络驱动,新启动的容器会连接到这个名称为bridge的bridge网络。也可以自定义一个网桥,只有连接到该网络的容器才能相互通信,从而起到隔离效果。自定义的网桥可以动态的连接或断开。 创建自定义网桥: docker network create 网桥名称 删除自定义网桥: docker network rm 网桥名称 查看网桥详细信息: docker network inspect 网桥名称 容器启动时连接到网桥: --network 网桥名称 运行中的容器连接到网桥: docker network connect 网桥名称 容器名称 断开容器与网桥: docker network disconnect 网桥名称 容器名称 注意:默认网桥bridge的 --link 命令已不建议使用,后面版本可能会被删除。默认网桥bridge内容器只能通过ip地址通信,需要添加--link 来添加名称,而自定义网桥可以使用容器名称或设置别名来通信。
|
docker network rm my-net 创建自定义网桥my-net |
主机模式 host |
当使用host网络模式,容器共享主机的网络命名空间,而且容器不会分配自己的 IP 地址。如果容器中某个程序绑定到端口,直接访问主机的该端口即可。该模式端口全部暴露,端口映射不生效,即-p、--publish、-P和--publish-all选项都将被忽略。主机模式网络可用于优化性能,并且在容器需要处理大量端口的情况下,因为它不需要网络地址转换 (NAT),并且没有为每个端口创建“用户空间代理”。 容器启动时设置: --network host 或 --net=host
|
|
覆盖模式 overlay |
跨主机的分布式网络。该模式允许连接到它的容器(包括群服务容器)通过加密安全地通信。 | |
macvlan | ||
ipvlan | ||
禁用网络 none |
禁用容器的网络。 容器启动时设置: --network none
|
|
网络插件 Network plugins |
了解更多 >> Docker 文档:网络概览
数据
概览
默认情况下,所有文件将会存储在容器里的可写的容器层(container layer)。意味着:
- 数据与容器为一体。当容器删除时,数据会一起被删除。
- 该容器与其他程序(容器)数据交换难。
- 由于容器的写入层是与宿主机器紧紧耦合,所以难以移动数据到其他机器。
- 容器的写入层的是通过 存储驱动(storage driver) 管理文件系统。存储驱动会使用Linux内核的 链合文件系统(union filesystem)进行挂载。相比起直接操作于宿主机器文件系统的 数据卷(data volumes),这额外的抽象层将会降低性能。
Docker提供两种将数据存储在宿主机的方法:数据卷(volumes)和 绑定挂载(bind mounts)。另外,Linux用户还可使用tmpfs 挂载;window用户还可以使用 命名管道(named pipe)。可用参数 -v
或 --mount
来使用数据卷或绑定挂载,一般推荐--mount,更明确和详细。
了解更多 >> Docker 文档:Docker上管理数据
数据存储类型
类型 | 描述 | 示例 |
---|---|---|
数据卷 volumes |
Docker 推荐的容器数据持久化方法,volumes完全由 Docker 管理。分为命名卷和匿名卷, 匿名卷在容器删除时会被 Docker 引擎删除,或者启动容器时加入--rm时,容器退出匿名卷会自动删除。 创建数据卷: docker volume create 卷名称 列出数据卷: docker volume ls 数据卷详细信息: docker volume inspect 卷名称 启动容器时连接卷(不存在卷会自动创建): --mount source=卷名称,target=/容器的/目录 或 -v 卷名称:/容器的/目录 启动容器时连接匿名卷: -v /容器的/目录 删除卷: docker volume rm 卷名称 清理没有使用的卷: docker volume prune
|
|
绑定挂载 bind mounts |
将主机上的文件或目录挂载到容器中。主机的路径可以是相对路径。 启动容器时绑定挂载: --mount type=bind,source=主机/目录,target=/容器/目录 或 -v 主机/目录:/容器/目录 只读绑定挂载: --mount type=bind,source=主机/目录,target=/容器/目录,readonly 或 -v 主机/目录:/容器/目录:ro
|
|
tmpfs 挂载 tmpfs mounts |
tmpfs挂载是临时的,仅保留在主机内存中。当容器停止时,tmpfs挂载被移除,写入的文件不会被持久化。这对于临时存储您不想保留在主机或容器可写层中的敏感文件很有用。 可用命令 -tmpfs 或 --mount
|
了解更多 >> Docker 文档:Docker上管理数据
-v和--mount 参数
使用命令 docker inspect 容器名称
可以查看容器详情,其中Mounts部分可以看到容器的挂载详细情况。
参数 | -v 或 --volume | --mount |
---|---|---|
特点 | 简洁,但有时出现混乱。 | 类型指定明确,推荐写法。 |
支持类型 | volumes 、bind mounts
|
volumes 、bind mounts 、tmpfs
|
volumes | -v 卷名称:/容器的/目录
|
--mount source=卷名称,target=/容器的/目录
|
bind mounts | -v 主机/目录:/容器/目录
|
--mount type=bind,source=主机/目录,target=/容器/目录
|
tmpfs mounts | 不支持 | --mount type=tmpfs,destination=/app
|
命令行
名称 | 描述 | 示例 |
---|---|---|
docker system | 管理docker 。 如使用docker system prune能清理docker占用的磁盘空间,包括不使用的空间,构建镜像时的缓存等。 | docker system prune -a |
了解更多 >> Docker 文档:使用 Docker 命令行
Compose
Docker Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用YML文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从YML文件配置中创建并启动所有服务。
安装
版本
名称 | 命令 | 描述 |
---|---|---|
Compose 旧版 | docker-compose | Compose 旧版为独立版,下载可执行文件使用。 |
Compose V2 | docker compose | Compose V2也叫Compose插件版,作为插件和docker集成,安装升级方便。新版也提供更多的功能。 |
了解更多 >> Docker Compose 文档
Compose V2安装
# Ubuntu and Debian 安装
sudo apt-get update
sudo apt-get install docker-compose-plugin
# RPM-based distros 安装
sudo yum update
sudo yum install docker-compose-plugin
了解更多 >> Docker 文档:安装Docker Compose
Compose 旧版安装
以Linux系统为例,使用curl
命令在终端从GitHub上下载Docker Compose二进制文件。
# 查看系统类型
echo $(uname -s)-$(uname -m)
# GitHub上右键复制系统对应版本,如linux-x86_64。 如下载当前最新版compose 2.2.2
sudo curl -L "https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-linux-x86_64" -o /usr/local/bin/docker-compose
# 为compose程序文件添加执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 查看compose版本,验证是否安装成功
docker-compose --version
了解更多 >> Docker 文档:安装 Compose 独立版
快速入门
Compose 命令
进入docker-compose.yml
配置文件所在目录,执再行命令。
常用选项:
- -f, --file 指定其他名称配置文件。 如:
docker compose -f docker-compose.prod.yml up
- -p, --project-name 制定项目名称。如:
docker compose -p myproject up
Compose 常用命令:
命令 | 描述 | 示例 |
---|---|---|
up | 自动执行一些列操作:构建镜像、创建服务、启动服务和关联服务相关容器。 | docker compose up docker compose up -d docker compose -f docker-compose.dev.yml up --build
|
stop | ||
logs | logs 默认以不同颜色显示服务内容器的日志。
| |
config | 显示 Docker Compose 配置,包括环境变量。 | docker compose config 查看当前目录docker-compose.yml配置 docker-compose -f docker-compose.dev.yml config 查看当前docker-compose.dev.yml配置
|
rm | docker compose rm -f 强制删除服务内容器。 docker rm -f $(docker compose ps -a -q) 删除服务内所有容器。
| |
了解更多 >> Docker 文档:docker compose CLI
Swarm Mode
Swarm Mode是Docker集群管理工具,从Docker1.2开始Docker Swarm内置到Docker中为Swarm Mode。
了解更多 >> Docker文档-Swarm mode
安全
国内加速
Docker CE镜像
用于安装docker社区版软件。
名称 | 描述 |
---|---|
中国科学技术大学 USTC | 手动安装时把 download.docker.com 地址换成 mirrors.ustc.edu.cn/docker-ce 即可 。 地址:https://mirrors.ustc.edu.cn/docker-ce/ 文档:https://mirrors.ustc.edu.cn/help/docker-ce.html |
Docker Hub镜像
周边加速
名称 | 描述 |
---|---|
Dockerfile中apt更换软件源 | Debian换阿里源: RUN sed -i s@/deb.debian.org/@/mirrors.aliyun.com/@g /etc/apt/sources.list
|
Github镜像网站 | kgithub.com : 将Dockerfile中的github.com换成kgithub.com |
设置DNS | sudo tee /etc/resolv.conf > /dev/null |
实例
Docker安装Nginx
Docker安装Flask
Flask是一个使用Python编写的轻量级Web应用框架。下面使用Dockerfile生成一个简单flask镜像,并启动。
#创建一个文件夹来保存项目
mkdir hello_flask
#利用 cd 命令切换到这个目录
cd hello_flask
接下来使用vim app.py命令创建一个app.py文件,内容如下:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__=='__main__':
app.run(debug=True, host='0.0.0.0')
然后使用vim Dockerfile命令创建一个Dockerfile文件,内容如下:
app = Flask(__name__)
FROM python:alpine
COPY . /app
WORKDIR /app
RUN pip install Flask
ENTRYPOINT ["python"]
CMD ["app.py"]
现在hello_flask文件夹下有两个文件app.py和Dockerfile,
#在hello_flask文件夹下使用docker build命令生成镜像
docker build -t flask:1.1.1-min .
#使用 docker run 命令运行刚刚创建的镜像:
docker run --name flask -d -p 8080:5000 flask:1.1.1-min
现在在浏览器打开ip;10000,可以看到Hello, World!
可以使用-v命令,把当前路径挂载到容器的/app目录,$PWD表示当前目录,比如现在的hello_flask。
docker run --name flask2 -d -p 8080:5000 -v $PWD:/app flask:1.1.1-min
在浏览器打开ip:8080可以看到“Hello, World!”,挂载后在主机中的hello_flask修改app.py,刷新网页就会看到更新的内容。修改文件时候要使用root权限不然会报错,sudo vim app.py
Docker安装Mediawiki
Mediawiki全球最著名的开源wiki程序,维基百科也使用该软件。
方法一:利用Docker Hub上现成镜像
#运行mediawiki镜像,没有就从docker hub下载mediawiki再运行
docker run --name some-mediawiki -p 8080:80 -d mediawiki
了解更多 >> Docker Hub:Mediawiki
资源
官网
- Docker 官网:https://www.docker.com
- Docker Hub:https://hub.docker.com/
- Docker 文档:https://docs.docker.com
- Docker 文档 > 参考:https://docs.docker.com/reference
- Docker 文档 > 示例:https://docs.docker.com/samples
- Docker CE 的 Github:https://github.com/docker/docker-ce