docker概念总结

2018/03/02 docker

镜像(Image)

  • docker中的Image是由Dockerfile文件build而来(build时通过-t来指定Image的tag,如docker build -t REPOSITORY:tag path/to/Dockerfile,常用的镜像分两种:一种是常驻内存的程序,一种是命令行的工具),也可直接从注册中心(Registry(私有的),用于存储Image)/dockerhub(公开的)直接拉取(docker pull REPOSITORY:tag)。生成/获取的Image可通过docker image ls或docker images查看(REPOSITORY(名称),TAG(标签/版本),IMAGE ID(镜像ID)),最后通过docker run REPOSITORY:tag启动Image
  • Dockerfile文件中的每一行对应Image中的每一层(Image是分层的,可通过docker history imageID查看),Image中的每一层通过添加、删除文件可成为一个新的Image
  • 不同的Image可共享相同的层(layer)
  • Image本身是只读的

不同Base Image(用户空间)(Ubuntu Image/Centos Image/Debian Image)(rootfs)共享Linux Kernel(bootfs)(内核空间),不同Base Image之上又有不同的自定义的Image。具体如下图:

png

补充:

  • dockerhub(类似github)
    • 登陆:docker login
    • 镜像发布:docker (image) push [OPTIONS] NAME[:TAG] [flags] (不推荐) 或者通过将github(放Dockerfile)与dockerhub(根据关联的Dockerfile自动build成相关Image)关联(推荐)
    • 镜像拉取:docker pull
  • Registry(私有的dockerhub,无web界面,可通过api访问相关信息)
    • 首先在dockerhub上搜索registry
    • Run a local registry(在一台远程服务器上创建container,运行起来后相当于一个web服务器,可往里面push/pull镜像 -d 表示后台运行,–name registry 表示指定容器的别名(name)): docker run -d -p 5000:5000 –restart always –name registry registry:2
    • 本地机器通过ping及telnet确保可访问到正在运行registry的远程服务器
    • 然后重新build镜像(镜像名称为远程服务器的ip:port/REPOSITORY)
    • docker push image(push前需依次做如下操作)
      • 在/etc/docker目录下的daemon.json中添加配置:{‘insecure-registries’:[‘ip:port’]}
      • 编辑docker service的启动文件:sudo vim /lib/systemd/system/docker.service -在[Service]中的ExecStart后面添加如下项:EnvironmentFile=-/etc/docker/daemon.json
      • 重启docker服务:sudo service docker restart
    • push后的image可通过docker registry api查询或pull来验证

容器(Container)

  • 通过Image创建(docker run –memory=200M –cpu-shares=10 –name=test1 Image –cpu1 –vm 1 –verbose –vm-bytes 500M) [说明:–memory限定容器使用的内存 –cpu-shares限定容器使用的cpu],在运行容器时通过指定参数来分配资源
  • 在Image Layer(只读层)之上建立(多了)一个container layer(读写层)
  • 类比类(Image)和实例(container)
  • Image负责app的存储和分发,container负责运行app

常用命令

docker的命令分为Management Commands(管理docker中的对象,如Image、container等)和Commands(提供简单的操作方法)两组

  • 查看当前本地正在运行(常驻内存的进程)的容器:
    • docker container ls (等价于docker ps)
  • 进入运行的container里面查看:
    • docker exec -it containerID /bin/bash
  • 停止运行中的容器:
    • docker (container) stop containerID/name
  • 启动停止的容器:
    • docker start containerID/name
  • 查看容器的详细信息(id/状态/主机/网络等信息):
    • docker inspect containerID/name
  • 查看容器运行时的日志信息:
    • docker logs containerID
  • 查看当前本地正在运行的以及退出(停止运行)的容器:
    • docker container ls -a (等价于docker ps -a)
  • 查看当前本地正在运行的以及退出(quit)的容器的containerID:
    • docker container ls -aq
  • 交互式运行镜像:
    • docker run -it ImageID /bin/bash
  • 删除退出的容器:
    • docker container rm containerID (说明:docker rm containerID 默认删除container,而docker rmi 删除image对应的ID)
  • create a new image from a container’s changes (构建Image-不推荐)
    • docker (container) commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] [flags]
  • build an image from a Dockerfile(构建Image-推荐)
    • docker image build [OPTIONS] PATH | URL | - [flags]

dockerfile

dockerfile中的常见语法(关键字)总结

  • FROM(一般用于dockerfile中的开头,尽量使用官方的image作为base image)
    • FROM scratch # 制作base image
    • FROM centos # 使用base image
    • FROM ubuntu:14.04
  • LABEL(定义了Image的metadata)
    • LABEL maintainer=’’
    • LABEL version=’’
    • LABEL description=’’
  • WORKDIR(切换到某个目录(相当于cd),如果没有会自动创建。说明:1、用WORKDIR,不要用RUN cd;2、尽量使用绝对目录)
    • WORKDIR /test # 将当前工作目录切换到/test,如果没有会自动创建test目录
    • WORKDIR demo
    • RUN pwd # 输出结果为 /test/demo
  • ADD and COPY(将本地文件添加到Image里面。说明:1、大部分情况,COPY优于ADD;2、ADD除了COPY还有额外的解压功能;3、添加远程文件/目录请使用curl或wget)
    • ADD hello /
    • ADD test.tar.gz / # 添加到根目录并解压
    • WORKDIR /root
    • ADD hello test/ # /root/test/hello
    • WORKDIR /root
    • ADD hello test/ # /root/test/hello
  • ENV(设定环境变量)
    • ENV MYSQL_VERSION 5.6 # 设置常量
    • RUN apt-get install -y mysql-server=’${MYSQL_VERSION}’ \ && rm -rf /var/lib/apt/lists/* # 引用常量
  • VOLUME and EXPOSE(存储和网络)

  • RUN(执行命令并创建新的Image Layer。为了美观,复杂的RUN请用反斜线换行;为了避免无用分层,合并多条命令成一行)
    • RUN yum update && yum install -y vim \

      python-dev # 反斜线换行

  • CMD and ENTRYPOINT(执行命令)
    • CMD:1、容器启动时默认执行的命令和参数 (docker run image);2、如果docker run指定了其他命令,CMD命令被忽略 (docker run -it image /bin/bash) ;3、如果定义了多个CMD,只有最后一个会执行
    • ENTRYPOINT:1、让容器以应用程序或者服务的形式运行;2、不会被忽略,一定会执行;3、shell脚本可作为entrypoint
    • ENTRYPOINT(放命令)与CMD(接收参数)组合可形成带参数的命令行:
      • ENTRYPOINT [‘/usr/bin/stress’]
      • CMD []
    • shell格式的命令及参数
      • RUN apt-get install -y vim
      • CMD echo ‘hello docker’
      • ENTRYPOINT echo ‘hello docker’
      • Dockerfile1
          FROM centos
          ENV name Docker
          ENTRYPOINT echo 'hello $name'
        
      • 构建镜像:docker build -t dockerHubID/centos-entrypoint-shell .
      • 运行镜像:docker run dockerHubID/centos-entrypoint-shell
    • exec格式的命令及参数
      • RUN [‘apt-get’,’install’,’-y’,’vim’]
      • CMD [‘/bin/echo’,’hello docker’]
      • ENTRYPOINT [‘/bin/echo’,’hello docker’] [‘/bin/bash’,’-c’,’echo hello $name’]
      • Dockerfile2
          FROM centos
          ENV name Docker
          ENTRYPOINT ['/bin/bash','-c','echo hello $name']
        
      • 构建镜像:docker build -t dockerHubID/centos-entrypoint-exec .
      • 运行镜像:docker run dockerHubID/centos-entrypoint-exec

Search

    Post Directory