Docker的镜像和容器

Docker Engine(类似C/S架构)

  • 提供一个后台进程(dockerd),用于维护docker常见的操作比如image、容器、网络、存储的管理
  • REST API Server,中间通过这进行通信
  • CLI接口(docker)

Docker的镜像和容器_第1张图片

底层技术支持

  • Namespaces:做隔离pid,net,ipc,mnt,uts
  • Control groups:做资源限制
  • Union file systems:Container和image的分层

Docker image:

  • 文件和meta data的集合(root filesystem)
  • 分层的,并且每一层都可以添加改变,删除文件,成为一个新的image
  • 不同的image可以共享相同的layer
  • Image本身是read-only的

Docker的镜像和容器_第2张图片

Docker Container

  • 通过Image创建(copy)
  • 在Image layer之上建立一个container layer(可读写)
  • 类比面向对象:类和实例
  • Image负责app的存储和分发,Container负责运行app

 

dockerfile语法及最佳实践

  • FROM scratch #制作base image
  • FROM centos #使用base image

例如:FROM centos 或FROM ubuntu:14.04

FROM 尽量使用官方的image作为base image!

LABEL:定义了image的Metadata #LABEL有点类似代码中的注释

  • LABEL maintainer="[email protected]
  • LABEL vesion="1.0"
  • LABEL description="This is description"

RUN 一般运行一些命令

RUN为了美观,复杂的RUN请使用反斜杠换行,避免无用分层,合并多条命令成一行!

例如多条命令,则使用&&。 RUN yum update && yum install -y vim \

python-dev

WORKDIR设定当前工作目录的。

WORKDIR /ROOT

WORKDIT /test #如果没有这个目录会自动创建test目录

WORKDIR demo

RUN pwd #输出结果应该是/test/demo

注意:使用WORKDIR,不要用RUN cd!不推荐的

尽量使用绝对目录路径,不要使用相对路径

 

ADD and COPY

ADD hello /

ADD test.tar.gz/ #添加到根目录并解压缩

WORKDIT /root

ADD hello test/ #/root/test/hello

WORKDIR /root

COPY hello test/

ADD与COPY的区别,ADD可以添加文件到指定目录,还可以解压缩

大部分情况下,COPY优先于ADD使用,ADD除了COPY还有额外功能(解压)

添加远程文件/目录请使用curl或者wget

ENV 设定环境变量

ENV MYSQL_VERSION 5.6 #设定常用变量

RUN yum -y install mysql-server= "${MYSQL_VERSION}" && rm -rf /var/lib/apt/lists/* #引用常用变量

ENV尽量使用增加可维护性

VOLUME and EXPOSE 主要用于存储和网络(后面章节讲)

CMD and ENTRYPOINT (后面章节讲)

RUN:执行命令并创建新的Image Layer

CMD:设置容器启动后默认执行的命令和参数

ENTRYPOINT:设置容器启动时运行的命令

Shell格式

RUN yum -y install vim

CMD echo "hello docker"

ENTRYPOINT echo "hello docker"

Exec格式

RUN [ "yum" , "-y" , "install" , "vim"]

ENV name Docker

ENTRYPOINT ["/bin/echo" , "hello $name" ]

Docker的镜像和容器_第3张图片

新建exec

Docker的镜像和容器_第4张图片

发现上图打印是hello $name,并没有将我们定义的变量内容打印出来

Docker的镜像和容器_第5张图片

修改Dockerfile之后再新建与运行

Docker的镜像和容器_第6张图片

CMD:

  • 容器启动时默认执行的命令
  • 如果docker run指定了其他命令,CMD命令被忽略
  • 如果定义了多个CMD,只有最后一个会执行

docker run [image] 输出?

Docker run -it [image] /bin/bash输出?

ENTRYPOINT

  • 让容器以应用程序或服务的形式运行
  • 不会被忽略,一定会自行
  • 最佳实践:写一个shell脚本作为entrypoint

copy docker-entrypoint.sh /usr/local/bin/

ENTRYPOINT ["docker-entrypoint.sh"]

EXPOSE 27017

CMD ["mongod"]

docker rm $(docker ps -qa) #删除所有docker ps -a运行的容器,包含过期与当前运行的

Docker的镜像和容器_第7张图片

CMD是直接打印出hello Docker,但是运行时,在后面加/bin/bash则会进入这个容器

Docker的镜像和容器_第8张图片

 

docker 仓库

Docker的镜像和容器_第9张图片

在lc001上telnet lc002的5000端口

Docker的镜像和容器_第10张图片

在lc001上指定本地仓库

Docker的镜像和容器_第11张图片

可以用浏览器去访问http://192.168.40.151:5000/v2/_catalog,未发现有hello-world

Docker的镜像和容器_第12张图片

Push 到仓库lc002

登录浏览器去看

Docker的镜像和容器_第13张图片

 

你可能感兴趣的:(Docker/K8S)