Docker基本操作及问题

作者: 老鼠AI大米_Java全栈 | 来源:发表于2019-10-12 10:17 被阅读0次

    现在很多云服务都容器化了,需要提供docker镜像直接运行,所以需要对docker基本命令及一些常见的问题整理下。

    docker源配置

    docker若需要下载一些基类镜像,需要先配置源,如下:

    {
     "registry-mirrors": ["https://mhdffum4.mirror.aliyuncs.com","https://docker.mirrors.aliyuncs.com","https://registry.docker-cn.com","https://mirror.ccs.tencentyun.com"]
    }
    

    其中https://mhdffum4.mirror.aliyuncs.com是私有镜像库。
    配置了源后就可以拉取相关镜像及操作了,如:
    拉取镜像:docker pull nginx
    查看镜像:docker images
    查看容器:docker ps -a
    运行:docker run --name nginx-test -p 8081:80 -d nginx,浏览器中打开 http://127.0.0.1:8081/
    停止:docker stop container-id 或强制 docker kill container-id
    启动:docker start container-iddocker restart container-id
    停止所有容器:docker stop (docker ps -a -q)** 删除所有容器:**docker rm(docker ps -a -q)
    删除镜像:docker rmi <image id>
    删除所有镜像: docker rmi $(docker images -q)

    查看日志:docker logs -f -t --tail 100 container-id
    交互:docker run -i -t yw-eureka:1.0 /bin/bash
    若使用alpine版本,交互:docker run -i -t yw-eureka:1.0 /bin/sh
    注意:若无权限可以加上--privileged=true 如:docker run --name ng-test -p 8089:8761 --privileged=true yw-eureka:1.0
    若删除untagged images,即id为<None>的images
    docker rmi $(docker images | grep "^<none>")

    Dockerfile创建镜像

    创建镜像一般是使用dockerfile,它可以将一系列的操作放到一起执行,同时也可以基于一个基类镜像,如:

    # 基类镜像,一般使用openjdk:8-jre-alpine openjdk:8u191-jre-alpine3.9较小
    FROM java:8
    # 工作目录
    WORKDIR /app
    #在容器中创建挂载点,可以多个
    VOLUME ["/tmp","/log","/logs"]
    # 声明容器端口
    EXPOSE 8761
    # 复制文件
    COPY ./*.zip /app/app.zip
    COPY ./start.sh /app/start.sh
    # 时区
    RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    RUN echo 'Asia/Shanghai' >/etc/timezone
    # 解压
    RUN unzip *.zip && rm -rf *.zip
    # 执行
    CMD ["sh", "/app/start.sh"]
    

    上面的代码即可以创建一个镜像,先要拉取基类镜像,然后创建工作目录,复制文件及执行。
    执行命令创建镜像:docker build --rm -t yw-eureka:1.0 .
    创建镜像成功,可以使用docker images查看,可以使用命令启动镜像,如下
    docker run --name ng-test -p 8089:8761 --privileged=true yw-eureka:1.0

    • name 启动名称
    • p 端口映射,左-外端口,右-内端口
    • privileged 设置权限
    • yw-eureka:1.0 容器名称+版本号
      注意:不一定运行成功,可以使用RUN命令打印日志或进入容器查看文件部署是否正确。
      若运行失败,再次运行会提供名称冲突,应该删除之前的容器,如docker rm container-id
      删除所有容器:docker rm $(docker ps -a -q) -f, -f是强制

    相关脚本文件如下:

    cd "$(dirname "$0")"
    java -jar eureka-server-1.0-SNAPSHOT.jar
    

    镜像时区

    所有基于 alpine 的镜像使用的都是默认时区,因此在使用时,要对时区进行修改
    首先可以进入 alpine 的镜像(默认 /bin/sh)查看日期:

    [root@k8s-master openjdk8]# docker run -i -t --rm alpine:3.9
    / # date -R
    Thu, 14 Feb 2019 05:59:48 +0000
    

    在前面进入的容器中,按顺序执行下面的命令:

    # 安装时区设置
    apk add tzdata
    # 复制上海时区
    cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    # 指定为上海时区
    echo "Asia/Shanghai" > /etc/timezone
    # 验证
    date -R
    # 输出,和当前时间对比
    Thu, 14 Feb 2019 14:01:02 +0800
    # 删除其他时区配置,节省空间
    apk del tzdata
    

    通过实验发现该方法可行,下面针对镜像(而不是镜像实例)进行修改。

    重新创建新的镜像并设置时区,如下:

    FROM alpine:3.9
    
    # 设置时区为上海
    RUN apk add tzdata && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
        && echo "Asia/Shanghai" > /etc/timezone \
        && apk del tzdata
    

    保存为 Dockerfile 文件,在 Dockerfile 目录执行命令构建镜像:

    docker build -t alpine-sh:3.9 .
    

    通过上述方式创建后的镜像仍然很少,而且是符合需要的时区。

    基于 alpine 的其他镜像的修改

    例如 openjdk:8u191-jre-alpine3.9 是一个基于 alpine 的镜像。(注:java从191版本完美支持docker)

    openjdk:8u191-jre-alpine3.9 Dockerfile 地址:
    https://github.com/docker-library/openjdk/tree/d93be18f4f2d5e8457169cac00e559d953b6028e/8/jre/alpine

    FROM alpine:3.9
    # Default to UTF-8 file.encoding
    ENV LANG C.UTF-8
    
    # add a simple script that can auto-detect the appropriate JAVA_HOME value
    # based on whether the JDK or only the JRE is installed
    RUN { \
            echo '#!/bin/sh'; \
            echo 'set -e'; \
            echo; \
            echo 'dirname "$(dirname "$(readlink -f "$(which javac || which java)")")"'; \
        } > /usr/local/bin/docker-java-home \
        && chmod +x /usr/local/bin/docker-java-home
    ENV JAVA_HOME /usr/lib/jvm/java-1.8-openjdk/jre
    ENV PATH $PATH:/usr/lib/jvm/java-1.8-openjdk/jre/bin:/usr/lib/jvm/java-1.8-openjdk/bin
    
    ENV JAVA_VERSION 8u191
    ENV JAVA_ALPINE_VERSION 8.191.12-r0
    
    RUN set -x \
        && apk add --no-cache \
            openjdk8-jre="$JAVA_ALPINE_VERSION" \
        && [ "$JAVA_HOME" = "$(docker-java-home)" ]
    

    在 openjdk:8u191-jre-alpine3.9 镜像中的时区也存在问题, 修改如下:

    FROM openjdk:8u191-jre-alpine3.9
    
    # 设置时区为上海
    RUN apk add tzdata && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
        && echo "Asia/Shanghai" > /etc/timezone \
        && apk del tzdata
    

    所有基于 alpine 的镜像都可以采用类似的方法进行修改。

    其它系统

    例如 Docker 官方提供的 mysql

    https://github.com/docker-library/mysql/tree/master/5.6

    可以先进系统看时区,以及是否存在时区的配置文件,存在的情况下,直接修改即可。示例如下:

    FROM 10.10.1.243:5000/mysql:5.6.43
    RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone
    

    发布到docker hub

    1. 查看images
    [root@localhost disconf]# docker images
    REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
    yw-erueka                    1.0                 dac91b8ba273        3 days ago          675MB
    
    1. 注册一个docker hub账号
      官网地址https://hub.docker.com/
    2. 给image打上标签
    #docker tag image:tag  dockerID/imageName:version
    docker tag yw-erueka:1.0 mapbar/yw-erueka:latest
    
    1. 登录你的docker hub
    [root@localhost war]# docker login
    Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
    Username: mapbar
    Password: 
    WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
    Configure a credential helper to remove this warning. See
    https://docs.docker.com/engine/reference/commandline/login/#credentials-store
    
    Login Succeeded
    
    1. 上传到docker hub
    docker push mapbar/yw-erueka:latest
    

    docker端口映射异常
    [NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2186:ZooKeeperServer@922] - Refusing session request for client
    被这个问题折腾了半天,还费力改了容器通信端口及zk默认端口(容器通信端口不会与宿主机冲突),还是报错,结果重启docker服务(service docker restart)一切ok。

    相关文章

      网友评论

        本文标题:Docker基本操作及问题

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