docker基础手册_第1页
docker基础手册_第2页
docker基础手册_第3页
docker基础手册_第4页
docker基础手册_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Docker基本介绍基本概念Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上。Docker是一个重新定义了程序开发测试、交付和部署过程的开放平台,Docker则可以称为构建一次,到处运行,这就是docker提出的“Build once,Run anywhere”备注:java提出的是” compile Once,Run Anywhere”Docker与linux内核的关系docker与linux内核的关系Cgroup: 对资源进行限制(如对物理资源CPU、内存、I/O的限制)Namespace:对进程进行

2、隔离Chroot: 能改变当前运行的进程和子进程的根目录AUFS:联合文件系统,Docker利用AUFS将不同的Layer结合到1个image中去Docker架构Docker采用C/S架构,客户端与服务器端不一定要在一起。客户端可以运行在windows、linux等机器上,然后服务器端必须运行在linux 64bit的操作系统上。Docker“组件间”关系ü 主机:运行容器的机器ü 镜像:文件的层次结构,以及包含如何运行容器的元数据, Dockerfile中的每条命令都会在文件系统中创建一个新的层次结构,文件系统在这些层次上构建起来,镜像就构建于这些联合的文件系统之上

3、52; 容器:一个从镜像中启动,包含正在运行的程序的进程ü Registry(镜像仓库):存放镜像的地方,如Docker Hubü Volumn(卷):将物理机的文件夹挂载到容器内部.与openstack的volumn不一样,openstack中的卷是块存储,不能共享。而这里的volumn可以共享。ü Dockerfile:用于创建镜像的脚本Docker应用场景面向开发人员:快速开发、交付应用程序主要体现在三个方面:ü 代码一致:在没有docker之前,开发、测试、生成环境可能不一样,如发布某个服务的端口时,开发是1000,而生产是2000,这就导致配置

4、文件不一致。然而使用docker后,我在容器内的端口都是一样的,而容器对外暴露的端口可能不一样。ü 开发环境与生产环境的一致性我们知道,在生产环境的部署比较复杂,服务非常繁多。通过docker,我们可以单机版上通过容器来模拟生产环境的分布式环境。从而让开发人员的开发更有效率。ü 快速部署 可以将docker理解为轻量级的虚拟机,启动docker容器速度很快,启动虚拟机很慢。面向运维人员:降低运维成本ü 节约安装各种软件的时间。 在没有docker之前,在部署程序之前,势必要搭建环境,而搭建环境很花费时间,还要解决环境的各种依赖,而docker通过镜像机制,将你的代

5、码和运行环境直接打包成镜像,扔到容器启动即可。ü 降低运维成本。在没有docker之前,由于技术不断发展,运维也要不停的学习各种软件的使用技能,如Node.js、redis等。有了docker,根本不用关系这些技术(或者少关心),只需要关注容器就可以了,能够正常的发布容器,停止容器、删除容器、迁移容器就可以了。面向企业: Paas层的实现C、Oschina这些代码托管平台,有个功能即提供给用户程序的演示环境,我不知道他们底层到底采用的什么技术,但是如果Iaas层的openstack,给用户直接提供虚拟机,先得太“笨重”,因为虚拟机本身对物理机的开销就比较大,如果采用Docker,我1

6、台物理机可以部署多个容器,可以降低企业的采购物理机的费用,而且运行效率上应该比采用Iaas层的方案快。Docker基本命令Docker安装相关命令参考: 这里以在unbuntu14.04上安装为例:Ø 创建docker用户并将其纳入docker这个用户组#useradd docker -g dockerØ 更新源#sudo apt-get updateØ 安装依赖包#sudo apt-get install linux-image-generic-lts-trustyØ 重启#sudo rebootØ 安装docker#sudo apt-get

7、 install wget / 可以通过命令which wget是否已安装#wget -qO- | sh /获取最新版本Ø 验证安装是否成功#sudo docker run hello-worldDocker服务相关命令Docker服务启动|重启|停止#service docker start /启动#service docker restart /重启#service docker stop /停止Docker服务对应的版本查看# sudo docker versionDocker环境查看#sudo docker infoContainers: 5Images: 129Storag

8、e Driver: aufs Root Dir: /var/lib/docker/aufs Backing Filesystem: extfs Dirs: 139Execution Driver: native-0.2Kernel Version: 3.13.0-32-genericOperating System: Ubuntu 14.04.1 LTSCPUs: 2Total Memory: 3.673 GiBName: dockerID: OWRW:DDDW:MQZD:CCKM:JDKM:5ZEP:LTBB:YG3H:QI7G:EMDE:MSMR:XDFKUsername: ningyou

9、gangRegistry: https:/index.docker.io/v1/WARNING: No swap limit supportDocker命令帮助#sudo docker /查看docker的所有命令#sudo docker command -help /查看单个docker命令的帮助,如docker ru -helpDocker容器相关命令启动一次性运行的容器入门级例子:从ubuntu:14.04镜像启动一个容器,成功后在容器内部执行/bin/echo hello world命令,如果当前物理机没有该镜像,则执行docker pull从Docker Hub获取镜像,执行成功后,

10、容器立马停止#sudo docker run ubuntu:14.04 /bin/echo 'Hello world'参数解释docker run:docker中的启动容器命令Ubuntu:镜像名称14:04:镜像TAG,如果不指定TAG,docker使用最新的发行版TAG:latest/bin/echo Hello world:在容器内执行的命令该命令执行过程l 如果本地有ubuntu这个image就从它创建容器,否则从公有仓库下载l 从image创建容器l 分配一个文件系统,并在只读的image层外面挂载一层可读写的层l 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去

11、l 从地址池配置1个ip地址给容器l 执行你指定的程序,在这里启动一个/bin/bash启动交互模式容器以交互模式启动一个容器(具体参数意义请执行docker run -help)$ sudo docker run -t -i ubuntu:14.04 /bin/bash参数解释-t:开启一个终端-i:以交互模式运行启动后台模式容器以后台模式运行一个容器#sudo docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"1e5535038e285177d521

12、4659a068137486f96ee5c2e85a4ac52dc83f2ebe4147参数解释-d:以后台Daemon方式运行,执行成功后会返回一个该容器的ID以映射端口方式启动一个Web容器# sudo docker run -d -P training/webapp python app.py参数解释-d:以后台Daemon方式运行,执行成功后会返回一个该容器的ID-P:端口映射,外部端口到容器端口的映射规则由docker负责-p:自己指定端口映射规则,格式为:-p 外部端口:容器端口通过docker ps -l,可以查看到其PORTS列的端口映射规则当然你也可以,手工指定端口映射规则来

13、启动Web容器#sudo docker run -d -p 5000:5000 training/webapp python app.py备注:-p 完整的参数为:-p ip:hostport:port,将当前物理机的ip的端口映射到容器的端口如果你想通过很快捷的方式查看容器的端口#sudo docker port 容器ID或容器名称查看容器的具体信息以JSON的格式返回容器的具体信息#sudo docker inspect容器ID或容器名称进入容器执行命令#sudo docker exec -it 容器ID /bin/bash备注:一般对运行着的后台容器,执行该命令。查看其容器内部的情况。查

14、看容器的日志$sudo docker logs 容器ID或容器名称参数解释-f:以滚动的形式查看日志,类似于linux的tail -f XXX.log 退出当前容器$sudo exit /在容器内部执行该命令(或crtl+D),一般在交互模式下退出当前容器备注:容器仍然运行着创建容器# sudo docker create -name ubuntContainer ubuntu:14.04 /bin/echo 'Hello world'重启容器#sudo docker restart 容器ID暂停容器#sudo docker pause 容器ID /暂停#sudo docker

15、 unpause 容器ID /解除暂停停止容器$sudo docker stop 容器ID或容器名称#docker stop $(docker ps -q -a) /一次性停止所有容器,慎用杀死容器$sudo docker kill 容器ID或容器名称删除容器$sudo docker rm 容器ID或容器名称 /删除容器,正在运行的容器不能删除#sudo docker rm $(docker ps -q -a) /一次性删除所有容器,慎用单个主机间的容器访问下面我们通过mysql_server容器与mysql_client容器的互联来了解linkØ 创建mysql_server镜像,

16、并生成一个容器#cd /#mkdir mysql_server#vi DockerfileFROM centos:centos6MAINTAINER ningyougang "415622920" RUN yum install -y mysql-server mysql RUN /etc/init.d/mysqld start && mysql -e "grant all privileges on *.* to 'root''%' identified by 'mysql'"&&

17、amp; mysql -e "grant all privileges on *.* to 'root''localhost' identified by 'mysql'"&& mysql -u root -pmysql -e "show databases;" EXPOSE 3306 CMD "/usr/bin/mysqld_safe"# sudo docker build -t ningyougang/mysql_server . /生成镜像#sudo docker

18、run -name=mysql_server -d -P ningyougang/mysql_server /生成mysql_server容器Ø 创建mysql_client镜像,并生成一个link到mysql_server的client容器#cd /#mkdir mysql_client#vi DockerfileFROM centos:centos6 MAINTAINER ningyougang "415622920" RUN yum install -y mysql#sudo docker build -t ningyougang/mysql_client

19、. /生成镜像#sudo docker run -name=mysql_client1 -link=mysql_server:db -t -i ningyougang/mysql_client /usr/bin/mysql -h db -u root -pmysq /生成mysql_client容器 参数解释-link:<name or id>:alias通过上面的命令,link中的别名(alias)db即是mysql_client连接mysql_server的连接串Ø 进入mysql_client研究其link的实现细节#sudo docker exec -it bfc

20、6cb037165 /bin/bash /以交互模式进入mysql_client容器内部rootbfc6cb037165 /# env | grep DB /查看与DB(也就是alias)相关的环境变量DB_NAME=/mysql_client2/dbDB_PORT=tcp:/5:3306DB_PORT_3306_TCP_PORT=3306DB_PORT_3306_TCP_PROTO=tcpDB_PORT_3306_TCP_ADDR=5DB_PORT_3306_TCP=tcp:/5:3306 rootbfc6cb037165 /#vi

21、 /etc/hosts7 bfc6cb037165 #docker生成的mysql_client的IP、域名5 db #docker生成的mysql_server的IP、域名总结:可以发现docker在mysql_client内通过生成别名的环境变量和profile相关的主机和域名的配置,打通了客户端到服务器端的tcp连接通道,而对于上层的应用,不需要关注IP、端口这些细节,只需要通过别名来访问即可Docker网络参考: http:/www.open-跨主机间的容器访问Ø 使用自定义网桥连接跨主机容器N/A,待写Ø 使用Ambassa

22、dor实现跨主机容器N/A, 待写Ø kubernetesN/A, 待写数据管理Ø 把物理机的目录挂载到容器里以交互模式启动一个容器,将物理机的/src/webapp挂载到/opt/webapp下#sudo docker run -t -i -v /src/webapp:/opt/webapp ubuntu:14.04 /bin/bash参数解释-v 物理机目录:容器目录:读写权限 其中默认的权限为可读写, ro:只读Ø 把物理机的文件挂载到容器里#sudo docker run -t -i -v /src/webapp/test.html:/opt/webapp

23、/test.html ubuntu:14.04 /bin/bashØ 把容器挂载到另外一个容器#sudo docker create -v /dbdata -name dbdata ubuntu:14.04 /创建容器#sudo docker run -it -volumes-from dbdata ubuntu:12.04 /bin/bash /启动容器卷来自dbdata参数解释-volumn-from:卷来自哪个容器Ø 把容器挂载作为数据备份#sudo docker run -volumes-from dbdata -v $(pwd):/backup -name wor

24、ker ubuntu tar cvf /backup/backup.tar /dbdata命令解释首先利用ubuntu镜像创建一个容器worker.使用volumes-from dbdata参数来让容器挂载dbdata容器的数据卷;使用 v $(pwd):/backup参数来挂载本机的当前目录到worker容器的/backup目录Woker容器启动后,执行tar命令将/dbdata压缩到/backup/backup.tar,这样就到物理机的当前目录了Ø 把容器挂载作为数据迁移#sudo docker run -v /dbdata -name dbdata2 ubuntu /bin/b

25、ash#sudo docker run -volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/.tar 挂载到某个容器#sudo docker attach 容器ID显示运行容器的进程信息#sudo docker top 容器ID从容器内部拷贝文件到物理机#sudo docker cp cd0f61fb8256:/opt/a.html /列出容器里被改变的文件夹或文件#sudo docker diff 容器ID列表解释list列表会显示出三种事件,A 增加的,D 删除的,C 被改变的

26、0;Docker镜像相关命令镜像查看#sudo docker images /在本机进行镜像查看#sudo docker inspect 镜像ID /查看单个镜像的具体信息,以JSON格式返回获取镜像# sudo docker pull centos /从DockerHub获取镜像查询镜像#sudo docker search 镜像名称 /从DockerHub按照镜像名称模拟查询镜像制作镜像ü 通过Dockerfile构建镜像#sudo cd / /来到根“/”下#sudo mkdir redis /创建redis文件夹#touch Dockerfile /创建Dockerfile文

27、件,文件内容见如下灰色部分FROM ubuntu:14.04RUN apt-get update && apt-get install -y redis-serverEXPOSE 6379ENTRYPOINT "/usr/bin/redis-server"#sudo docker build -t ningyougang/redis . /通过dockerbuild制作镜像参数解释-t:tag名称.:当前Dockerfile的路径,在此处表示当前文件夹下ü 对运行着的容器commit镜像# sudo docker commit -m "A

28、dded json gem" -a "Kate Smith" 0b2616b0e5a8 ouruser/sinatra:v2参数解释-m:提交注释,如此处你加了什么特别的功能-a:作者0b2616b0e5a8:运行着的容器IDouruser/sinatra:v2:给当前提交的镜像起名字并打标签备注: 从上面可以看出,我们可以通过docker commit来创建镜像,但是这种方式有点凌乱而且很难复制, 更好的方式是通过Dockerfile来构建镜像,因为它步骤清晰并且容易复制给镜像打标签#sudo docker tag 5db5f8471261 ouruser/si

29、natra:devel /当commit or build后,对镜像打标签参数解释5db5f8471261:此处的id为镜像ID备注:向私有仓库push镜像也要打标签推送镜像到公共库DockerHub#sudo docker push ouruser/sinatra下面介绍下DockerHubDockerHub是存放镜像的远程仓库,这里简单介绍下,如何使用Ø 注册首先在Ø 登录帐号注册成功后,在除了通过登录页面,您也可以通过命令行,通过指令sudo docker login登录Ø 查询镜像点击“Browse Repos”(或输入在此页面,您可以录入你感兴趣的镜像名

30、称,进行模糊查询当然你也可以通过docker search XXX进行镜像查询Ø 使用Docker帐号绑定GitHub帐号,进行自动化构建需要细化,没有来得及研究推送镜像到私有库ü 下载私有仓库镜像# docker pull registry #从DockerHub下载registry镜像,里面含私库的运行环境,#当然你也可以自己下载源码包,自己安装ü 推送之前打tag# docker tag 704ca5ad68c5 13:5000/newtouch/activemq #打标签(必须先打标签,#在推送)该命令格式为:docker tag $ID $IP:$port/$name。push到私库上必须先打个tag,而tag名称的格式为:$IP:$port/$name, 个人感觉此处设计不太好或我自己没有找到更好的办法。如果设计良好应该可以直接push,不用打标签.ü Push tag到镜像#docker push 13:5000/n

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论