Docker基本操作及问题

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

docker源配置

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

# cat /etc/docker/daemon.json 
{
 "registry-mirrors": ["https://dchmn2n9.mirror.aliyuncs.com","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 exec -it codepushserver /bin/sh (注意sh/bash)
交互: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>")

出错重启:docker run -d --restart=always bba-208
docker run -d --restart=on-failure:10 bba-208

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 --restart=always 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。

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

推荐阅读更多精彩内容

  • 一、Docker 简介 Docker 两个主要部件:Docker: 开源的容器虚拟化平台Docker Hub: 用...
    R_X阅读 4,384评论 0 27
  • 《Docker从入门到实践》阅读笔记 原书地址: https://yeasy.gitbooks.io/docker...
    GuoYuebo阅读 11,367评论 1 39
  • 五、Docker 端口映射 无论如何,这些 ip 是基于本地系统的并且容器的端口非本地主机是访问不到的。此外,除了...
    R_X阅读 1,747评论 0 7
  • 0x01 核心概念 Docker镜像类似于虚拟机镜像,可以理解为一个面向Docker引擎的只读模板,包含了文件系统...
    闲云逸心阅读 4,709评论 0 9
  • linux 查看系统版本确认使用的docker版本 uname -a --查看Linux内核版本命令cat /pr...
    只有香如故阅读 1,215评论 1 4