wuliws 发表于 2018-5-28 12:44:56

Docker 学习笔记【1】Docker 相关概念,基本操作

  计划:Docker 学习笔记【2】 Docker 基础操作实操记录,Docker仓库、数据卷,网络基础学习---40
  

  注:所有操作在root下执行
  

  --1--概念:
  1、Docker镜像:
  

  
  镜像就是一个只读的模板,用于创建docker容器。
  Docker提供了简单的机制创建或者更新现有镜像,也可以从别处拿来现成镜像直接使用。
  

  2、Docker容器:
  

  
  可以认为是精简版的linux运行环境包含 【root权限,进程空间,用户空间,网络空间等】和应用程序
  另外:镜像是只读的,容器基于镜像启动后创建一层最上层的可写层。
  

  

  3、Docker仓库:
  

  
  如同git,注册服务器就像github一样的托管服务器
  仓库是集中放镜像文件的场所。
  仓库注册服务器,存放多个仓库,每个仓库中存在多个镜像,每个镜像有不通的标签。tag
  

  

  4、公有仓库、私有仓库概念:
  

  公有仓库:
  最大的仓库是Docker Hub
  国内的仓库如Docker Pool
  私有仓库:
  本地网络中创建自己的私有仓库:
  push 将自己制作的镜像上传
  pull 将镜像拉下来使用
  

  --2--安装:
  1、centos6安装:
  

  epel源安装docker
yum installhttp://mirrors.yun-idc.com/epel/6/i386/epel-release-6-8.noarch.rpm
yum install docker-io  

2、centos7安装:


centos-extras已经呆了docker直接安装
yum install docker  

  
--3--启动:
  服务启动:
  

service docker start
chkconfig docker on  


  --4--Docker镜像:
  

  
  镜像就是一个只读的模板,用于创建docker容器。
  Docker提供了简单的机制创建或者更新现有镜像,也可以从别处拿来现成镜像直接使用。
  运行前必须要求本地存在对应镜像,如果没有,即从配置的镜像仓库下载。
  

  1、获取镜像:
  

docker pull ubuntu:12.04  默认配置下,等同于:
docker pull registry.hub.docker.com/ubuntu:12.04  依此推,指定镜像注册服务器的pull为[例中为中国的服务器,会比较快:
docker pull dl.dockerpool.com:5000/ubuntu:12.04  

  2、使用镜像启动一个容器:

  

  
  使用ubuntu:12.04镜像,运行/bin/bash应用
docker run -t -i ubuntu:12.04 /bin/bash  【12.04为标记的发行版本信息,TAG,如果不指定,默认是latest】

  

  3、列出所有本地镜像:
  

docker images  REPOSITORY:来自于那个仓库
  TAG:镜像标记
  IMAGE ID:唯一ID号【不管来自于的仓库是否一样,TAG是否一样,只要ID一样,就是同样的镜像】
  CREATED:创建时间
  VIRTUAL SIZE:镜像体积
  
4、修改已有镜像:
  

  
  比如,在镜像启动的容器中,安装了一些软件或者配置了某些运行环境,如:安装了json
yum install json
exit  此时,容器已经被我们修改了,需要修改此镜像生效,需要提交
  -m message 提交说明信息
  -a 更新的用户信息
docker commit -m "ADDed json" -a "Docker new1109" ${CONTAINER_ID} ${REPOSITORY}:${TAG}  返回一个image_id信息

  可以使用我们创建的心image启动一个容器:
docker run -t -i ${REPOSITORY}:${TAG} /bin/bash  
5、创建Docker镜像:
  

  使用Dockerfile:
  注:除了注释意外,每一行命令,算是一层,docker镜像创建命令不能超过127层
mkdir image_maker_sinatra
cd image_maker_sinatra
touch Dockerfile  例:
#this is comment
FROM ubuntu:14.04
MAINTAINER Docker Newbee <Newbee@docker.com>
RUN apt-get -qq update
RUN apt-get -qqy install ruby ruby-dev
RUN gem install sinatra  语法解析:
  注释:#注释一行
  以哪个image为基板:FROM ${REPOSITORY}:${TAG}
  维护人信息:MAINTAINER ${USER_INFO} <${USER_EMAIL}>
  容器中执行的命令:RUN 后面跟上要在镜像启动的容器中执行的命令
  复制本地文件到镜像中:ADD MYapp /var/www
  开放容器某个端口对外:EXPOSE 80
  容器启动后执行的程序:CMD ["/usr/sbin/apachectl","-D","FOREGROUND"]
  在Dockerfile所在目录执行
docker build -t "${REPOSITORY}:${TAG}".  即可创建一个镜像
  -t:指定创建镜像的tag信息
  .:表示Dockerfile所在的目录【目前是同一目录,因此使用.】
  使用openvz【容器虚拟化的先锋技术】openvz的模板下载地址为:
http://openvz.org/Download/template/precreated  下载一个镜像,比如:ubuntu-14.04-x86_64-minimal.tar.gz

cat ubuntu-14.04-x86_64-minimal.tar.gz | docker import - ubuntu:14.04
docker push ouruser/sinatra  

  6、docker导出、导入镜像到:
  

docker save -o ubuntu_14.04.tar ubuntu:14.04
docker load --input ubuntu_14.04.tar 或者 docker load < ubuntu_14.04.tar  

  
7、修改镜像的TAG:
  

docker tag ${ID} ${REPOSITORY}:${TAG}
docker images${REPOSITORY}  
8、删除镜像:
  

docker rmi ${REPOSITORY}:${TAG}  重要:
  docker rm 是删除依赖于这个镜像所有的docker容器的命令
  docker rmi执行前,需要先执行docker rm
  

  

  9、镜像学习扩展:

  

  
  Docker如何实现增量修改和维护:
  每个镜像由很多层次构成,通过Union FS 将这些不通的层结构结合到一个镜像中去
  Union FS通常有两个用途:
  1、可以实现不借助lvm、RAID技术,将多个磁盘挂在在同一目录下
  2、较常用的功能是将一个只读分支和一个可写分支联合在一起
  


  --5--Docker容器:
  

  容器是独立运行的一个或者一组应用。对比起来,虚拟机就是模拟运行一整套操作系统,以及运行在操作系统中的应用。
  

  1、启动容器【从镜像新建】:
  

  
  新建并启动容器,主要命令是 docker run
  比如,使用:
docker run ubuntu:14.04 /bin/echo "what's your name"  含义为:使用ubuntu这个repository中tag为14.04的镜像启动一个容器,运行的应用为/bin/echo "what's your name" 运行速度与在本地执行此命令几乎无差别

docker run -t -i ubuntu:14.04 /bin/bash  含义为:使用ubuntu这个repository中tag为14.04的镜像启动一个容器,运行一个bash终端,并分配一个伪终端,和标准输入进行绑定

  -t:选项让Docker为容器分配一个伪终端(pseudo-tty)并绑定到标准输入,
  -i:让容器的标准输入保持打开
  此时进入了docker中的交互模式,可以使用bash的基本命令,如:pwd ls等
  Docker run时,Docker后台的标准运行流程包括:
  1、检查所使用镜像本地是否存在,存在则使用,不存在则从仓库下载
  2、利用镜像启动一个容器实例
  3、分配一个文件系统,并在只读的镜像层外挂在一层读写层
  4、从宿主主机配置的网桥中桥接一个虚拟接口到容器中去
  5、从ip地址池配置一个ip地址给容器
  6、执行用户指定的应用程序
  7、命令执行完毕后,容器终止
  
2、启动容器【启动一个已终止容器】:
  

  
  启动已经终止的容器,主要命令为:docker start
  容器的核心为所执行的应用程序,所需要的软件资源,就是运行程序所必须的,除此之外,别无其他。
  如 启动bash时,使用ps命令   仅仅可以看到bashps两个进程所以几乎没有资源浪费,十分高效的资源利用率
  
3、守护态运行:
  

docker run -d ubuntu:14.04 /bin/sh -c "while true;do echo what is your name;sleep 1;done"  返回一个id,此为docker容器运行实例的唯一id

  查看运行中的docker实例
docker ps  查看容器输出内容:
docker logs insane_babbage
what is your name
what is your name
what is your name
what is your name
.
.
.  
4、终止运行中容器:
  

  
  注:
  1、docker运行时指定的应用运行完成时,容器自动终止
  2、bash等交互界面下,执行exit或者ctrl+d后,退出bash,bash应用认为运行完成,容器终止
  
docker stop  

  查看已经停止的docker容器实例
  docker ps -a
  可以通过docker start 启动终止状态的容器实例
  可以通过docker restart 重启运行态的容器实例
  
5、进入守护态运行的实例:
  

  
  1>attach
docker run -idt ubuntu
docker ps
docker attach nostalgic_hypatia  缺点:
  1、多个窗口attach到同一个容器的时候,所有操作同步显示
  2、某一个窗口命令阻塞,所有窗口都必须等待。
  

  2>nsenter
  此工具在util-linux包含2.23版本后包含,如果没有该命令,需要手动安装。
  www.kernel.org下载源码后configuremake   make install
  特性:
  1、此工具可以访问另一个进程的名字空间【】,
  2、必须要root权限
  为了连接到守护态容器,需要找到容器第一个进程的PID,例命令:
PID=$(docker inspect --format "{{ .State.PID}}" <container>)  步骤操作:

docker ps   获得CONTAINER ID
docker -pid ${CONTAINER ID} 获得容器第一pid
docker -enter ${CONTAINER ID} ls 在容器中执行一个命令  
  【注意】
  下载 .bashrc_docker 并将内容加到.bashrc中
  wget -P ~ https://github.com/yeasy/docker_practice/raw/master/_local/.bashrc_docker
  echo "[ -f ~/.bashrc_docker ] && . ~/.bashrc_docker" >> ~/.bashrc; source ~/.bashrc
  
  通过这个容器,通过nsenter命令如下方式连接:
nsenter --target ${PID} --mount --uts --ipc --net --pid  


  6、容器实例的导出和导入:
  

  
  1、导出:
docker export ${CONTAINER ID} > ubuntu.tar  2、导入【实际是将容器快照导入为镜像】:

cat ubuntu.tar| docker import - ${REPOSITORY}:${TAG}  此外可以通过url全路径导入

docker import http://example.com/example.tar ${REPOSITORY}:${TAG}  
7、docker load 和docker import区别:
  

  
  1>
  load:导入镜像存储文件到本地镜像库
  import:将容器快照导入到本地镜像库
  2>
  load:保留完整的记录,包括历史记录和元数据信息
  import:仅保留快照时的状态,历史记录,元数据信息等都会丢失
  3>
  load:体积大
  import:体积小
  4>
  load:不可重新制定标签等元数据信息
  import:可以重新制定标签等元数据信息
  

8、删除容器:
  

  
  docker rm 删除一个处于终止状态的容器实例
docker rm trusting_newton  

删除一个运行中的容器实例,容器会收到SIGKILL信号
docker rm -f trusting_newton  
页: [1]
查看完整版本: Docker 学习笔记【1】Docker 相关概念,基本操作