计划: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 p_w_picpaths
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}
返回一个p_w_picpath_id信息
可以使用我们创建的心p_w_picpath启动一个容器:
docker run -t -i ${REPOSITORY}:${TAG} /bin/bash
5、创建Docker镜像:
使用Dockerfile:
注:除了注释意外,每一行命令,算是一层,docker镜像创建命令不能超过127层
mkdir p_w_picpath_maker_sinatra
cd p_w_picpath_maker_sinatra
touch Dockerfile
例:
#this is comment
FROM ubuntu:14.04
MAINTAINER Docker Newbee
RUN apt-get -qq update
RUN apt-get -qqy install ruby ruby-dev
RUN gem install sinatra
语法解析:
注释:#注释一行
以哪个p_w_picpath为基板: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 p_w_picpaths ${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}}" )
步骤操作:
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