Docker:修订间差异

无编辑摘要
无编辑摘要
第426行: 第426行:


==网络==
==网络==
===概览===
Docker的网络是可拔插的子系统,使用驱动程序。docker内置了几个驱动程序,提供了核心网络功能。
{| class="wikitable"  style="width: 100%;
! 网络类型
! 描述
! 示例
|-
| 桥接网路 <br />[https://docs.docker.com/network/bridge/ bridge networks]
| 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 /> 
|-
|
|
|
|}


{{了解更多
{{了解更多
|[https://docs.docker.com/network/ Docker 文档:网络概览]
|[https://docs.docker.com/network/ Docker 文档:网络概览]
}}
}}
===网络类型===
 
Docker的网络是可拔插的子系统,使用驱动程序。docker内置了几个驱动程序,提供了核心网络功能。
====bridge====
====bridge====
bridge是默认的网络驱动,当没有指定网络驱动,会默认使用这种网络类型。
bridge是默认的网络驱动,当没有指定网络驱动,会默认使用这种网络类型。



2021年9月23日 (四) 01:30的版本

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


制作镜像

当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


基础镜像

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

Alpine不包含 bash 因此进入某个alpine docker容器,可以使用sh命令,如:

docker exec -it container_name sh

了解更多 >> Docker Hub:Alpine Alpine官网


容器

容器(Container)是运行在镜像之上,运行容器时会复制镜像然后启动。

命令 描述 示例
docker run 运行容器
docker run [参数] 镜像 [COMMAND] [ARG...]
从镜像启动一个新容器。该命令会检查本地是否有镜像,没有就从docker仓库中下载。
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 start 启动容器
启动已经停止的容器。
docker start dw3342531d3 启动一个容器id为dw3342531d3的容器。
docker restart 重启容器
重启正在运行的容器。
docker restart ubuntu-test 重启容器ubuntu-test。
docker ps 查看本地容器列表
重启正在运行的容器。
docker ps查看正在运行的容器
docker ps -a查看所用容器,包括停止的
docker inspect 查看容器信息
查看容器底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。
docker inspect ubuntu-test 查看ubuntu-test容器信息
docker logs 查看容器日志
查看容器内部的标准输出。
docker logs ubuntu-test查看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

国内的镜像仓库

搭建私有镜像仓库

网络

概览

Docker的网络是可拔插的子系统,使用驱动程序。docker内置了几个驱动程序,提供了核心网络功能。

网络类型 描述 示例
桥接网路
bridge networks
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

了解更多 >> Docker 文档:网络概览


bridge

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)。

方法 描述 示例
数据卷
volumes
Docker 推荐的容器数据持久化方法,volumes完全由 Docker 管理。需要先使用docker volume create 名称命令创建一个数据卷再使用。
可用命令 -v--mount
绑定挂载
bind mounts
将主机上的文件或目录挂载到容器中。
可用命令 -v--mount
tmpfs 挂载
tmpfs mounts
tmpfs挂载是临时的,仅保留在主机内存中。当容器停止时,tmpfs挂载被移除,写入的文件不会被持久化。这对于临时存储您不想保留在主机或容器可写层中的敏感文件很有用。
可用命令 -tmpfs --mount


了解更多 >> Docker 文档:Docker上管理数据


volumes

bind mounts

tmpfs mounts

Compose

Docker Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用YML文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从YML文件配置中创建并启动所有服务。

了解更多 >> Docker Compose 文档


安装

以Linux系统为例,使用curl命令在终端从GitHub上下载Docker Compose二进制文件。

# 下载当前最新版compose 1.29.2
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 为compose程序文件添加执行权限
sudo chmod +x /usr/local/bin/docker-compose

# 查看compose版本,验证是否安装成功
docker-compose --version

了解更多 >> Docker Compose 文档:安装



Swarm Mode

Swarm Mode是Docker集群管理工具,从Docker1.2开始Docker Swarm内置到Docker中为Swarm Mode。

了解更多 >> Docker文档-Swarm mode


安全

实例

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


资源

官网

相关网页