Docker

作者: Sheik | 来源:发表于2021-08-25 22:58 被阅读0次

    Docker 概述

    官网:https://www.docker.com/
    文档:https://docs.docker.com/ 文档超级详细
    docker github:https://hub.docker.com/ 可以git push git pull 一些自己的镜像
    Docker镜像。基于Go语言开发,(运行+环境).来源于集装箱的思想。Docker 的核心思想是隔离。而且Docker可以将服务器利用到极致。

    Docker的历史:

    2010年dotCloud公司做的。2013年开源。2014年发行Docker1.0版本。

    Docker 和Vmware区别:

    Docker(几M) 相比vmware (几G)小巧。 都属于虚拟化技术。
    虚拟机相当于kernel+lib+app 相当笨重麻烦。步骤复杂。操作系统+软件。
    Docker 不是一个完整的操作系统。一个容器崩了,不影响其他的。 容器是运行在宿主上,没有内核。没有虚拟硬件。
    DevOps(developer+运维)
    Docker 是内核级别的虚拟化。可以在一台物理机上运行很多docker,服务器性能被压榨到极致。

    Docker 安装

    Docker 的基本组成:


    image.png

    镜像(image):docker镜像好比一个模版,可以通过这个创建容器。例如tomcat 服务,—>run—>tomcat01容器,提供服务。最终项目运行就是在容器中的。

    容器(container):独立运行一个或一组应用。通过镜像来创建。启动,停止,删除基本命令。

    可以理解为简易的linux系统。

    仓库(repository):存放镜像的地方。分为共有仓库和私有仓库。

    安装:
    参考官方文档进行对应系统进行安装:
    https://docs.docker.com/get-docker/
    1.卸载老的版本
    2.需要的安装包
    3.安装镜像仓库(找阿里云的镜像地址)
    4.更新yum 软件包索引:yum makecache fast
    5.安装docker 相关 ce 是社区版 ee 是企业版
    6.启动docker:systemctl start docker
    docker version 查看docker version 判断是否安装成功。
    docker run hello-world 如果展现hello from Docker 说明运行成功。
    通过docker images 可以查看现有本机镜像。
    卸载的话,就是yum remove 依赖,删除目录。rm -fr /var/lib/docker 这是默认工作路径。
    systemctl restart docker 重启docker

    docker run 的运行原理:

    执行docker run 首先判断本机是否有这个镜像,有则使用这个镜像,run,没有则去docker hub 上下载。如果找不到,返回错误。 如果找到就下载到本地。

    Docker 工作原理:

    docker 是一个client-server 结构。Docker 有一个守护进程,运行在主机上。通过Socket进行客户端访问。

    DockerServer 接收Docker-client的命令,就会执行这条命令。

    Docker 常用命令:

    在帮助文档中查看docker 的命令:https://docs.docker.com/reference/
    docker version 显示版本信息
    docker info 查看docker 系统信息包含镜像和容器数量
    docker —help 帮助命令。万能命令。

    镜像命令:
    docker images 查看本地所有的镜像,也可以通过docker images —help
    REPOSITY 镜像的仓库源
    TAG 镜像标签
    IMAGE ID 这是镜像的id
    CREATE 镜像创建时间
    SIZE 镜像大小
    --all , -a 列出所有的镜像
    --quiet , -q 只显示镜像的id

    docker search <name>搜索镜像
    docker search mysql —filter=STARS=3000 搜索出来收藏大于3000的
    docker pull <name>下载镜像默认拉取最新的。 会进行分层下载。
    docker pull mysql 等价于 docker pull docker.io/library/mysql:latest
    docker pull mysql:5.7 下载指定版本。
    docker rmi -f id 删除指定镜像(remove image)。也可以通过空格删除多个。
    docker rmi -f $(docker images -aq) 删除所有的

    容器命令:
    用docker pull centos 来学习,下载一个centos 的镜像
    通过docker run 命令来启动。 也可以通过docer run —help 来查看帮助文档。
    --name 起名字tomcat01 tomcat02
    -d 后台启动
    -i t 使用交互方式进入查看容器。
    -p 指定容器端口 -p 8080
    -p ip:主机端口:容器端口
    -p 主机端口:容器端口(常用)
    -p 容器端口
    -P 随机指定端口。
    docker run -it centos /bin/bash 这个就是启动了centos ,并进入容器。
    ls centos 就是个小型的os。
    exit 是退出。
    docker ps 查看运行的容器。
    docker ps -a 查看曾经运行过的容器+正在运行的容器。
    -n=? 显示最近运行的n个容器。
    docker ps -a -n=1 查看1个。
    docker ps -aq

    退出容器:
    ctrl+p+q 容器不停止退出。
    exit 容器停止退出。

    删除容器:
    docker rm -f <容器id>删除指定容器。 这里是强制删除
    docker rm -f $(docker ps -aq) 删除所有的容器。

    启动 和停止
    docker start <容器id> 启动
    docker restart <容器id>重启
    docker stop <容器id> 停止
    docker kill <容器id> 杀掉

    后台启动:

    docker run -d centos
    执行docker ps 发现centos 停止了。如果centos 要后台运行,就必须有一个前台进程。 就会自动停止。
    查看日志:
    docker logs --help
    docker run centos /bin/sh -c “while true; do echo sheik; sleep 1;done”
    docker ps
    docker logs -tf --tail 10 <容器id>

    查看docker 内部的进程信息:
    docker top <容器id>

    显示容器的信息:
    docker inspect <容器的id> 显示容器的所有信息

    进入当前正在运行的容器:
    dockter exec -it <容器id> /bin/bash 进入后,打开一个新的终端。
    docker attach <容器id> 正在执行当前的代码。终端

    容器内的数据拷贝到目的主机上:
    docker cp <容器id>:/home/test.java /home/

    docker run -it --rm tomcat:9.0

    --rm 用来测试,用完即删除。

    docker pull tomcat

    docker run -d -p 3355:8080 tomcat

    docker exec <id> /bin/bash

    把webapps.disk 中的内容全部copy 到webapps 目录下,可以通过http://localhost:3355/ 进行访问。

    可以通过docker stop <id> 进行停止。

    通过docker stats 来查看cpu 的状态。

    如果硬件太慢,可以通过-e ES_JAVA_OPTS=“-Xms64m -Xmx512m”

    curl localhost:3355

    Protainer 可视化面板。

    分层的原理: 就是记录一次,如果有的,就不会进行下载(pull)相当于UnioFS。

    image 镜像层是不会改变的。容器是在镜像层新加了一层。所有操作都在容器层。

    commit 自己的镜像

    docker commit

    docker commit -m=“提交的描述信息” -a=“作者” 容器id 容器镜像名[TAG]

    timdeMBP:~ tim$ docker commit -a="sheik" -m="add webapps" 3262514243b0 sheiktomcat:1.0

    sha256:0c63aa5e6c0b6aa65bd882585e2fe723a3e6a8bea06a564534450a6f8a1f272b

    timdeMBP:~ tim$ docker images

    REPOSITORY TAG IMAGE ID CREATED SIZE

    sheiktomcat 1.0 0c63aa5e6c0b 4 seconds ago 673MB. —比下面大了一些。

    tomcat 9 266d1269bb29 9 days ago 668MB

    tomcat latest 266d1269bb29 9 days ago 668MB

    docker/getting-started latest 083d7564d904 2 months ago 28MB

    容器数据卷:

    将应用以及环境打包成一个镜像。数据不会放到容器中,要进行持久化。这里可以使用挂载技术,把数据保存在linux 或者本地中。也就是容器的同步和持久化技术,数据进行共享。
    docker run -it -v
    docker run -it -v /Users/Tim/test:/home centos /bin/bash 这个可以挂载多个。 一般用于配置文件修改等。
    主机地址 容器内地址
    通过dockter inspect 来查看是否挂在成功。 这样其实就可以 让容器和本地保持一个同步。

    好处,就是在本地修改,会自动进行同步。即使删掉容器,本地数据也不会丢失。

    查看所有卷的情况:docker volume ls

    匿名卷 和具名卷:
    如果没有指明 本地名,那么就是匿名卷。 如果有名字就是具名卷。
    docker run -it -v /Users/Tim/test:/home centos /bin/bash 这就是匿名挂载
    docker run -it -v centos:/home centos /bin/bash 这就是具名centos挂载(常用)
    -v 容器内路径 匿名挂载
    -v 名称:容器内路径。具名挂载
    -v 宿主机路径:容器内路径。指定路径挂载

    如果没有指定目录,可以通过docker inspect 来查看, 一般来讲都会存在var/lib/docker/volumes/ 路径下

    还有 容器内路径的权限限定。ro 只读 rw读写
    docker run -it -v /Users/Tim/test:/home:ro centos /bin/bash
    docker run -it -v /Users/Tim/test:/home:rw centos /bin/bash

    docker File:

    用来构建docker镜像文件创建。里面就是一些脚本命令。
    1.首先在本地建一个路径。
    2.在路径下创建一个文件,写脚本:指令+参数构成。指令都是大写。
    FROM centos // 从哪里来的
    MAINTAINER sheik111@163.com
    ENV MYPATH /usr/local
    WORKDIR $MYPATH
    VOLUME (“volume1”, “volume2”)// 挂载的数据卷目录
    RUN yum -y install vim
    RUN yum -y net -toos
    CMD echo “_____end____”
    CMD /bin/bash

    然后执行 docker build -f /home/**/刚才创建的文件 -t 镜像名称 当前路径

    通过这种方式进行直接进行挂载。如果没有挂载,后面就通过-v 进行挂载。

    数据卷容器: 容器和容器进行同步。

    --volumes-from 容器2 数据卷容器(容器1)
    docker run —name 01 -it 容器1id
    docker run —name 02 —volume-from 01 -it 容器1id 这样就实现了两个容器的同步

    Dockerfile:

    1.编写dockerfile 文件。
    2.docker build
    3.docker run
    4.docker pull 发布
    Docker file 命令:
    FROM #基础镜像 一切都从这里构建。
    MAINTAINER #谁写的,谁维护 一般是姓名+ 邮箱
    RUN #构建的时候,需要运行的命令。
    ADD # 添加组件,添加内容,自动解压
    WORKDIR #工作目录
    VOLUME #挂载目录
    EXPOSE #暴露端口 -p 同理
    CMD #指令,指定容器运行的命令。 替换。 只执行最后一个CMD。 docker run id -l ,那么-l 会替换CMD中的内容
    ENTRYPOINT:#可以追加命令。 追加
    ONBUILD:#当一个继承dockerfile的时候会被调用。
    COPY:#类似add 命令。 文件copy到镜像中。
    ENV:#设置环境变量。

    Centos的dockfile
    FROM scratch
    ADD centos-7-x86_64-docker.tar.xz /

    LABEL
    org.label-schema.schema-version="1.0"
    org.label-schema.name="CentOS Base Image"
    org.label-schema.vendor="CentOS"
    org.label-schema.license="GPLv2"
    org.label-schema.build-date="20201113"
    org.opencontainers.image.title="CentOS Base Image"
    org.opencontainers.image.vendor="CentOS"
    org.opencontainers.image.licenses="GPL-2.0-only"
    org.opencontainers.image.created="2020-11-13 00:00:00+00:00"

    CMD ["/bin/bash"]

    hub.docker 99%的镜像都是从基础scratch开始的。

    通过docker history 可以查看到某个docker 的构建步骤。

    也可以通过压缩包进行构建镜像。例如制作tomcat,那么需要tomcat 压缩包和jdk 压缩包。
    创建Dockerfile ,这是官方推荐命名。
    ADD 都会自动解压。
    设置环境变量。
    暴露端口等。

    发布镜像到dockerhub:

    1.注册账号
    2.账号可以登录
    3.在服务器上提交。
    首先要登录:
    docker login -u * -p * 登录
    docker logout 退出登录
    docker push 作者名字/容器名字:version
    通过docker tag 容器id 然后是新的TAG 名字。
    例如:docker tag id aaaa:1.0

    发布到阿里云镜像:

    1.登录到阿里云
    2.找到容器镜像服务。
    3.创建命名空间。 指的是一个大项目。
    4.创建镜像。
    在阿里云界面会有各种上传/拉取的命令。

    docker 网络:路由

    docker0:docker 地址
    lo:本机回环地址。
    etho:公网地址

    docker 如何处理网络访问的:
    Linux 可以直接ping 通docker 的ip 地址。
    root@be594b83e415:/usr/local/tomcat# ip addr
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    valid_lft forever preferred_lft forever
    2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
    link/ipip 0.0.0.0 brd 0.0.0.0
    3: ip6tnl0@NONE: <NOARP> mtu 1452 qdisc noop state DOWN group default qlen 1000
    link/tunnel6 :: brd ::
    32: eth0@if33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
    valid_lft forever preferred_lft foreve

    每启动一个容器,docker 就会给每一个容器分配一个ip,我们只要安装了docker,就会有一个docker0的网卡桥接模式。
    使用的是evth-pair技术。
    evth-pair 是连接网络虚拟设备的。
    容器间也可以ping 通。 这种通信不是直接连接。而是通过docker0的evth-pair 技术,到docker0之后,再到容器2.

    --link 解决ip地址变化,导致无法通信的问题。

    通过名称无法ping 通
    docker exec -it —name tomcat02 ping tomcat01

    可以通过下面方式进行连接:
    docker run -d -P —name tomcat03 —link tomcat02 tomcat
    这时就可以ping 通
    docker exec -it tomcat03 ping tomcat02
    反向不可以ping 通
    docker exec -it tomcat02 ping tomcat03

    因为一旦用 --link之后,进入tomcat03的/etc/hosts 文件会写tomcat02的配置进去。
    如果需要相互访问,那么就要启动相互绑定,但是要进行重启。

    自定义网络:

    使用docker network ls 查看所有的docker 网络。
    timdeMBP:~ timdocker network ls NETWORK ID NAME DRIVER SCOPE 1ed681fdec45 bridge bridge local bb658ada48bd host host local 56d64f32a033 none null local timdeMBP:~ tim

    bridge 桥接模式(默认)。
    none 不配置网络
    host 主机模式,和主机共享网络。

    timdeMBP:~ tim$ docker network --hlep
    unknown flag: --hlep
    See 'docker network --help'.

    Usage: docker network COMMAND

    Manage networks

    Commands:
    connect Connect a container to a network
    create Create a network
    disconnect Disconnect a container from a network
    inspect Display detailed information on one or more networks
    ls List networks
    prune Remove all unused networks
    rm Remove one or more networks

    Run 'docker network COMMAND --help' for more information on a command.

    创建自定义网络: 都已经创建好了各个容器对应关系。
    docker network create --driver bridge --subnet 192.168.0.0 --gateway 192.168.0.1 mynet

    docker network inspect mynet

    启动容器的时候是: 这个时候就可以ping 通。
    docker run -d -P --name tomcat01 --net mynet tomcat
    docker run -d -P --name tomcat02 --net mynet tomcat
    docker exec -it tomcat01 ping tomcat02
    docker exec -it tomcat02 ping tomcat01

    好处:不同的集群使用不同的网络

    网络联通:

    Docker0 和mynet 两个网络。
    使用connect 命令。 基本原理是:把容器直接放到mynet 下,相当于一个容器两个ip,一个公网,一个私网。
    docker network connect mynet tomcat01

    相关文章

      网友评论

          本文标题:Docker

          本文链接:https://www.haomeiwen.com/subject/eutyiltx.html