docker Dockerfile 安装以及应用等

什么是docker

是一种容器 可实现虚拟化可移植的轻量级容器,采用沙箱机制,相互之间不会有任何接口,开销性能低。

docker 容器实在镜像的基础上实例化出来的 可以多个景象挂在组成一个容器,一般数据库采用独立于容器存储。容器可集中编排和部署 一般用k8s

docker 是在一个内核中直接创建独立的用户空间空间内包括主机名/域名、信息量/消息队列和共享内存、进程编号、网络设备/网络栈/端口、挂载点、用户名和用户组

docker 安装(centos)

1) 先设置安装所需的包
    sudo yum install -y yum-utils device-mapper-persistent-data  lvm2
2) 设置稳定存储库
    sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

3) 可选项目
    启用夜间存储库
     sudo yum-config-manager --enable docker-ce-nightly
    启用测试通道
     sudo yum-config-manager --enable docker-ce-test

4) 安装docker ce
    sudo yum install docker-ce docker-ce-cli containerd.io
5) 启动
    sudo systemctl start docker
6) 测试是否正确安装
    简单测试 docker run hello-world

注意点 配置更新源尤其注意

使用命令

### 基础命令
1. docker ps  //查看有多少运行镜像
2. docker images //查看docker容器已有多少个镜像
    docker images --no-trunc // 查看完整的imagesId命令
3. docker pull <所需下载的镜像>   //将优先从本地拉取镜像 可以指定版本 若指定稳定版本可用 <镜像>:stable 没有再从镜像仓库拉取
4. docker run -i -t --name joe_ubuntu ubuntu  /bin/bash  //交互式拉取镜像
5. docker search  // 命令查找 查找相关镜像
6. docker rmi  <镜像名/版本号> // 镜像删除

个人常用安装与使用docker

示例:docker run --name="lxpython" --network="bridge" -v /Users/liuxinMAC/Desktop/pythonWorkSpace:/pythonWorkSpace -w /pythonWorkSpace  -itdp 12000:5555 -e"liuxin"="liuxinwork"   python:latest
--name 自定义容器名
--network 自定义使用那种网络桥 也可以使用自定义网络桥
-v 挂载本地文件或者数据卷
-e 自定义添加环境变量 使用key=value形式
-itd 交互后台返回窗口
-p 窗口映射
-w 指定在容器中的工作目录
docker run --name="lxpython" --network=lxnetwork -v /Users/liuxinMAC/Desktop/pythonWorkSpace:/pythonWorkSpace -w /pythonWorkSpace  -itdp 12000:5555 -e"liuxin"="liuxinwork"   python:latest

容器相关

容器 = 镜像 + 读写层
1\. docker run -d -P <容器/镜像> 项目   // -d:让容器在后台运行。-P:将容器内部使用的网络端口映射到我们使用的主机上。
2\. dokcer run -d -p 8888:6666 <容器/镜像> 项目  // -p可以设定容器与镜像运行的端口对应 极为容器的8888端口映射到主机6666端口  若是没有这个容器 run命令会自动创建及拉取(等于雨docker create 多了一个启动)
3\. docker port <镜像id>  // 快速查看指定容器镜像运行的端口与映射情况
4\. docker logs -f <镜像id>  // 查看相对应的容器日志情况
5\. docker top <镜像id/名称>  //查看容器内部进程
6\. docker inspect <镜像id/名称>  //查看容器镜像应用底层信息
7\. dokcer stop  <镜像id/名称>  // 停止容器镜像项目
8\. docker start/rm/restrt <镜像id/名称>  // 启动/删除/重启容器镜像项目
9.docker run -v //挂载文件  示例:docker run  -it --name="lxtest" -v /go:/home/liuxin/GO/ golang:latest /bin/bash
10\. docker run --name="xxxxx"  //对容器自定义名称
11.dokcer rm xxx  // 删除容器
12.docker pause xxx // 暂停容器中所有的进程
13.docker unpause xxx//恢复进程
14.docker exec xxx  // 在运行的容器中执行命令 也可以理解为进入容器当中
15.docker top xxx  // 类似于dokcer ps  可以查看指定容器运行的进程信息
16.docker inspect xxx // 获取容器镜像元数据  例如获取ip docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' xxx
17.docker attach <容器ID> 登陆连接已运行容器的另一种方式
18.docker events 参数==xxx  //从服务器中获取事件内容  ## 示例:docker events  --since="1467302400" 获取这个时间戳后的数据     还有-f是过滤
19.docker logs 条件参数 xxx  //查看log日志
20.cat /etc/hosts 进入容器查看ip地址
    docker inspect 容器ID | grep IPAddress 日期外查看ip
21.docker export <容器id> -o 路径/自定义名称.tar
22.docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]    
    docker commit -a "author" -m "备注信息" -p <提交时暂停容器方便保存> -c <为创建的镜像加入Dockerfile命令>  //这是容器变镜像文件
23.docker exec -it <CONTAINER-NAME> OR <CONTAINER-ID> env  // 查看环境变量

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
    OPTIONS说明:
    -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
    -d: 后台运行容器,并返回容器ID;
    -i: 以交互模式运行容器,通常与 -t 同时使用;
    -P: 随机端口映射,容器内部端口随机映射到主机的高端口
    -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
    -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
    --name="nginx-lb": 为容器指定一个名称;
    --dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
    --dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
    --privileged=true  centos7中的安全模块selinux把权限禁止了,加上这行是给容器增加执行权限 
    -h "mars": 指定容器的hostname;
    -e username="ritchie": 设置环境变量;
    --env-file=[]: 从指定文件读入环境变量;
    --cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;

    -m :设置容器使用内存最大值;

        关于内存设置的几个注意点:
            其中 --memory-swap为总空间 代号S;--mermory为物理空间 代号M。如果设置了--memory-swap则必须设置--mermory;交换空间等于总空间减去物理空间
            1.若--memory-swap (S)为正数,--mermory(M)为正数; 则总空间为(S)ram为(M)swap为(S-M),若(S)=(M)则无可用swap资源

            2\. 若--memory-swap (S)为 0 《0 =unset》 ,--mermory(M)为正数;相当于未设置swap;若主机启动了swap ,则容器的可用swap为2*M 也就是 S=2*M

            3\. 若--memory-swap (S)为 -1 ,--mermory(M)为正数;若主机启动了swap ,则容器的可用最大至主机上所有swap空间的swap资源

        注意:在容器中使用free命令可以看到的swap空间并不具有其所展现出的空间指是意义

        --memory-swappiness 为容器使用交换空间内存倾向度 范围为0-100。0为能不用交换空间就不用,100为能用就用,只要有类似可能性都用。默认为 40-60

    --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
    --link=[]: 添加链接到另一个容器;
    --expose=[]: 开放一个端口或一组端口;
    --volume , -v:  绑定一个卷

    --volumes-from // 直接 复制 其他容器的卷路径已经相关配置示范 docker run -itd --name b2 --network container:b1 --volumes-from b1 golang:latest // b1为一个容器 , 可以多台容器复制该容器挂载路径 同时操作挂载卷

镜像相关

1. 若是系统等已有的 可以用docker pull ruoshi 自创镜像可以用Dockerfile  //创建镜像
2. docker -t -i <镜像/名称>/bin/bash        // 先创建
    后 docker commit -m= "has update" - = "runoob" <镜像id>  指定要创建的目标镜像名

    示例: docker run -itdp 8888:6666 --name="test-ubuntu" ubuntu // 为创建容器并启动  
3. 构建镜像  docker build -t <指定要创建的目标镜像名> . :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径
4. docker tag <镜像id> 标签
5. docker import  //从归档文件中创建镜像
6. docker save <镜像id> -o 路径/保存名字 // 镜像保存
7. docker load -i <压缩的镜像包>  或者也可以docker load < <压缩的镜像包>// 镜像加载
8. docker tag 景象名称:版本 // 镜像重命名
9. docker import <镜像包> 版本:版本号码 // 也可组成在基础上弄成镜像 不过和load不同的是 load是原时间 import是打包时间

容器连接

  1. 网络映射端口 docker run -d -p 5000:5000 training/webapp python app.py
  2. 查看端口 docker port adoring_stonebraker 5000
  3. 另命名端口 docker run -d -P --name runoob training/webapp python app.py
  4. iptables -t nat -A DOCKER ! -i docker0 -p tcp -m tcp --dport 8888 -j DNAT --to-destination 10.10.10.4:80 // 为运行的容器添加端口映射 说明: mac系统不管用 linux系统有待验证

网络相关

docker network ls // 查看所有网络
docker network create <option> <自定义命名>  // 新建自定义网络
    示例:docker network create -d bridge lxnetwork --subnet="10.10.10.0/24" --gateway="10.10.10.1"
    -d, --driver string             指定网络的驱动(默认 "bridge")
    --subnet strings            指定子网网段(如192.168.0.0/16、172.88.0.0/24)
    --ip-range strings          执行容器的IP范围,格式同subnet参数
    --gateway strings           子网的IPv4 or IPv6网关,如(192.168.0.1)
    注意:
        host和none模式网络只能存在一个
        docker自带的overlay 网络创建依赖于docker swarm(集群负载均衡)服务
        192.168.0.0/16 等于 192.168.0.0~192.168.255.255    192.168.8.0/24
        172.88.0.0/24 等于 172.88.0.0~172.88.0.255    
docker network rm <网络id>  // 删除docker网络
docker network inspect <网络id> // 查看docker网络的详细信息
docker network connect <自定义网络> <容器>  //手动将容器绑定网络 示范:docker network connect lxnetwork 30

Dockerfile

语法

FROM <repository>[:<tag>] 或
FROM <resisitory>@<digest>  // 必须一FROM开头 否则无法识别
    <reposotiry> : 指定 base images 的名称
    <tag> : base images 的标签,为可选项,默认为latest

MAINTANIER (depreacted) // 可选选项 一般用于写作者信息等
MAINTANIER 等同于LABEL 相同作用  
    LABEL AUTHOR="liuxin  <liuxin03311@163.com>" 
    MAINTANIER "maintanier <liuxin03311@163.com>"

COPY // 用于从Docker主机复制文件至创建的新印象文件
    COPY <src> ... <dest> 或 
    COPY ["<src>",..."<dest>"]  //建议使用这种 兼容路径中空白字符  
        <src> 要复制的源文件或目录,支持使用通配符
        <dest> 目标路径,即正在创建的image的文件路径系统
        COPY 指定则以WORKDIR 为其起始路径
    注意:
        1.<src> 必须是build上下文中的路径,不能是其父目录中的文件。
        2.如果<src>是目录,则其内部文件或子目录会被递归复制 ,但 <src>目录目录自身不会被复制 
        3.如果指定了了多个<src>,或在<src>中使用了通配符 ,则<dest>必须是一个目录 ,且必须以 /结尾 
        4.如果<dest>事先不存在,它将会被自动创建,这包括其父 目录路径   

RUN
    在新镜像内部执行的命令,比如安装一些软件、配置一些基础环境,可使用\来换行 在制作镜像的时候使用
    示例:
        1.RUN echo 'hello docker!' \
        > /usr/local/file.txt
        2. 也可以使用exec格式RUN ["executable", "param1", "param2"]的命令,如:
        RUN ["apt-get","install","-y","nginx"]
        要注意的是,executable是命令,后面的param是参数

EXPOSE
    暴露镜像的端口供主机做映射,启动镜像时,使用-P参数来讲镜像端口与宿主机的随机端口做映射。使用方式(可指定多个):
        EXPOSE 8080 
        EXPOSE 8081
        EXPOSE 11211/udp  11211/tcp
        ...

WORKDIR
    在构建镜像时,指定镜像的工作目录,之后的命令都是基于此工作目录,如果不存在,则会创建目录
        WORKDIR /usr/local
        WORKDIR webservice
        RUN echo 'hello docker' > text.txt
        ...

ONBUILD
    当一个包含ONBUILD命令的镜像被用作其他镜像的基础镜像时(比如用户的镜像需要从某为准备好的位置添加源代码,或者用户需要执行特定于构建镜像的环境的构建脚本),该命令就会执行。
    如创建镜像image-A

        FROM ubuntu
        ...
        ONBUILD ADD . /var/www
        ...

    然后创建镜像image-B,指定image-A为基础镜像,如

        FROM image-A
        ...

    然后在构建image-B的时候,日志上显示如下:

        Step 0 : FROM image-A
        # Execting 1 build triggers
        Step onbuild-0 : ADD . /var/www
        ...

USER
    指定该镜像以什么样的用户去执行,如:

        USER mongo

VOLUME
    用来向基于镜像创建的容器添加卷。比如你可以将mongodb镜像中存储数据的data文件指定为主机的某个文件。(容器内部建议不要存储任何数据)
        如:

        VOLUME /data/db /data/configdb

    注意:VOLUME 主机目录 容器目录

ADD
    将主机的文件复制到镜像中,跟COPY一样,限制条件和使用方式都一样,但是ADD会对压缩文件(tar, gzip, bzip2, etc)做提取和解压操作。

ENV
    用于为为镜像定义所需的环境变量 并可被Dockerfile文件中位于其后的其他指令(如ENV、ADD、COPY等)所调用   
    调用格式为 $variable_name 或 ${variable_name}

    语法 
        ENV <key><value>或 ENV <key>=<value>... 
        第一种<key>后后所有内容均被视作为其<value>的的组成部分 ,因此,一次只能设置一个变量
        第二种格式可用于一次设置多个变量 ,每个变量为一个"<key>=<value>"的键值对,如果 <value>中包含空格 ,可以用反斜杠 (/)进行转义 ,也可通过对<value>加引号进行标识,另外 ,斜线{\}也可用于续行   

    建议使用第二种 

CMD 
    类似于 RUN 指令,CMD指令也可以用于运行任何命令或应用程序,不过,二者的运行时间点不同 。
        * RUN指令运行于映像文件构建过程中 ,而CMD指令运行于基于于Dockerfile构建出的新映像文启动一个容器时

        *CMD指令的首要目在于在于启动的 容器指定默认要运行的程序,且 其运行结束后 ,容器也将终止 ;不过,CMD指定的命令指定的命令其可以被docker run de的命令行选项所覆盖  

        *当有多个CMD的时候,只有最后一个生效。

    在制作容器的时候使用

    容器启动时需要执行的命令,如:

        1.CMD <command>
            CMD /bin/bash
            此方法 进程 PID不为1无法无法接收画画UNIX信号 

    同样可以使用exec语法,如

        2.CMD["<executable>,"<param1>","<param2>"]
            ["/bin/bash","<param1>","<param2>"]
        3.CMD["<param1>","<param2>"]

    前两种语法格式的意同 RUN
    第三种则用于 ENTRYPOINT指令提供默认参数 

ENTRYPOINT

    作用和用法和CMD一模一样

CMD和ENTRYPOINT的区别

    CMD和ENTRYPOINT同样作为容器启动时执行的命令,区别有以下几点:

    CMD的命令会被 docker run 的命令覆盖而ENTRYPOINT不会

    如使用CMD ["/bin/bash"]或ENTRYPOINT ["/bin/bash"]后,再使用docker run -ti image启动容器,它会自动进入容器内部的交互终端,如同使用
    docker run -ti image /bin/bash。
    但是如果启动镜像的命令为docker run -ti image /bin/ps,使用CMD后面的命令就会被覆盖转而执行bin/ps命令,而ENTRYPOINT的则不会,而是会把docker run 后面的命令当做ENTRYPOINT执行命令的参数。

HEATHCHECK
    用于检查主进程工作与否

    1、HEALTHCHECK [options] CMD command
  2、HEALTHCHECK NODE 意思是禁止从父镜像继承的HEALTHCHECK生效 

  参数:
      --interval:间隔(s秒、m分钟、h小时),从容器运行起来开始计时interval秒(或者分钟小时)进行第一次健康检查,随后每间隔interval秒进行一次健康检查;还有一种特例请看timeout解析。(default:30s)

      --start-period=DURATION 启动时间, 默认 0s, 如果指定这个参数, 则必须大于 0s ;--start-period 为需要启动的容器提供了初始化的时间段, 在这个时间段内如果检查失败, 则不会记录失败次数。 如果在启动时间内成功执行了健康检查, 则容器将被视为已经启动, 如果在启动时间内再次出现检查失败, 则会记录失败次数。(default:0s)

      --timeout:执行command需要时间,比如curl 一个地址,如果超过timeout秒则认为超时是错误的状态,此时每次健康检查的时间是timeout+interval秒。(default:30s)

      --retries:连续检查retries次,如果结果都是失败状态,则认为这个容器是unhealth的.(default:3)

        状态码 :
            0:success
            1:unhealthy
            2:reserved

        For example
            HEATHCHECK --interval=5m --timeout=3s CMD curl -f http://localhost || exit 1

SHELL 
    Sytnax:
    SHELL ["exectable","parameters"]

STOPSIGNAL
    语法:

        STOPSIGNAL signal
        STOPSIGNAL命令是的作用是当容器推出时给系统发送什么样的指令
        也可以通过 create/run 的参数 --stop-signal 设置。

        默认的stop-signal是SIGTERM,在docker stop的时候会给容器内PID为1的进程发送这个signal,通过--stop-signal可以设置自己需要的signal,主要的目的是为了让容器内的应用程序在接收到signal之后可以先做一些事情,实现容器的平滑退出,如果不做任何处理,容器将在一段时间之后强制退出,会造成业务的强制中断,这个时间默认是10s

ARG
    语法:
        ARG <name>[=<default value>]
        设置变量命令,ARG命令定义了一个变量,在docker build创建镜像的时候,使用 --build-arg <varname>=<value>来指定参数

        在终端命令行传参:--build-arg <key>=<value>

ONBUILD
    ●用于在Dockerfle中定义一个触发器
    ●Dockerfile用于build映像文件,此映像文件亦可作为base image被另一个Dockerfile用作FROM指令的参数,并以之构建新的映像文件
    ●在后面的这个Dockerfile中的FROM指令在build过程中被执行时,将会“触发”创建其base image的Dockerfle文件中的ONBUILD指令定义的触发器
    ●Syntax
         ONBUILD <InsTruction>
    ●尽管任何指令都可注册成为触发器指令,但ONBUILD不能自我嵌套,且不会触发FROM和MAINTAINER指令
    ●使用包含ONBUILD指令的Dockerfile构建的镜像应该使用特殊的标签,例如ruby:2.0-onbuild
    ●在ONBUILD指令中使用ADD或COPY指令应该格外小心,因为新构建过程的上下文在缺少指定的源文件时会失败

    语法:

    ONBUILD [INSTRUCTION]
    这个命令只对当前镜像的子镜像生效。

    比如当前镜像为A,在Dockerfile种添加:

    ONBUILD RUN ls -al
    这个 ls -al 命令不会在A镜像构建或启动的时候执行

    此时有一个镜像B是基于A镜像构建的,那么这个ls -al 命令会在B镜像构建的时候被执行。

注意:尽量让Dockerfile层级少 行数代码越多读写层套接也越多

registry

私有镜像托管

后续补充

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容