计划: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 install  http://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命令   仅仅可以看到bash  ps  两个进程  所以几乎没有资源浪费,十分高效的资源利用率


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下载源码后configure  make   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