`
maosheng
  • 浏览: 565246 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Docker 容器基础

阅读更多
一.概述

Docker的核心价值在于,他很有可能改变传统的软件“交付”方式和“运行”方式。传统的交付源码或交付软件包的方式的最大问题在于,软件运行期间所“依赖的环境”是无法控制、不能标准化的,IT人员常常需要耗费很多精力来解决因为“依赖的环境”而导致软件运行出现的各种问题。而Docker将软件与其“依赖的环境”打包在一起,以镜像的方式交付,让软件运行在“标准的环境”中,这非常符合云计算的要求。

Docker重新定义了软件开发、测试、交付和部署的流程。我们交付的东西不再只是代码、配置文件、数据库定义等,而是整个应用程序运行环境:“OS+各种中间件、类库、应用程序代码”。

Docker的主要目标是"Build,Ship and Run Any App,Anywhere",即通过对应用组件的封装(Packaging)、分发(Distribution)、部署(Deployment)、运行(Runtime)等生命周期的管理,达到应用组件级别的"一次封装、到处运行"。

这里的应用组件,既可以是一个Web应用,也可以是一套数据库服务,甚至是一个操作系统或编译器。

Docker基于Linux的多项开源技术提供了高效、敏捷和轻量级的容器方案,并且支持在多种主流云平台(Paas)和本地系统上部署。可以说Docker为应用的开发和部署提供了“一站式”的解决方案。

当软件的开发环境、版本管理、交付和运行都以Docker为工具Container为基础进行流转时,就构成了以Container为核心的开发和运维流程,软件的架构也因此发生改变(Micro Service的构架方式可能会因此流行)。

Docker也可以被称为轻量级虚拟化技术。与传统的VM相比,他更轻量,启动速度更快,单台硬件上可以同时跑成百上千个容器。

Dokcer引擎的基础是Linux容器(Linux Containers,LXC)技术。



【Docker组件】

Docker客户端和服务器
Docker容器
Docker镜像
Docker注册中心

Docker镜像:Docker镜像是一个只读的模板。例如,一个镜像可以包含安装了Apache Web服务应用的Ubuntu操作系统。镜像可以用来创建Docker容器。Docker提供了构建新镜像或升级原有镜像的较为便利的方式,或者你也可以下载别人已经创建好的镜像。Docker镜像是Docker的构建组件。

Docker注册中心:Docker注册中心用于上传和下载镜像,分为公共注册中心和私有注册中心两种。公共注册中心为Docker Hub,它提供了大量的现成镜像,你可以构建自己的镜像并上传到上面,也可以在上面下载别人构建的镜像。Docker注册中心是Docker的发布组件。

Docker容器:Docker容器就像是一个文件夹,它包含了一个应用程序运行所需要的所有内容。每个容器都是基于Docker镜像构建。我们可以运行、开始、停止、迁移或者是删除Docker容器。每个容器均是一个隔离的、安全的应用平台。Docker容器是Docker的运行组件。


二.Docker安装

安装前提条件:

1)运行64位的CPU构架的计算机
2)运行Linux3.8或更高版本内核
3)内核必须支持一种适合的存储驱动,默认通常是是Device Mapper
4)内核必须支持并开启cgroup和命名空间(namespace)功能

【CentOS升级kernel3.10.105】
0. yum update
1. rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
2. rpm -Uvh http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm
3. yum --enablerepo=elrepo-kernel -y install kernel-lt
4. vi /etc/grub.conf 修改Grub引导顺序,设置default=0值(从0开始),一般新安装的内核在第一个位置,所以设置default=0
5. reboot


【Ubuntu中安装Docker】

#sudo apt-get install lxc-docker

【RHEL6或CentOS6中安装Docker】

#sudo rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
#sudo yum -y install docker-io

【启动Docker守护进程】

#sudo service docker start

##系统开机时自动启动Docker守护进程
#sudo service docker enable

##确认Docker是否已安装并运行
#sudo docker info

##查看Docker版本号
#sudo docker --version



【停止Docker守护进程】

#sudo service docker stop


三.Docker镜像

Docker镜像是由文件系统叠加而成,最底层是一个引导文件系统(bootfs),第二层是root文件系统(rootfs),root文件系统永远是只读状态,并且Docker利用联合加载技术又会在root文件系统层上加载更多的只读文件系统。

联合加载指的是一次同时加载多个文件系统,但是在外面看起来只能看到一个文件系统,联合加载会将各层文件系统叠加到一起,这样最终的文件系统会包含所有底层的文件和目录。

Docker将这样的文件系统称为镜像。一个镜像可以放到另一个镜像的顶部。位于下面的镜像称为父镜像,可以依次类推,直到镜像栈的最底部,最底部的镜像称为基础镜像。最后,当从一个镜像启动容器时,Docker会在该镜像的最顶层加载一个读写文件系统。我们想在Docker中运行的程序就是在这个得写层中执行。

当Docker第一次启动一个容器时,初始的读写层是空的。当文件系统发生变化时,这些变化都会应用到这一层上。比如,如果想修改一个文件,这个文件首先会从读写层下面的只读层复制到该读写层,该文件的只读版本依然存在,但是已经被读写层中的该文件副本所隐藏,这种机制称为写时复制,这也是使Docker如此强大的技术之一。每个只读镜像层都是只读的,并且以后永远不会变化。当创建一个新容器时,Docker会构建出一个镜像栈,并在栈的最顶端添加一个读写层,这个读写层再加上其下面的镜像层以及一些配置数据,就构成了一个容器。容器是可以修改的,他们都有自己的状态,并且是可以启动和停止的。容器的这种特点加上镜像分层框架,使我们可以快速构建镜像并运行包含我们自己的应用程序和服务的容器。

##拉取镜像:
#sudo docker pull ubuntu[或ubuntu:12.04]

用docker run 命令从镜像启动一个容器时,如果该镜像不在本地,Docker会先从Docker Hub下载该镜像。如果没有指定具体的镜像标签,那么Docker会自动下载latest标签的镜像。

##列出镜像
#sudo docker images

##查找镜像
#sudo docker search [IMAGE]

##删除镜像
sudo docker rmi [REPOSITORY]:[TAG]

sudo docker rmi [IMAGE ID]

##登录Docker Hub
#sudo docker login

##推送镜像
#sudo docker push [user/image]

##探求镜像构建过程
#sudo docker history [REPOSITORY]:[TAG]

sudo docker history [IMAGE ID]

##存出镜像
#sudo docker save -o ubuntu_14_04.tar ubuntu:14.04

##载入镜像
#sudo docker load ubuntu_14_04.tar


四.Docker容器

##Docker帮助命令
#sudo docker help

##Docker命令帮助
#sudo docker [COMMAND] --help
#sudo docker run --help

##列出所有容器,包括运行的和停止的(-a)
#sudo docker ps -a

##创建容器
#sudo docker create -i -t ubuntu:12.04

##运行Docker容器
#sudo docker run --restart=always --name ubuntu_test -P -i -t ubuntu:12.04 /bin/bash
--name: 给容器命名(ubuntu_test)
-i:     STDIN是开启的
-t:     为创建的容器分配一个伪tty终端,并绑定到容器的标准输入上
-d:     以后台方式运行Docker容器
--restart=always[on-failure:5]
标志设置为always,无论容器的退出代码是什么,Docker都会自动重启该容器
标志设置为on-failure,当容器的退出代码为非0值的时候,才会自动重启,on-failure还接受一个可选的重启次数参数

端口随机映射:
docker run -P

端口指定映射:
-p hostPort:containerPort
-p ip:hostPort:containerPort


##停止运行的容器
#sudo docker stop ubuntu_test

#sudo docker stop [CONTAINER ID]

##重新启动停止的容器
#sudo docker start ubuntu_test

#sudo docker start [CONTAINER ID]

##重启容器
#sudo docker restart ubuntu_test

#sudo docker restart [CONTAINER ID]

退出容器但是保持运行:默认情况下,如果使用ctrl-d退出container,那么container也会stop,按ctrl+p+q可以退出到宿主机,而保持container仍然在运行.然后要进入再使用docker attach

Docker进入后台运行的容器

1.使用docker attach命令

##附着到容器上(但是它有一个缺点,只要这个连接终止,或者使用了exit命令,容器就会退出后台运行)
#sudo docker attach ubuntu_test

#sudo docker attach [CONTAINER ID]

2.使用docker exec命令

容器在后台运行(sudo docker run -d ....),可以通过运行exec命令来启动一个bash shell,再次进入到该容器中。

这个命令使用exit命令后,不会退出后台,一般使用这个命令,/bin/sh 是固定写法

#sudo docker exec -it ubuntu_test /bin/sh

#sudo docker exec -it [CONTAINER ID] /bin/sh

3.使用nsenter 命令

docker inspect --format "{{.State.Pid}}" [CONTAINER ID]
nsenter --target [CONTAINER PID] --mount --uts --ipc --net --pid

indocker.sh

#!/bin/bash
CNAME=$1
CPID=$(docker inspect --format "{{.State.Pid}}" $CNAME)
nsenter --target "$CPID" --mount --uts --ipc --net --pid


【拷贝war、file到容器里面】

docker cp DemoOne.war [CONTAINER ID]:/usr/local/tomcat/webapps

注意:docker cp 命令在 Docker 1.8 之前就有,在旧的版本中,docker cp 命令仅仅容许从容器拷贝文件到主机,在 Docker 1.8 ,Docker cp 命令能够从主机拷贝文件到容器。

在 Docker 1.8 之前的版本中,用-v挂载主机数据卷到容器内实现从主机拷贝文件到容器

在宿主机和容器之间共享数据:在运行docker run 命令时,通过设置 -v 选项将宿主机的卷挂载到容器中。


在主机内执行:
#sudo docker run --name [CONTAINER] -v /path/to/hostdir:/mnt [IMGAGE]:{TAG} 

从主机进入容器:
#sudo docker exec -it [CONTAINER] /bin/bash

在容器内执行: 
#cp /mnt/sourcefile /path/to/destfile



##查看运行容器内的进程
#sudo docker top ubuntu_test

#sudo docker top [CONTAINER ID]

##获取容器日志信息
#sudo docker logs ubuntu_test

#sudo docker logs [CONTAINER ID]

##在容器内部运行进程
#sudo docker exec -d ubuntu_test touch /etc/new_config_file
-d:表明运行一个后台进程,之后,指定容器的名字和要执行的命令

##详细检查容器
#sudo docker inspect ubuntu_test

#sudo docker inspect [CONTAINER ID]

##绑定容器的端口到本地宿主机的端口
#sudo docker run -d -p 8080:80 --name nginx nginx_ubuntu:stable
注:将容器的80端口绑定到宿主机的8080端口上

##查看容器的端口映射情况
#sudo docker port [CONTAINER ID] [PORT]

##删除容器
#sudo docker rm ubuntu_test

#sudo docker rm [CONTAINER ID]

注:运行中的Docker容器是无法删除的,必须先通过docker stop或docker kill命令停止容器,然后才能将其删除

如果你有很多停止中的容器待删除,可以在一条命令中使用嵌套的shell来删除所有容器。
docker rm $(docker ps -a -q)

其中:docker ps -a -q   返回容器的ID


如果需要删除所有容器:

$docker stop $(docker ps -q)
$docker rm -v $(docker ps -aq)


数据卷:

-v src:dst

数据卷容器:

--volumes-from

docker run -it --name volume-test1 -v /opt:/opt centos

docker run -it --name volumes-test2 --volumes-from volume-test1 nginx
















  • 大小: 93.6 KB
  • 大小: 92.7 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics