Docker
简介
-
Docker是一个开源的应用容器,基于GO语言并遵从Apache2.0协议开源
-
Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低
-
部署
-
物理机
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IzobWGRF-1669469225417)(C:\Users\L\AppData\Roaming\Typora\typora-user-images\image-20221115211747222.png)]
-
虚拟机
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3dEgU6NK-1669469225418)(C:\Users\L\AppData\Roaming\Typora\typora-user-images\image-20221115211820159.png)]
-
容器
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-or1juFWt-1669469225419)(C:\Users\L\AppData\Roaming\Typora\typora-user-images\image-20221115211854447.png)]
-
-
Docker架构
- 镜像(Image):相当于一个文件系统
- 容器(Container):相当与面向对象编程中的类和实例
- 仓库(Repository):相当于代码控制中心
-
Docker底层技术
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ufMmClfi-1669469225420)(C:\Users\L\AppData\Roaming\Typora\typora-user-images\image-20221115213241714.png)]
-
Docker网络
- Docker 中的网络接口默认都是虚拟的接口。虚拟接口的优势之一是转发效率较高。 Linux 通过在内核中进行数据复制来实现虚拟接口之间的数据转发,发送接口的发送缓存中的数据包被直接复制到接收接口的接收缓存中。对于本地系统和容器内系统看来就像是一个正常的以太网卡,只是它不需要真正同外部网络设备通信,速度要快很多
- Docker 创建一个容器的时候,会执行如下操作:
- 创建一对虚拟接口,分别放到本地主机和新容器中;
- 本地主机一端桥接到默认的 docker0 或指定网桥上,并具有一个唯一的名字,如 ens33;
- 容器一端放到新容器中,并修改名字作为 eth0,这个接口只在容器的名字空间可见;
- 从网桥可用地址段中获取一个空闲地址分配给容器的 eth0,并配置默认路由到桥接网卡 ens33
- 完成这些之后,容器就可以使用 eth0 虚拟网卡来连接其他容器和其他网络
- 在 docker run 的时候通过 --net 参数来指定容器的网络配置,有4个可选值:
- –net=bridge 这个是默认值,连接到默认的网桥。
- –net=host 告诉 Docker 不要将容器网络放到隔离的名字空间中,即不要容器化容器内的网络。此时容器使用本地主机的网络,它拥有完全的本地主机接口访问权限。容器进程可以跟主机其它 root 进程一样可以打开低范围的端口,可以访问本地网络服务比如 D-bus,还可以让容器做一些影响整个主机系统的事情,比如重启主机。因此使用这个选项的时候要非常小心。如果进一步的使用 --privileged=true,容器会被允许直接配置主机的网络堆栈。
- –net=container:NAME_or_ID 让 Docker 将新建容器的进程放到一个已存在容器的网络栈中,新容器进程有自己的文件系统、进程列表和资源限制,但会和已存在的容器共享 IP 地址和端口等网络资源,两者进程可以直接通过 lo 环回接口通信。
- –net=none 让 Docker 将新容器放到隔离的网络栈中,但是不进行网络配置。之后,用户可以自己进行配置
-
Docker Dockerfile介绍
-
基本结构
- Dockerfile 由一行行命令语句组成,并且支持以 # 开头的注释行。
- Dockerfile分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行命令。
-
指令:指令的一般格式为INSTRUCTION arguments,指令包括FROM、MAINTAINER、RUN等
-
FROM
格式为FROM或FROM:
第一条指令必须为FROM指令。如果在同一个Dockerfile中创建多个镜像时,可以使用多个FROM指令(每个镜像一次)
-
MAINTAINER
格式为MAINTAINER,指定维护者信息
-
RUN
格式为RUN或RUN[“executable”,“param1”,“param2”]
前者将在shell终端中运行命令,即/bin/sh -c ;后者则使用exec执行。指定使用其他终端通过第二种方式实现,例如RUN[“/bin/bash”,“-c”,“echo hell”]
每条RUN指令将在当前镜像基础上执行指定命令,并提交为新的镜像。当命令较长时可以使用 \ 来换行
-
CMD
支持三种格式:
- CMD [“executable”,“param1”,“param2”] 使用 exec 执行,推荐方式;
- CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用;
- CMD [“param1”,“param2”] 提供给 ENTRYPOINT 的默认参数;
指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条命令,只有最后一条会被执行
如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令。
-
EXPOSE
格式为EXPOSE[…]
告诉 Docker 服务端容器暴露的端口号,供互联系统使用。在启动容器时需要通过 -P,Docker 主机会自动分配一个端口转发到指定的端口。
-
ENV
格式为ENV
指定一个环节变量,会被后续RUN指令使用,并在容器运行时保持
-
ADD
格式为ADD
该命令将复制指定的 到容器中的 。 其中 可以是Dockerfile所在目录的一个相对路径;也可以是一个 URL;还可以是一个 tar 文件(自动解压为目录)
-
COPY
格式为 COPY
复制本地主机的 (为 Dockerfile 所在目录的相对路径)到容器中的 。
当使用本地目录为源目录时,推荐使用 COPY。
ENTRYPOINT
两种格式:- ENTRYPOINT [“executable”, “param1”, “param2”]
- ENTRYPOINT command param1 param2(shell中执行)。
配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。
每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效
-
VOLUME
格式为VOLUME[“/data”]
创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。
-
USER
格式为 USER daemon
指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。
当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户,例如:RUN groupadd -r postgres && useradd -r -g postgres postgres。要临时获取管理员权限可以使用 gosu,而不推荐 sudo
-
WOKDIR
格式为 WORKDIR /path/to/workdir
为后续的 RUN、CMD、ENTRYPOINT 指令配置工作目录
可以使用多个 WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径
-
ONBUILD
格式为 ONBUILD [INSTRUCTION]。
配置当所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令
-
-
创建镜像
编写完成 Dockerfile 之后,可以通过 docker build 命令来创建镜像。
基本的格式为 docker build [选项] 路径,该命令将读取指定路径下(包括子目录)的 Dockerfile,并将该路径下所有内容发送给 Docker 服务端,由服务端来创建镜像。因此一般建议放置 Dockerfile 的目录为空目录。也可以通过 .dockerignore 文件(每一行添加一条匹配模式)来让 Docker 忽略路径下的目录和文件。
要指定镜像的标签信息,可以通过 -t 选项
-
-
Docker Compose 项目
Docker Compose 是 Docker 官方编排(Orchestration)项目之一,负责快速在集群中部署分布式应用。
Dockerfile可以让用户管理一个单独的应用容器;而 Compose 则允许用户在一个模板(YAML 格式)中定义一组相关联的应用容器(被称为一个 project,即项目)
安装
-
安装最新的docker ce版本
yum install docker-ce docker-ce-cli containerd.io
-
安装指定版本docker
yum list docker-ce --showduplicates | sort -r
yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
-
必须启用CentOS Extras存储库。默认情况下,此存储库已启用,但如果已禁用,则需要 重新启用它。可参考https://wiki.centos.org/AdditionalResources/Repositories,建议使用overlay2存储驱动程序
-
更换国内镜像源
打开文件
vim /etc/docker/daemon.json
" r e g i s t r y − m i r r o r s " : [ " h t t p s : / / r e g i s t r y . d o c k e r − c n . c o m " , " h t t p s : / / d o c k e r . m i r r o r s . u s t c . e d u . c n " , " h t t p : / / h u b − m i r r o r . c . 163. c o m " , " h t t p s : / / c r . c o n s o l e . a l i y u n . c o m / " ] { "registry-mirrors" : [ "https://registry.docker-cn.com", "https://docker.mirrors.ustc.edu.cn", "http://hub-mirror.c.163.com", "https://cr.console.aliyun.com/" ] } "registry−mirrors":["https://registry.docker−cn.com","https://docker.mirrors.ustc.edu.cn","http://hub−mirror.c.163.com","https://cr.console.aliyun.com/"]
基础命令
- 进程类
systemctl start docker
启动Docker服务systemctl stop docker
停止Docker服务systemctl restart docker
重启Docker服务systemctl status docker
查看Docker服务systemctl enable docker
开机自启Docker服务
- 镜像类
docker search [镜像名称]
搜索镜像docker pull [镜像名称]
拉取镜像docker images
查看本地镜像docker images -a
查看本地所有镜像docker images -q
查看本地镜像的iddocker rmi [-f] 镜像id[镜像名称]
删除镜像 -f 表示强制删除docker rmi -f $(docker images -qa)
删除所有镜像
- 容器类
docker ps
查看正在执行的容器docker ps -a
查看所有的容器docker run 参数
创建并启动容器- -i :保持容器运行。加入-it这两个参数以后,容器创建后会自动进入容器中,退出容器后,容器会自动关闭
- -t :为容器重新分配一个伪输入终端。通常与-i 同时使用
- -d :以守护(后台)模式运行容器。创建一个容器在后台运行,需要使用docker exec进入容器
- -it :创建的容器一般称为交互式容器
- -id :创建的容器一般称为守护式容器
- –name :为创建的容器命名
- -p :映射端口 外部端口:容器内部暴露的端口
docker exec -it 容器id[容器名称] /bin/bash
进入容器docker inspect 容器id[容器名称]
查看容器信息docker stop 容器id[容器名称]
停止容器docker start 容器id[容器名称]
启动容器docker restart 容器id[容器名称]
重启容器docker kill 容器id[容器名称]
强制停止容器docker rm 容器id[容器名称]
删除容器,需要先停止,后删除docker rm -f 容器id[容器名称]
强制删除容器dorker rm -f $(docker ps -qa)
强制删除所有容器docker logs -f 容器id[容器名称]
查看容器日志