Docker:修订间差异

无编辑摘要
 
(未显示同一用户的33个中间版本)
第1行: 第1行:
Docker 是一个容器引擎的开源软件,
Docker 是一个开源软件的容器引擎软件。


==简介==
==简介==
===时间轴===
===时间轴===
* 2013年3月13日,发布初始版本。


===虚拟机与容器===
===虚拟机与容器===
第19行: 第20行:


方法一,添加Docker源进行安装:
方法一,添加Docker源进行安装:
<nowiki>$ #安装所需的软件包
<syntaxhighlight lang="bash">
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
#安装所需的软件包
sudo yum install -y yum-utils device-mapper-persistent-data lvm2


$ #安装containerd.io软件包,不然会报错requires containerd.io >= 1.2.2-3
#安装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 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
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo


$ #可选,体验版和测试版默认是关闭的,可以通过命令打开,详细见文档。
#可选,体验版和测试版默认是关闭的,可以通过命令打开,详细见文档。


$ #安装最新版本的docker CE
#安装最新版本的docker CE
$ sudo yum install docker-ce
sudo yum install docker-ce


$ #启动守护进程
#启动守护进程
$ sudo systemctl start docker</nowiki>
sudo systemctl start docker
</syntaxhighlight>


也可以使用dnf命令安装,dnf为下一代yum命令。
也可以使用dnf命令安装,dnf为下一代yum命令。
<nowiki>$ sudo dnf -y install dnf-plugins-core
<syntaxhighlight lang="bash">
$ 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 -y install dnf-plugins-core
$ sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
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 install docker-ce
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
$ sudo systemctl start docker</nowiki>
sudo dnf install docker-ce
sudo systemctl start docker
</syntaxhighlight>


方法二,下载RPM包,离线安装:
方法二,下载RPM包,离线安装:
<nowiki>$ #在联网的计算机下载RPM软件包,从官网地址选一个版本下载:https://download.docker.com/linux/fedora/
<syntaxhighlight lang="bash">
$ #比如:docker-ce-cli-19.03.4-3.fc31.x86_64.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 dnf -y install docker-ce-cli-19.03.4-3.fc31.x86_64.rpm


$ #启动守护进程
#启动守护进程
$ sudo systemctl start docker</nowiki>
sudo systemctl start docker
</syntaxhighlight>


方法三,使用脚本安装:
方法三,使用脚本安装:
Docker提供脚本安装方式,快捷安装。
Docker提供脚本安装方式,快捷安装。
<nowiki>#下载脚本
<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</nowiki>
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源进行安装:
<nowiki>#获取apt可用最新列表
<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组</nowiki>
sudo usermod -aG docker your-user  #将其他用户添加到docker组
</syntaxhighlight>


{{了解更多
{{了解更多
第107行: 第120行:
}}
}}


==镜像(Image)==
==快速入门==
当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。
 
===镜像使用===
 
====管理本地镜像====
==镜像==
可以使用 docker images 来列出本地主机上的镜像。
镜像(Image)是只读文件,容器是运行在镜像之上,运行容器时会复制镜像然后启动。镜像的一些属性:
docker images
docker image ls
输出结果说明:
*REPOSITORY:表示镜像的仓库源
*REPOSITORY:表示镜像的仓库源
*TAG:镜像的标签
*TAG:镜像的标签
第121行: 第131行:
*SIZE:镜像大小
*SIZE:镜像大小


删除image文件使用docker image rm命令或docker rmi,如
当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。
docker image rm Ubuntu
docker rmi Ubuntu


====下载镜像====
===镜像使用===
下载镜像,使用docker pull命令,默认从Docker镜像仓库[https://hub.docker.com/ Docker Hub]上下载。
可以命令行输入<code>命令 --help</code>查看帮助,如在命令行输入<code>docker search --help</code>
<nowiki>#默认下载tag: latest的版本,
{| class="wikitable"  style="width: 100%;
docker pull ubuntu
! 命令
#指定镜像版本
! 描述
docker pull ubuntu:18.04 </nowiki>
! 示例
 
|-
====仓库搜索镜像====
| [https://docs.docker.com/engine/reference/commandline/image_ls/ docker image ls] <br /><br />[https://docs.docker.com/engine/reference/commandline/images/ docker images]
使用 docker search 命令来搜索镜像,默认从Docker镜像仓库[https://hub.docker.com/ Docker Hub]上搜索。
| '''查看镜像''' <br />列出本地主机上的镜像
<nowiki>#搜索nginx软件的镜像
| <code>docker image ls</code>查看本地镜像 <br /><code>docker images -a </code>列出本地主机上的镜像,包括默认隐藏的中间镜像。
docker search nginx
|-
#搜索mysql软件的镜像
| [https://docs.docker.com/engine/reference/commandline/tag/ docker tag] <br />docker image tag
docker search --filter=is-offical=true mysql
| '''创建引用标签''' <br />为镜像创建新标签,方便使用。
#搜索star超过100的mysql镜像
| <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</nowiki>
|-
输出结果说明:
| docker image rm <br /> <br />docker rmi
*NAME: 镜像仓库源的名称
| '''删除镜像''' <br />删除镜像正在使用的镜像会报错
*DESCRIPTION: 镜像的描述
| <code>docker image rm Ubuntu</code> <br /> <code>docker rmi Ubuntu</code>
*OFFICIAL: 是否docker官方发布
|-
*START: 表示点赞数量
| docker image prune
*AUTOMATED: 自动构建
| '''清理镜像''' <br />删除未使用的镜像
 
| <code>docker image prune</code>删除未使用的镜像
在命令行输入 docker search --help,可以查看docker search的帮助
|-
 
| [https://docs.docker.com/engine/reference/commandline/image_pull/ docker pull]
====上传镜像====
| '''下载镜像''' <br />默认从Docker镜像仓库[https://hub.docker.com/ Docker Hub]上下载。
Docker的官方镜像仓库为[https://hub.docker.com/ Docker Hub],公共仓库为免费,私有仓库需要付费使用。在[https://hub.docker.com/ Docker Hub]上免费注册一个 Docker 账号。接下来可以在终端操作。
| <code>docker pull ubuntu</code>默认下载tag: latest的版本 <br /><code>docker pull ubuntu:18.04</code>指定镜像版本
<nowiki>#登录使用docker login,再输入账号密码
|-
| 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 Hub仓库中搜索使用docker search,这命令可以不登录。
docker search ubuntu
#下载镜像使用docker pull,这命令可以不登录。
docker search 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</nowiki>
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 将容器打包为新镜像。如:
<nowiki>#启动一个名称ubuntu-18为容器,并进入容器终端
<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 </nowiki>
docker commit ubuntu-18 ubuntu-updated  
</syntaxhighlight>


====Dockerfile创建镜像====
====Dockerfile创建镜像====
第291行: 第392行:
}}
}}


===基础镜像===


Alpine Linux是一个面向安全的轻型的Linux发行版。使用Docker创建容器时,基础镜像通常选择Ubuntu或Centos,不管哪个镜像的大小都在100MB以上。而Alpine仅仅只有5MB。
== 容器 ==
容器(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镜像。
|}


Alpine不包含 bash 因此进入某个alpine docker容器,可以使用sh命令,如:
== 仓库 ==
docker exec -it container_name sh
仓库(Repository)是集中存放镜像的地方。 Docker的官方镜像仓库为[https://hub.docker.com/ Docker Hub],公共仓库为免费,私有仓库需要付费使用。
 
{{了解更多
|[https://hub.docker.com/_/alpine Docker Hub:Alpine]
|[https://alpinelinux.org/ Alpine官网]
}}
 
==容器(Container)==
===启动容器===
启动容器使用docker run,该命令会检查本地是否有镜像,没有就从docker仓库中下载。启动已经停止的容器使用docker start,重启容器为docker restart,如:
<nowiki>#使用 ubuntu 镜像启动一个容器
docker run -it ubuntu
#使用 ubuntu 镜像启动一个容器,并进入终端。要退出容器里的终端输入exit。
docker run -it ubuntu /bin/bash
#使用ubuntu镜像启动一个名称ubuntu-test为容器,并后台运行。参数-d表示后台运行。
docker run -itd --name ubuntu-test ubuntu /bin/bash
 
#启动一个容器id为dw3342531d3的容器
docker start dw3342531d3
 
#重启一个容器id为dw3342531d3的容器
docker restart dw3342531d3</nowiki>
 
===查看容器===
查看本地容器列表使用docker ps命令
<nowiki>#来查看正在运行的容器
docker ps
#查看所用容器,保存停止的
docker ps -a</nowiki>
 
使用 docker inspect 命令查看容器底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。
#查看某个容器配置状态等信息
docker inspect dw3342531d3


查看容器日志,使用docker logs命令。可以查看容器内部的标准输出。
#查看某个容器内部的标准输出
docker logs dw3342531d3
使用 docker top 来查看容器内部运行的进程
#查看某个容器内部的标准输出
docker top dw3342531d3
docker top static_web
===进入容器===
进入容器可以使用下面两个命令:
*docker attach命令,退出容器终端,容器会停止。
*docker exec命令,退出容器终端,容器不会停止。
<nowiki>#进入一个容器id为dw3342531d3的容器
docker attach dw3342531d3
#进入一个容器id为dw3342531d3的容器
docker exec -it dw3342531d3 /bin/bash</nowiki>
===停止容器===
停止容器使用docker stop,如:
<nowiki>#停止一个容器id为dw3342531d3的容器
docker stop dw3342531d3</nowiki>
===删除容器===
删除容器使用 docker rm 命令。参数-f表示强制删除,可以不用等容器停止后再删除。
<nowiki>#删除某个容器
docker rm dw3342531d3
#强制删除某个容器
docker rm -f dw3342531d3</nowiki>
===导出和导入容器===
==仓库(Repository)==
仓库(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 账号。接下来可以在终端操作
<nowiki>#登录使用docker login,再输入账号密码
<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 search ubuntu
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</nowiki>
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 文档:网络概览]
}}
}}
===网络类型===
Docker的网络是可拔插的子系统,使用驱动程序。docker内置了几个驱动程序,提供了核心网络功能。
====bridge====
bridge是默认的网络驱动,当没有指定网络驱动,会默认使用这种网络类型。
[https://docs.docker.com/network/bridge/ Docker 文档:网络-bridge]
====host====
====overlay====
====macvlan====
====none====
====网络插件====


==数据管理==
==数据==
===概览===
默认情况下,所有文件将会存储在容器里的可写的容器层(container layer)。意味着:
默认情况下,所有文件将会存储在容器里的可写的容器层(container layer)。意味着:
* 数据与容器为一体。当容器删除时,数据会一起被删除。
* 数据与容器为一体。当容器删除时,数据会一起被删除。
第417行: 第593行:
* 容器的写入层的是通过 存储驱动(storage driver) 管理文件系统。存储驱动会使用Linux内核的 链合文件系统(union filesystem)进行挂载。相比起直接操作于宿主机器文件系统的 数据卷(data volumes),这额外的抽象层将会降低性能。
* 容器的写入层的是通过 存储驱动(storage driver) 管理文件系统。存储驱动会使用Linux内核的 链合文件系统(union filesystem)进行挂载。相比起直接操作于宿主机器文件系统的 数据卷(data volumes),这额外的抽象层将会降低性能。


Docker提供两种将数据存储在宿主机的方法:'''卷(volumes)'''和 '''绑定挂载(bind mounts)'''。另外,Linux用户还可使用 tmpfs 进行挂载;window用户还可以使用 命名管道(named pipe)。
Docker提供两种将数据存储在宿主机的方法:'''数据卷(volumes)'''和 '''绑定挂载(bind mounts)'''。另外,Linux用户还可使用'''tmpfs 挂载''';window用户还可以使用 命名管道(named pipe)。可用参数 <code>-v</code> 或 <code>--mount </code>来使用数据卷或绑定挂载,一般推荐--mount,更明确和详细。


{{了解更多
{{了解更多
第423行: 第599行:
}}
}}


===卷(volumes)===
=== 数据存储类型 ===
{| 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>
|
|}


{{了解更多
|[https://docs.docker.com/storage/ Docker 文档:Docker上管理数据]
}}


===绑定挂载(bind mounts)===
=== -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集成,安装升级方便。新版也提供更多的功能。
|}


==进阶教程==
{{了解更多
===Docker Compose===
|[https://docs.docker.com/compose/ Docker Compose 文档]
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用[[YML]]文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从[[YML]]文件配置中创建并启动所有服务。
}}


====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/ Docker文档-Compose]
|[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


===Swarm mode===
# 查看compose版本,验证是否安装成功
Swarm mode是Docker集群管理工具,从Docker1.2开始Docker Swarm内置到Docker中为Swarm mode。
docker-compose --version
</syntaxhighlight>
 
{{了解更多
|[https://docs.docker.com/compose/install/other/ Docker 文档:安装 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/reference/ Docker 文档:docker compose CLI ]
}}
 
==Swarm Mode==
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镜像,并启动。  
<nowiki>#创建一个文件夹来保存项目
<syntaxhighlight lang="bash">
#创建一个文件夹来保存项目
mkdir hello_flask
mkdir hello_flask
#利用 cd 命令切换到这个目录
#利用 cd 命令切换到这个目录
cd hello_flask </nowiki>
cd hello_flask  
接下来使用vim app.py命令创建一个app.py文件,内容如下:
</syntaxhighlight>接下来使用vim app.py命令创建一个app.py文件,内容如下:
<nowiki>from flask import Flask
<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') </nowiki>
     app.run(debug=True, host='0.0.0.0')  
然后使用vim Dockerfile命令创建一个Dockerfile文件,内容如下:
</syntaxhighlight>然后使用vim Dockerfile命令创建一个Dockerfile文件,内容如下:
<nowiki>app = Flask(__name__)
<syntaxhighlight lang="bash">
app = Flask(__name__)


FROM python:alpine
FROM python:alpine
第476行: 第854行:


ENTRYPOINT ["python"]
ENTRYPOINT ["python"]
CMD ["app.py"]</nowiki>
CMD ["app.py"]
现在hello_flask文件夹下有两个文件app.py和Dockerfile,
</syntaxhighlight>现在hello_flask文件夹下有两个文件app.py和Dockerfile,
<nowiki>#在hello_flask文件夹下使用docker build命令生成镜像
<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</nowiki>
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上现成镜像
<nowiki>#运行mediawiki镜像,没有就从docker hub下载mediawiki再运行
<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


</nowiki>
参考:[https://hub.docker.com/_/mediawiki Docker Hub:Mediawiki ]


</syntaxhighlight>{{了解更多
|[https://hub.docker.com/_/mediawiki Docker Hub:Mediawiki ]
}}


==资源==
==资源==
===官网===
===官网===
*[https://www.docker.com/ Docker 官网]
*Docker 官网:https://www.docker.com
*[https://docs.docker.com/ Docker 文档]
*Docker Hub:https://hub.docker.com/
*[https://docs.docker.com/reference/ Docker 文档:参考]  关于docker的APIs, 命令行指令,和文件信息。
*Docker 文档:https://docs.docker.com
*[https://docs.docker.com/samples/ Docker 文档:示例]  提供了很多示例教程。
*Docker 文档 > 参考:https://docs.docker.com/reference  
*[https://github.com/docker/docker-ce Docker CE的Github]
*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://www.docker.com/resources/what-container 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镜像制作的历史

了解更多 >> Docker 参考:docker image Docker 参考:docker images


常用镜像

操作系统基础镜像

镜像名称 大小 描述 网址
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 文档
Google 文档

使用方法

方法 描述
拉取时指定仓库 单次有效
仓库地址不包含协议(如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服务,sudo service docker restart
3.查看是否成功,docker info 输出含有Registry Mirrors

搭建私有镜像仓库

网络

概览

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
特点 简洁,但有时出现混乱。 类型指定明确,推荐写法。
支持类型 volumesbind mounts volumesbind mountstmpfs
volumes -v 卷名称:/容器的/目录 --mount source=卷名称,target=/容器的/目录
bind mounts -v 主机/目录:/容器/目录 --mount type=bind,source=主机/目录,target=/容器/目录
tmpfs mounts 不支持 --mount type=tmpfs,destination=/app

了解更多 >> Docker 文档:Use volumes Docker 文档:Use bind mounts Docker 文档:Use tmpfs mounts


命令行

名称 描述 示例
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


资源

官网

相关网页