知行迭代
导航
首页
最近更改
随机页面
常用
分类目录
Linux命令
Mediawiki常用
电脑技巧
工具
链入页面
相关更改
特殊页面
页面信息
登录
查看“Docker”的源代码
←
Docker
页面
讨论
阅读
查看源代码
查看历史
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:[
[1]
]
您可以查看和复制此页面的源代码。
Docker 是一个容器引擎的开源软件, ==简介== ===时间轴=== ===虚拟机与容器=== [[虚拟机]]可以在一种操作系统里面运行另一种操作系统,但虚拟机,资源占用多,启动慢。 容器是操作系统层虚拟化,容器化的优势在于占用服务器空间少,通常几秒内即可引导。 Docker 是一种容器的管理方式。下文的容器主要指Docker的容器。 ===安装=== ====CentOS==== 官网建议安装在[[CentOS]] 7及以上的系统。如果之前有安装docker,先卸载之前版本。三种安装方法: *添加Docker源进行安装,安装和升级方便,这是推荐的方法。 *下载RPM软件包,手动安装。 *官方一键安装脚本,一些测试和开发用户会选择这种方法。 方法一,添加Docker源进行安装: <nowiki>$ #安装所需的软件包 $ 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</nowiki> 也可以使用dnf命令安装,dnf为下一代yum命令。 <nowiki>$ 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</nowiki> 方法二,下载RPM包,离线安装: <nowiki>$ #在联网的计算机下载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</nowiki> 方法三,使用脚本安装: Docker提供脚本安装方式,快捷安装。 <nowiki>#下载脚本 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</nowiki> {{了解更多 |[https://docs.docker.com/engine/install/centos/ Docker文档-centos安装Docker引擎] }} ====Ubuntu==== [[Ubuntu]]安装Docker也有三种方法,与[[CentOS]]安装docker类似。 方法一,添加Docker源进行安装: <nowiki>#获取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组</nowiki> {{了解更多 |[https://docs.docker.com/install/linux/docker-ce/ubuntu/ Docker文档-Ubuntu安装Docker CE] }} ==镜像(Image)== 当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。 ===镜像使用=== ====管理本地镜像==== 可以使用 docker images 来列出本地主机上的镜像。 docker images docker image ls 输出结果说明: *REPOSITORY:表示镜像的仓库源 *TAG:镜像的标签 *IMAGE ID:镜像ID *CREATED:镜像创建时间 *SIZE:镜像大小 删除image文件使用docker image rm命令或docker rmi,如 docker image rm Ubuntu docker rmi Ubuntu ====下载镜像==== 下载镜像,使用docker pull命令,默认从Docker镜像仓库[https://hub.docker.com/ Docker Hub]上下载。 <nowiki>#默认下载tag: latest的版本, docker pull ubuntu #指定镜像版本 docker pull ubuntu:18.04 </nowiki> ====仓库搜索镜像==== 使用 docker search 命令来搜索镜像,默认从Docker镜像仓库[https://hub.docker.com/ Docker Hub]上搜索。 <nowiki>#搜索nginx软件的镜像 docker search nginx #搜索mysql软件的镜像 docker search --filter=is-offical=true mysql #搜索star超过100的mysql镜像 docker search --filter=stars=100 mysql</nowiki> 输出结果说明: *NAME: 镜像仓库源的名称 *DESCRIPTION: 镜像的描述 *OFFICIAL: 是否docker官方发布 *START: 表示点赞数量 *AUTOMATED: 自动构建 在命令行输入 docker search --help,可以查看docker search的帮助 ====上传镜像==== Docker的官方镜像仓库为[https://hub.docker.com/ Docker Hub],公共仓库为免费,私有仓库需要付费使用。在[https://hub.docker.com/ Docker Hub]上免费注册一个 Docker 账号。接下来可以在终端操作。 <nowiki>#登录使用docker login,再输入账号密码 docker login #在Docker Hub仓库中搜索使用docker search,这命令可以不登录。 docker search ubuntu #下载镜像使用docker pull,这命令可以不登录。 docker search ubuntu #上传镜像使用docker push,需要登录再使用。username为个人的账户名 docker push username/ubuntu:18.04 #退出使用docker logout docker logout</nowiki> ===制作镜像=== 当docker镜像仓库没有想要的镜像,可以通过以下两种方式制作镜像。 *在已有容器中修改,再提交保存为新镜像。 *使用Dockerfile文件,从头创建一个新的镜像。 ====容器打包为镜像==== 修改容器,通过命令 docker commit 将容器打包为新镜像。如: <nowiki>#启动一个名称ubuntu-18为容器,并进入容器终端 docker run --name ubuntu-18 -it ubuntu:18.04 /bin/bash #在容器内修改,如更新软件, apt-get update #退出这个容器 exit #提交打包镜像 docker commit ubuntu-18 ubuntu-updated </nowiki> ====Dockerfile创建镜像==== Docker可以自动读取Dockerfile文件里的指令生成一个镜像。Dockerfile是一个文本文件,都是一些关于组装镜像的指令。通过docker build命令来生成一个镜像。 ====Dockerfile语法==== Dockerfile文件格式如下: # Comment 注释 INSTRUCTION arguments 注释使用#号,指令不区分大小写,但一般指令使用大写,这样容易和后面参数区分开来。 ====Dockerfile指令==== {| class="wikitable" style="width: 100%; !指令!!格式!!描述!!示例 |- |[https://docs.docker.com/engine/reference/builder/#from FROM] |FROM [--platform=<platform>] <image>[:<tag>] [AS <name>] |初始化,设置基准镜像。这个指令必须放开头。 |FROM debian:buster-slim |- |[https://docs.docker.com/engine/reference/builder/#run RUN] |RUN <command> 或 RUN ["executable", "param1", "param2"] |执行命令 |RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME' |- |[https://docs.docker.com/engine/reference/builder/#cmd CMD] |CMD ["param1","param2"]<br \> CMD command param1 param2 <br \> CMD ["executable","param1","param2"] |容器启动时执行的命令。该指令只能有一个,当有多个RUN指令只会执行最后一个 | |- |[https://docs.docker.com/engine/reference/builder/#label LABEL] |LABEL <key>=<value> <key>=<value> <key>=<value> ... |给镜像添加元数据。如添加一些作者信息,版本信息等。可以使用docker image inspect命令查看镜像所有信息,包括标签。 |LABEL maintainer="yourname@domain.com" version="1.0" |- |[https://docs.docker.com/engine/reference/builder/#expose EXPOSE] |EXPOSE <port> [<port>/<protocol>...] |开放容器某个端口,默认协议为TCP。运行主机可以通过docker run命令增加-p参数来对接这个端口。 |EXPOSE 80/udp |- |[https://docs.docker.com/engine/reference/builder/#env ENV] |ENV <key> <value> <br \>ENV <key>=<value> ... |设置环境变量 |ENV myName John Doe |- |[https://docs.docker.com/engine/reference/builder/#add ADD] |ADD [--chown=<user>:<group>] <src>... <dest> <br \>ADD [--chown=<user>:<group>] ["<src>",... "<dest>"] |复制文件、目录或URLs到镜像中。src的路径支持Go语言的filepath.Match规则。 |ADD test.txt /etc/test/ <br \>拷贝主机的test.txt文件到镜像/etc/test/目录中 |- |[https://docs.docker.com/engine/reference/builder/#copy COPY] |COPY [--chown=<user>:<group>] <src>... <dest> <br \>COPY [--chown=<user>:<group>] ["<src>",... "<dest>"] |复制文件或目录到镜像中。src的路径支持Go语言的filepath.Match规则。 |COPY test.txt /etc/test/ <br \>拷贝主机的test.txt文件到镜像/etc/test/目录中 |- |[https://docs.docker.com/engine/reference/builder/#entrypoint ENTRYPOINT] |ENTRYPOINT ["executable", "param1", "param2"] <br \>ENTRYPOINT command param1 param2 |容器启动时执行的命令。 |ENTRYPOINT ["top", "-b"] |- |[https://docs.docker.com/engine/reference/builder/#volume VOLUME] |VOLUME ["/data"] |创建挂载点 |VOLUME /myvol |- |[https://docs.docker.com/engine/reference/builder/#user USER] |USER <user>[:<group>] <br \>USER <UID>[:<GID>] |设置启动容器的用户,可以是用户名或UID。 |USER username |- |[https://docs.docker.com/engine/reference/builder/#workdir WORKDIR] |WORKDIR /path/to/workdir |设置工作目录,对RUN, CMD, ENTRYPOINT, COPY 和 ADD指令有效。 |WORKDIR /home/foo/work |- |[https://docs.docker.com/engine/reference/builder/#arg ARG] |ARG <name>[=<default value>] |设置构建镜像时变量,构建docker build时使用--build-arg <varname>=<value>传递变量值。 |ARG user1=someuser |- |[https://docs.docker.com/engine/reference/builder/#onbuild ONBUILD] |ONBUILD <INSTRUCTION> |设置触发指令,当该镜像作为基准镜像,构建时执行。 | |- |[https://docs.docker.com/engine/reference/builder/#stopsignal STOPSIGNAL] |STOPSIGNAL signal | | |- |[https://docs.docker.com/engine/reference/builder/#healthcheck HEALTHCHECK] |HEALTHCHECK [OPTIONS] CMD command <br \>HEALTHCHECK NONE |告诉dockers该镜像的容器正常工作状况 |<nowiki>HEALTHCHECK --interval=5m --timeout=3s CMD curl -f http://localhost/ || exit 1 </nowiki> |- |[https://docs.docker.com/engine/reference/builder/#shell SHELL] | | | |- |} ====docker build构建镜像==== {{了解更多 | [https://docs.docker.com/engine/reference/builder/ Docker参考:Dockerfile] }} ===基础镜像=== Alpine Linux是一个面向安全的轻型的Linux发行版。使用Docker创建容器时,基础镜像通常选择Ubuntu或Centos,不管哪个镜像的大小都在100MB以上。而Alpine仅仅只有5MB。 Alpine不包含 bash 因此进入某个alpine docker容器,可以使用sh命令,如: docker exec -it container_name sh {{了解更多 |[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中直接下载镜像来实现。在[https://hub.docker.com https://hub.docker.com]免费注册一个 Docker 账号。接下来可以在终端操作 <nowiki>#登录使用docker login,再输入账号密码 docker login #在Docker Hub仓库中搜索使用docker search,这命令可以不登录。 docker search ubuntu #下载镜像使用docker pull,这命令可以不登录。 docker search ubuntu #上传镜像使用docker push,需要登录再使用。username为个人的账户名 docker push username/ubuntu:18.04 #退出使用docker logout docker logout</nowiki> 可能出现问题: *登录时出现: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://docs.docker.com/network/ Docker 文档:网络概览] }} ===网络类型=== Docker的网络是可拔插的子系统,使用驱动程序。docker内置了几个驱动程序,提供了核心网络功能。 ====bridge==== bridge是默认的网络驱动,当没有指定网络驱动,会默认使用这种网络类型。 [https://docs.docker.com/network/bridge/ Docker 文档:网络-bridge] ====host==== ====overlay==== ====macvlan==== ====none==== ====网络插件==== ==数据管理== 默认情况下,所有文件将会存储在容器里的可写的容器层(container layer)。意味着: * 数据与容器为一体。当容器删除时,数据会一起被删除。 * 该容器与其他程序(容器)数据交换难。 * 由于容器的写入层是与宿主机器紧紧耦合,所以难以移动数据到其他机器。 * 容器的写入层的是通过 存储驱动(storage driver) 管理文件系统。存储驱动会使用Linux内核的 链合文件系统(union filesystem)进行挂载。相比起直接操作于宿主机器文件系统的 数据卷(data volumes),这额外的抽象层将会降低性能。 Docker提供两种将数据存储在宿主机的方法:'''卷(volumes)'''和 '''绑定挂载(bind mounts)'''。另外,Linux用户还可使用 tmpfs 进行挂载;window用户还可以使用 命名管道(named pipe)。 {{了解更多 |[https://docs.docker.com/storage/ Docker 文档:Docker上管理数据] }} ===卷(volumes)=== ===绑定挂载(bind mounts)=== ==进阶教程== ===Docker Compose=== Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用[[YML]]文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从[[YML]]文件配置中创建并启动所有服务。 {{了解更多 |[https://docs.docker.com/compose/ Docker文档-Compose] }} ===Swarm mode=== Swarm mode是Docker集群管理工具,从Docker1.2开始Docker Swarm内置到Docker中为Swarm mode。 {{了解更多 |[https://docs.docker.com/engine/swarm/ Docker文档-Swarm mode] }} ===安全=== ===实例=== ====Docker安装Nginx==== ====Docker安装Flask==== [[Flask]]是一个使用[[Python]]编写的轻量级Web应用框架。下面使用Dockerfile生成一个简单flask镜像,并启动。 <nowiki>#创建一个文件夹来保存项目 mkdir hello_flask #利用 cd 命令切换到这个目录 cd hello_flask </nowiki> 接下来使用vim app.py命令创建一个app.py文件,内容如下: <nowiki>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') </nowiki> 然后使用vim Dockerfile命令创建一个Dockerfile文件,内容如下: <nowiki>app = Flask(__name__) FROM python:alpine COPY . /app WORKDIR /app RUN pip install Flask ENTRYPOINT ["python"] CMD ["app.py"]</nowiki> 现在hello_flask文件夹下有两个文件app.py和Dockerfile, <nowiki>#在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</nowiki> 现在在浏览器打开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上现成镜像 <nowiki>#运行mediawiki镜像,没有就从docker hub下载mediawiki再运行 docker run --name some-mediawiki -p 8080:80 -d mediawiki </nowiki> 参考:[https://hub.docker.com/_/mediawiki Docker Hub:Mediawiki ] ==资源== ===官网=== *[https://www.docker.com/ Docker 官网] *[https://docs.docker.com/ Docker 文档] *[https://docs.docker.com/reference/ Docker 文档:参考] 关于docker的APIs, 命令行指令,和文件信息。 *[https://docs.docker.com/samples/ Docker 文档:示例] 提供了很多示例教程。 *[https://github.com/docker/docker-ce Docker CE的Github] ==参考== *[https://zh.wikipedia.org/wiki/Docker 维基百科:Docker] *[https://www.docker.com/resources/what-container Docker官网:什么是Docker] *[https://zh.wikipedia.org/wiki/操作系统层虚拟化 维基百科:操作系统层虚拟化] [[分类:编程工具]]
本页使用的模板:
模板:了解更多
(
查看源代码
)
返回至“
Docker
”。