Docker

作者: 柘龙义 | 来源:发表于2019-03-12 11:52 被阅读0次

    Docker

    docker 是一个容器软件,能实现类似虚拟机的功能。

    docker 和 虚拟机对比

    docker 比虚拟机更轻量,资源利用率更高,搭建更加简单,特别在微服务方面更加的适用
    

    docker概念

    container #镜像运行的环境,一个镜像一个容器
    services # 启动一个服务,能设置port,使用stacks启动service,用于docker集群
    

    docker架构

    docker cli

    image.png

    docker frame

    Dockerfile

        # 构建简单的dockerfile
        FROM ubuntu #基础镜像
        WORKDIR /root #工作路径
        COPY . /app #复制当前目录下所有东西到app
        RUN command #在容器里面运行命令
        EXPOSE 80 # 暴露端口
        ENV A 1 # 设置环境变量
        CMD ["sleep", "1000"] # 执行命令
    

    docker build

    docker build -t ubuntu:v1.0 -f path 
    .dockerignore # 里面使用正则表达式,里面的文件在add或者copy的时候忽略掉(注释除外)
    

    docker file detail command

        #lable
        ## 打标签
        ## run
        # docker run 编译的时候执行命令,执行格式为/bin/sh -c 当使用管道(echo 1 | cat)需要写成RUN set -o pipefail && echo 1 | cat
        ## cmd
        # CMD ["executable", "param1", "param2"…]
        ## expose
        # expose 80。开放容器类的端口,这里比较重要,这里并不是主机和容器映射,只是开放了端口,使用-P的时候会随机选取主机的一个端口来映射
        # copy or add
        ## copy file path 复制文件,add复制压缩包,能够自动解压,但是add不建议使用
        # enterpoint and cmd
        ##  enterpoint 这个命令如果有,那cmd会加到enterpoint后面,运行docker run的命令也会加到后面
        # volume
        ## volume path 挂载目录,这里会挂在相同的目录
        # user
        ## user root|non-root 设置执行命令的用户
        # workdir
        ## workdir path 设置工作路径
        # onbuild
        ## onbuild run xx 别的镜像以这个镜像为原型时,build之前需要执行的命令,可以设置安全等东西
        # stopsignal
        ## stopsignal sigkill容器退出的时候应该执行的linux signal
        # arg
        ## arg user[=1]定义dockerfile中的变量
        # healthcheck
        ## HEALTHCHECK [optional] CMD "command" 容器启动后的健康检查
        # shell
        ## shell command cmd的另一种方式
    

    dockerfile multi-stage

    # First stage: complete build environment
    FROM maven:3.5.0-jdk-8-alpine AS builder
    # add pom.xml and source code
    ADD ./pom.xml pom.xml
    ADD ./src src/
    # package jar
    RUN mvn clean package
    
    # Second stage: minimal runtime environment
    From openjdk:8-jre-alpine
    # copy jar from the first stage
    COPY --from=builder target/msb-1.0.jar msb.jar #这里--from指定基础容器,相当于把frist stage编译成Builder,然后运行,在将容器里面的target/msb-1.0.jar copy到现在的msb.jar
    # run jar
    CMD ["java", "-jar", "msb.jar"]
    

    docker-compose

        # docker-compose.yaml
        version: "3"
        services:
          web:
            image: ubuntu:v1.0
            deploy:
              replicas: 2
              resources:
                limits:
                  cpus: "0.1m"
                  memory: 150M
              restart_policy:
                condition: on-failure
            ports:
              - "8080:8080"
            networks:
              - webnet
        networks:
          webnets:  
    

    docker-compose deploy

    docker stack deploy -c docker-compose.yml testserver #开始
    docker stack rm testserver # 删除
    

    docker user tip

    #运行一个镜像,
    # -it 以交互模式运行,适合需要debug的时候使用,
    # --rm退出容器之后删掉容器,默认不会删掉,只是状态会变成exit
    # -p port 映射端口到主机,容器和主机端口一样
    # -p hostport:containerport 可以指定映射
    # -P 将端口随机映射到主机,dockerfile中指定
    # images_name:version 是你的镜像名字
    # command 是要执行的命令,bash或者sh能进入终端
    docker run -it --rm [-p port | -p hostport:containeport | -P] images_name:version command 
    
    # 操作容器
    docker ps [-a] # 查看容器,-a 会把已经退出的容器显示出来
    docker logs container-id # 查看容器log,一般容器出错了需要查看
    docker stop container-id # 停止一个容器
    docker rm container-id # 删除容器,需要先停止
    docker commit container-id image_name:verison # 把一个容器提交成镜像,制作镜像的一种新方式
    
    # 操作镜像
    docker images # 查看已有的所有镜像
    docker rmi image_name # 删除一个镜像
    docker tag image_name image_name1 # 给镜像打tag,相当于rename,制作固定名字镜像的一种方式
    docker save image_name > file_path # 将镜像保存为tar包
    docker load < file_path # 将tar包解析成image,save load适用于本地安装镜像
    
    # 认证登录
    docker login register-url # 注册,根据提示输入即可
    docker logout register-url # 退出,自动清除$HOME/.docker/config里的内容
    

    docker problem

    • docker pull 镜像很慢
    curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://4e70ba5d.m.daocloud.io
    systemctl restart docker
    
    • docker login and register url is http
     vi /etc/docker/daemon.json
    {
    "registry-mirrors": ["http://设置的hostname"],
    "insecure-registries" : ["http://设置的hostname"] 这里是添加http安全规则
    }
    systemctl restart docker
    
    • docker login and cannot store certification
      可能是装了go的一个模块(我的出错原因是这个)
      apt purge golang-docker-credential-helpers
    

    总结

    打包新镜像的三种方式
    docker tag 针对镜像
    docker commit 针对容器
    dockerfile 针对镜像
    

    相关文章

      网友评论

          本文标题:Docker

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