Docker - 基础介绍

改变后台服务开发以及维护的模式

2017-03-05 | 阅读

Docker是一个 开源的容器化技术,Docker可以为任何应用创建一个轻量级的、可移植的、自给自足的容器,是基于Go语言实现的开源项目。号称build once,configure once and run anywhere

Docker中有3个基本要素:

  • Docker Containers : 负责应用程序运行的容器,包含了操作系统,用户添加的文件以及元数据。
  • Docker Images : 容器的只读版本, 也就是镜像。
  • DockerFile : 文件指令集,用来说明如何自动创建Docker镜像。

Docker有3个组件:

  • Docker Clinet 用户界面,用于与Docker Daemon进行通信
  • Docker Daemon 运行与主机上, 处理服务请求。
  • Docker Index 中央 registery ,也就是镜像的仓库。

这个系统大致是这样的 :

而Docker系统中, 高级的内容,在于使用以下三个操作系统的功能来提高容器性能:

  • Namespace : 充当隔离的第一级,确保一个容器中运行的一个进程不会看到或者影响容器外的其他进程。
  • Control Groups : 是LXC的重要组成部分,具有资源核算和限制的关键功能。
  • UnionFS : 作为容器的构建块, 为了支持Docker轻量级和速度快的特点,创建了用户层。

对于用户来说, 一般常见使用Docker ,有两个基本步骤 :

  1. 构建一个镜像。
  2. 运行容器。

而用户操作的是 Docker Clinet也就是客户端, 客户端去通知Docker Daemon需要创建的镜像以及在容器中运行的命令。

对于镜像, 所有镜像都来源于基本的镜像, 然后在基本的镜像上可能通过Dockerfile的指令来创建模板。镜像来自于docker 仓库, 用户也可以推送自己的镜像到仓库中,或者创建自己的镜像仓库。

常用命令

查看docker 信息,判断是否安装正确。

docker info 

查看帮助 :

docker help

查看当前镜像列表

docker images 

停止容器

docker stop

重启容器

docker restart

删除容器

docker rm

下载镜像

docker pull openresty/openresty:centos

查找镜像

docker search

保存镜像

docker commit

查看当前运行中的容器:

docker ps

查看容器的root用户密码

docker logs <容器名orID> 2>&1 | grep '^User: ' | tail -n1

查看容器日志

docker logs -f <容器名orID>

以交互式命令行来运行容器:

 docker exec -i -t 2b5e40c97527 /bin/bash 

但是想要在运行shell脚本时,是在容器中修改, 而之后再次运行的是镜像, 所以想让运行中的容器生成新的镜像,就必须使用 docker commit xx容器 xx镜像来提交修改,生成一个本地的镜像文件。

移动与加载镜像文件 :

docker save busybox-1 > /home/save.tar
// 加载
docker load < /home/save.tar

以dockfile来创建镜像

docker build -t <镜像名> <Dockerfile路径>
//如果dockerfile在当前文件,且命名为Dockerfile
docker build -t xx/gitlab .

从容器中拷贝文件出来:

sudo docker cp 7bb0e258aefe:/etc/debian_version .

运行一个容器

docker run 

运行时进行命名,端口映射,文件夹映射:

docker run --name redmine -p 9003:80 -p 9023:22 -d -v /var/redmine/files:/redmine/files -v /var/redmine/mysql:/var/lib/mysql sameersbn/redmine

后台运行(-d)且暴露端口(-p),

docker run -d -it -p 8079:80 pictrix  /bin/openresty  -g 'daemon off;'

docker私有仓库搭建

下载镜像

docker pull registry

运行

docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry

这里/opt/data/registry是指将本地的一个目录挂载到容器内的/tmp/registry下,也就是仓库的镜像最终会不是存在容器内,而是系统中。

测试一下, 创建一个镜像。

在仓库创建tag 。

docker tag xxximage 私有仓库ip:5000/xxximage

上传到私有仓库

docker push 私有仓库ip:5000/xxximage

从私有服务器下载镜像时:

docker pull 私有仓库ip:5000/xxximage

事实上我们看到, 这个远程仓库, 只负责文件传输的功能。Docker主要功能在于容器化,仓库仅仅做一些鉴权和文件存放的功能。

docker 在centos上安装

  1. 首先, 官网要求你们把所有包都升级一下:

     sudo yum update
    
  2. 添加docker的repo

     $ sudo tee /etc/yum.repos.d/docker.repo <<-'EOF'
     [dockerrepo]
     name=Docker Repository
     baseurl=https://yum.dockerproject.org/repo/main/centos/7/
     enabled=1
     gpgcheck=1
     gpgkey=https://yum.dockerproject.org/gpg
     EOF
    
  3. 安装Docker

     yum install docker-engine
    
  4. 开启服务

     systemctl enable docker.service
     systemctl start docker
    
  5. 通过安装一个测试 image来判断docker是否正确安装

     docker run --rm hello-world
    

Dockerfile

Docker的自动化主要通过dockerfile来实现。Dockerfile包含创建镜像所需要的全部指令,基于Dockerfile中的指令,我们可以使用Docker build来创建镜像,通过减少镜像和容器的创建过程来简化部署。

Dockerfile支持语法格式为 INSTRUCTION argument, 指令不区分大小写,但是命名约束为大写。

所有Dockerfile都必须以FROM指令开始,指定镜像基于哪个基础镜像来创建。FROM可以多次使用,表示创建多个镜像。具体用法为FROM <image name> 如 :

FROM ubuntu

指基于主干Registry中的ubuntu基础镜像来进行构建的。Dockerfile常用的命令如下:

MAINTAINER : 设置镜像的作者。参数为作者名。

RUN : 在shell或者exec环境下执行的命令,RUN可以在新创建的镜像上添加新的层面,提交的结果用在下一条指令中。RUN <command> . 这里是指基于镜像,每次使用RUN等命令,都会往镜像内做一些修改,然后就形成了中间的缓存部分,以促进下一次命令执行的效率。

ADD : 复制文件指令。 ADD <source> <destination> ,源可以是URL,也可以是启动配置上下文中的一个文件,即docker命令运行所在处的文件,即本地。 而destination为容器内的路径。

CMD : 提供了容器默认的执行命令。 Dockerfile只允许执行一次CMD指令,如果有多条,只有最后一条生效,其主用功能是确定此镜像的主要功能,如CMD nginx 表示一个Docker镜像主要是提供一个nginx的服务。 有三种形式:

CMD ["executable","param1","param2"]
CMD ["param1","param2"] // 命令由外部执行
CMD command param1 param2

当使用run命令运行时,会匹配CMD,然后替换其命令,如 Dockerfile中设置 :

CMD echo hello world

而运行命令

docker run centos-cmd echo byebye

run中的命令会覆盖CMD中的命令,只会输出byebye

EXPOSE : 指定容器在运行时,监听的接口

ENTRYPOINT : 配置给容器一个可执行的命令,每次使用镜像创建容器时,一个特定的应用程序可以被设置为默认程序。不会如CMD那样被替换。

WORKDIR : 指定RUN ,CMDENTRYPOINT命令的工作目录

ENV : 设置环境变量。

USER : 镜像运行时设置一个UID.

VOLUME : 授权访问从容器到主机上的目录。

Dockerfile最佳实践

使用缓存 ,Dockerfile的每条指令都会将结果提交为新的镜像,下一个指令将会基于上一步指令的镜像的基础上构建,如果一个镜像存在相同的父镜像和指令(除了ADD),Docker将会使用镜像,而不是执行指令,即构建时的镜像缓存。

为了利用缓存,要保持Dockerfile一致,并且尽量在末尾修改。

构建镜像时,尽量使用标签

docker build -t="testforwhat" .

Docker的核心概念为可复制和可移植,镜像应该可以运行在任何主机上并且运行尽可能多的次数。所以在Dockerfile中,不应该去映射公有端口。

使用CMDENTRYPOINT时,尽量使用数组语法,使用普通语法时如:

CMD /bin/echo

实际所有命令前会被加上/bin/sh -C

Dockerfile的意义,是将容器初始化创建,通过文件固定下来,而下次修改时,只需要修改Dockerfile中的内容,保持镜像构建的稳定性

Docker Registry

Registry是仓库,在这里 需要注册账号

Docker Registry中有三个角色:

index : 负责维护有关的用户账号,镜像校验和公共命名空间等信息。

registry : 是镜像和图表的仓库。

registry: 本地的Docker作为客户端来负责维护和拉取的工作。

而使用和推送到主干仓库 :

# 首先登录账号 :
docker login --username=dockerwhat --password=xxxx
#对一个本地的image,打上tag
docker tag test imagetrick:lastest
# 推送到远程
docker push  dockerwhat/imagetrick:lastest