Docker

来源:互联网 发布:windows界面开发主流 编辑:程序博客网 时间:2024/05/17 22:54

No1,Docker的概念

Docker是基于Go语言实现的云开源项目,全部开源代码均在http://github.com/docker/docker 上维护。Docker基于Linux的多项开源技术提供了高效,敏捷和轻量级的容器方案,并且支持在多种主流云平台(PaaS)和本地系统上部署。

Linux容器技术:Docker引擎的基础是Linux容器(Linux Containers,LXC)技术,容器有效的将由单个操作系统管理的资源划分到孤立的组中,以便更好的在孤立的组之间平衡有冲突的资源使用需求。容器可以在核心CPU本地运行指令,而不需要任何专门的解释机制。Docker中每个容器内运行一个应用,不同的容器相互隔离,容器之间也可以建立通信机制。

Docker的优点:Docker提供了一种聪明的方式,通过容器来打包应用,意味着迁移只需要在新的服务器上启动需要的容器就可以了。

                          Docker容器很快,启动和停止可以在秒级实现。

                          Docker容器对系统资源要求很少,一台主机可以同时运行数千个Docker容器。

                          Docker通过Dockerfile配置文件来灵活的自动化创建和部署机制,提高工作效率。

Docker虚拟化:Docker容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,因此更加轻量级。


No2,Docker的核心

Docker镜像:Image,镜像是创建Docker容器的基础,一个镜像可以只包含一个完整的Ubuntu操作系统,成为Ubuntu镜像,可以包含Apache应用程序,成为Apache镜像。(文件系统)

Docker容器:Docker利用容器来运行和隔离应用。容器是从镜像创建的应用运行实例,可以将容器启动,开始,停止,删除,而容器之间都是相互隔离的,互不可见的。(基于文件系统——镜像构建出来的系统环境或应用程序)。用户可以在容器内进行root权限的操作。

Docker仓库:是Docker集中存放镜像的场所。每个仓库都存放某一类镜像,例如Ubuntu仓库,存放不同版本的Ubuntu镜像。

Docker的安装:

在Ubuntu14.04上安装:

sudo apt-get update // sudo:用于提升权限,apt-get update:和服务器同步软件包列表,于是当你apt-get install *时就能下到最新的软件

sudo apt-get install -y docker.io // Ubuntu14.04中已经自带了docker镜像,于是直接安装即可。-y:直接下载安装,不再要求确认

sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker// ln -s 源文件 目标文件, ln=link, s=symbolic。当 我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目 录下都放一个这样的的文件,我们只要在某个固定的目录,放上该文件,然后在其它的 目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间。-s下即一处改动,同步变化。

sudo sed -i '$acomplete -F _docker docker' /etc/bash_completion.d/docker.io

层次关系

Docker容器/Docker/Ubuntu操作系统/VirtualBox/Host Windows


No3,镜像

docker pull 命令从网上下载镜像

格式: docker pull NAME [:TAG] (如果不显示的指定TAG,则默认会选择下载仓库中最新的版本)
sudo docker pull ubuntu
sudo docker pull ubuntu:latest
sudo docker pull ubuntu:14.04
sudo docker pull registry.hub.docker.com/ubuntu:latest
以上四句意思都是一样的,都是从默认的注册服务器registry.hub.docker.com中的ubuntu仓库来下载标记为latest的镜像。

利用该镜像创建一个容器,在其中运行bash应用
sudo docker run -t -i ubuntu /bin/bash //我们必须使用 -i -t来申请一个控制台同容器进行数据交互

使用docker images 查看本地主机已有的镜像信息
sudo docker images

为了方便使用一个镜像,可以使用docker tag命令为本地镜像添加新的标签
sudo docker tag dl.dockerpool.com:5000/ubuntu:latest ubuntu:latest // 标签在这里起到了应用或者快捷方式的作用。

使用docker inspect命令可以获取该镜像的详细信息
sudo docker inspect 5506de2b643b // 5506de2b643b是镜像的ID(唯一标识)

使用docker search 命令可以搜索远端仓库中共享的镜像,默认搜索Docker Hub官方仓库中的镜像
sudo docker search mysql //搜索带mysql关键字的镜像,按星级评价排序(默认): -s 10 【10星以上的images】

使用docker rmi命令可以删除镜像
1, 使用镜像的标签删除镜像, 当同一个镜像拥有多个标签的时候, docker rmi 命令只是删除了该镜像多个标签中的指定标签而已,并不影响镜像文件。因此相当于只是删除了镜像5506de2b643b的一个标签而已。当镜像只剩下一个标签的时候, 再使用该命令就会彻底删除该镜像。
sudo docker rmi dl.dockerpool.com:5000/ubuntu //ubuntu:latest不受影响。:sudo docker rmi -f ubuntu-f 【强制删除】
2, 使用镜像ID删除镜像,会先尝试删除所有指向该镜像的标签,然后删除该镜像文件本身。当有该镜像创建的容器存在时,镜像文件默认是无法被删除的。
sudo docker run ubuntu echo 'hello, I am here!' //利用ubuntu镜像创建一个简单的容器
sudo docker ps -a //可以看到本机上存在的所有容器
正确的做法是应该先删除容器,在删除镜像
sudo docker rm e812617b41f6 //e81267b41f6为容器的ID

创建镜像
1, 基于已有镜像的容器创建
sudo docker run -ti ubuntu:14.04 /bin/bash
root@a925cb40b3f0: / # touch test
root@a925cb40b3f0: / # exit
记住容器ID:a925cb40b3f0,通过这个容器来创建一个镜像。
sudo docker commit -m "Added a new file" -a "Wayne" a925cb40b3f0 test// -a: 作者信息, -m: 提交消息,-p:(true)提交时暂停容器运行

存出和载入镜像
存出,存出镜像到本地文件
sudo docker save -o ubuntu_14.04.tar ubuntu:14.04// 存出本地的Ubuntu:14.04 镜像为文件ubuntu_14.04.tar
载入,把本地文件导入到本地镜像库中
sudo docker load < ubuntu_14.04.tar

上传镜像,默认上传到DockerHub官方仓库
sudo docker tag test:latest user/test:latest //创建一个新的标签
sudo docker pull user/test:latest


No.4 容器
新建一个容器
sudo docker create -i -t ubuntu:latest //新建的容器处于停止状态
启动容器
sudo docker start -a -i 7a0c26f96889 // 启动一个停止的容器, 7a0c26f96889是一个容器的ID,-a -i 为附加容器的输入输出。一般直接docker start $container_id
停止容器
sudo docker stop 7a0c26f96889

sudo docker run 命令同样可以创建和启动一个容器。

守护态运行
sudo docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done" //-d参数来实现,可以在后台一直运行
进入容器
sudo docker attach nostalgic_hypatia //nostalgic_hypatia 是容器的名字
sudo docker exec -it 7a0 bash //更有效
删除容器
sudo docker rm 7a0c26f96889 // -f 强制删除

导出容器
sudo docker export 7a0c26f96889 > test_for_run.tar
导入容器
sudo docker import test/ubuntu:v1.0 < test_for_run.tar


No.5 仓库
注册服务器(Registry)是存放仓库的具体服务器,每个服务器上可以有多个仓库, 而每个仓库下面有多个镜像。例如,对于dl.dockerpool.com/ubuntu 来说,dl.dockerpool.com 是注册服务器地址,Ubuntu是仓库名。

自动创建(Automated Builds)无需手动更新镜像,自动执行创建。

* http://dockerpool.com/downloads

创建和使用私有仓库 (10.0.2.2:5000)
sudo docker run -d -p 5000:5000  registry //-d 后台运行, -p 显示端口, 自动下载并启动一个registry容器,创建本地的私有仓库服务。
sudo docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry // -v 将镜像文件(这里的镜像文件指仓库容器镜像)放到本地指定路径上。/opt/data/registry 是本地地址。-v:【挂载】
将镜像上传到私有仓库
sudo docker images
sudo docker tag ubuntu:14.04 10.0.2.2:5000/test
sudo docker push 10.0.2.2:5000/test
curl htto://10.0.2.2:5000/v1/search //查看这个私有仓库中的镜像。
在任意一台机器上访问10.0.2.2来下载这个镜像
sudo docker pull 10.0.2.2:5000/test


No.6 数据卷
在容器内创建一个数据卷
sudo docker run -d -P --name web -v /webapp training/webapp python app.py  //-P 外部访问容器需要显示端口, -v 创建一个数据卷, 将数据卷创建到/webapp目录下。【-p:自己指定宿主机的端口,-P:随机指定宿主机的端口,无需自己指定】
挂载一个主机目录作为数据卷
sudo docker run -d -P --name web -v /src/webapp:/webapp training/webapp python app.py
挂载的数据卷指认为只读
sudo docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py
挂载一个主机文件作为数据卷
sudo docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash // --rm: 容器在终止后立刻删除

数据卷容器
数据卷容器就是一个普通的容器,专门用它提供数据卷供其它容器挂载。
创建一个数据卷容器
sudo docker run -it -v /dbdata --name dbdata ubuntu //创建一个数据卷容器dbdata,并在其中创建一个数据卷挂载到 /dbdata
创建db1和db2两个容器,并从dbdata容器挂载数据卷
sudo docker run -it --volumes-from dbdata --name db1 ubuntu //--volumes-from来挂载dbdata容器的数据卷
sudo docker run -it --volumes-from dbdata --name db2 ubuntu

No.7 网络基础配置
在启动容器的时候,如果不指定对应参数,在容器外部是无法通过网络来访问容器内的容器应用和服务的。要让外部访问这些应用时,可以通过-P 或者-p参数来指定端口映射。当使用-P时,会随机映射一个49000 ~ 49900的端口至容器内部开放的网络端口。-p则可以指定要映射的端口,格式 ip:hostPort:containerPort  |   ip::containerPort  | hostPort:containerPort。
sudo docker run -d -p 5000:5000 training/webapp python app.py //将本地的5000端口映射到容器的5000端口,默认所有地址
sudo docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py // 映射到指定的ip上,本地
sudo docker run -d -p 127.0.0.1::5000 training/webapp python app.py // 本地任意端口到容器的5000 端口
查看当前映射的端口配置
sudo docker port nostalgic_morse 5000// nostalgic_morse 容器的名字

容器互联
sudo docker run -d --name db training/postgres
sudo docker run -d -P --name web --link db:db training/webapp python app.py // --link name:alias, name 是要连接的容器的名称,alias是这个连接的别名

No.8 Dockerfile 创建镜像
Dockerfile 是一个文本格式的配置文件,用户可以通过Dockerfile 快速创建自定义的镜像。
Dockerfile 分为四部分,基础镜像信息,维护者信息,镜像操作指令,和容器启动时执行命令
基础镜像信息: FROM 【基础镜像名字】
维护者信息:MAINTAINER 【name】
镜像操作指令:RUN 【command】// 在shell终端中运行命令;RUN ["executable", "param1", "param2"] //其它终端上运行命令
容器启动执行命令:CMD ["executable", "param1", "param2"]

【补充】
在宿主机上如何获得一个docker container容器的ip地址?
#docker inspect --format = '{{.NetworkSettings.IPAddress}}' $container_id


0 0
原创粉丝点击