Docker实战之入门以及Dockerfile,docker快速上手

作者: 单机游戏资讯  发布:2019-06-08

构建开发环境变得简单

容器相关命令

  • docker启动、重启、关闭
sudo docker start | restart | stop
  • 查看docker程序是否正常工作
sudo docker info
  • 创建一个交互式shell容器,并为容器命名,名字可以包含字符:a-z,A-Z,0-9,下划线,圆点,横线。用正则表示[a-zA-Z0-9_.-]
sudo docker run --name first_container -it ubuntu /bin/bash
  • 查看当前系统中的容器列表
docker ps -a
docker ps -a -l #列出最后一次运行的容器
  • 重新启动已经停止的容器
sudo docker start first_container
sudo docker start container_id #也可以用从其id启动
sudo docker start container_name #重新启动一个容器
  • 创建守护式容器,使用-d参数,docker容器会在后台运行
sudo docker run --name container_name -d ubuntu /bin/bash
  • 停止守护进程
sudo docker stop container_name
  • 获取守护式容器日志
sudo docker logs container_name
sudo docker logs -f container_name #监控docker日志
sudo docker logs --tail 10 container_name #获取日志最后10行
sudo docker logs --tail 0 -f container_name #跟踪某个容器的最新日志而不必读取日志文件
sudo docker logs -ft container_name #-t标志为每条日志加上时间戳,方便调试
  • 查看容器内的进程
sudo docker top container_name
  • 自动重启容器
sudo cocker run --restart=always --name container_name -d ubutu

--restart:always,on-failure
--restat=on-failure:5,自动尝试重启五次

  • 查看容器
sudo docker inspect container_name

docker inspect命令会对容器进行详细的检查,然后返回其配置信息,包括名称、命令、网络配置的数据,也可以用-f或者--format标志来选定查看结果。

sudo docker inspect --format='{{.State.Running}}' container_name
#查看多个容器
sudo docker inspect --format='{{.Name}} {{.State.Running}}' container_name_1 container_name_2

/var/lib/docker目录存放着docker镜像、容器以及容器的配置,所有的容器都保存在/var/lib/docker/containers目录下

  • 删除容器
sudo docker rm container_name | container_id

运行的docker容器是无法删除的,必须先通过docker stop或者docker kill命令停止容器,才能删除。

  • 删除全部容器(-a标志代表列出所有容器,-q表示只需要返回容器的ID。)
sudo docker rm `docker ps -a -q`

root@c4be1df52810:/# apt-get -y install redis-server

镜像相关命令

  • 列出docker镜像
sudo docker images

本地镜像都保存在dockers宿主机的/var/lib/docker目录下。镜像从仓库下载,镜像保存在仓库中,而仓库存在于Registry中,默认的Registry是由Docker公司运营的公共Registry服务,及Docker Hub

  • 拉取ubuntu镜像
docker pull ubuntu #拉取镜像
docker pull ubuntu:14.04 #拉去tag为14.04的镜像

指定仓库的标签是一个好习惯,这样可以准确的制定容器来源于哪里。
Docker Hub有两种仓库:用户仓库和顶层仓库,用户仓库的镜像由Docker用户创建,顶层仓库由Docker内部人来管理。

  • 查看镜像
sudo docker images container_name
  • 查找镜像
sudo docker search container_name
  • 构建镜像

    1. 创建Docker Hub账号
    2. 登陆Docker Hub
    sudo docker login
    
    1. 用docker的commit命令创建镜像
      Docker实战之入门以及Dockerfile,docker快速上手。基于ubuntu镜像创建一个新镜像
    #创建一个要进行修改的定制容器
    sudo docker run -i -t ubuntu /bin/bash
    #安装apache软件包
    apt-get -yqq update
    apt-get -y install apache2
    #退出当前容器
    #提交定制容器
    sudo docker commit 4aab3ce3cb86 jamtur01/appache2
    #检查新创建的镜像
    sudo docker images jamtur01/apache2
    #在提交镜像时指定更多的数据(包括标签)来详细描述所做的修改
    sudo docker commit -m="A new custom image" --author="James Turnbull" 4aab3ce3cb76 jamtur01/apache2:webserver
    #使用docker inspect查看新创建的镜像详细信息
    sudo docker inspect jamtur01/apache2:webserver
    #从提交的镜像运行一个新容器
    sudo docker run -t -i jamtur01/apache2:webserver /bin/bash
    
  • 用dockerfile构建镜像
    并不推荐使用docker commit的方法来构建镜像,相反推荐使用Dockerfile的定义文件和docker build命令来构建镜像。Dockerfile使用基于DLS语法的指令来构建一个Docker镜像,之后使用docker build命令基于该dockerfile中的指令构建一个新的镜像。步骤:(我们将创建一个包含简单web服务器的docker镜像)

    1. 创建一个目录并在里面创建初始化的Dockerfile
    mkdir static_web
    cd static_web
    touch Dockerfile
    
    1. dockerfile文件内容
    #第一个Dockerfile
    #Version:0.0.1
    FROM ubuntu:14.04
    MAINTAINER James Turnbull "james@example.com"
    RUN apt-get update
    RUN apt-get install -y nginx
    RUN echo 'Hi, I am in your container' > /usr/share/nginx/html/index.html
    expose 80
    
    1. Docker实战之入门以及Dockerfile,docker快速上手。dockerfile指令解释
      Docker大体按照如下流程执行Dockerfile中的指令
      • Docker从基础镜像运行一个容器。
      • 执行一条指令,对容器做出修改。
      • 执行类似docker commit的操作,提交一个新的镜像层。
      • Docker在基于刚提交的镜像运行一个新容器。
      • 执行Dockerfile中的下一条指令,直到所有指令都执行完毕。
    2. Docker实战之入门以及Dockerfile,docker快速上手。基于dockerfile镜像构建新镜像
      执行docker build命令时,dockerfile中的指令都会被执行并且被提交,并且在该命令成功结束后返回一个新镜像。
    #运行Dockerfile
    cd static_web
    sudo docker build  -t="jamtur01/static_web" .
    

    使用docker build命令来构建新镜像,通过-t为新镜像设置了仓库和名称。在本例仓库为jamtur01,镜像名为static_web。建议为自己的镜像设置合适的名字以方便追踪和管理。也可以设置标签,如:

    sudo docker build -t="jamtur01/static_web:v1" .
    
      上面告诉docker到本地目录中去找Dockerfile文件,也可以指定一个Git仓库的源地址来指定Dockerfile的位置。
    
    sudo docker build -t="jamtur01/static_web:v1 git@github.com:jamtur01/docker-static_web
    
  • 忽略dockerfile的构建缓存

sudo docker build --no-cache -t="jamtur01/static_web"
  • 查看新镜像
sudo docker images jamtur01/static_web
  • 查看镜像如何构建出来的
sudo docker history22d47c8cb3jkk
  • 从新镜像启动一个容器
sudo docker run -d -p 80 --name static_web jamtur01/static_web nginx -g "daemon off;"

-d:说明在后台运行
-p:控制docker在运行时应该公开哪些网络端口给宿主机,-p还可以灵活的管理容器和宿主机之间的端口映射关系

sudo docker run -d -p 80:80 --name static_web jamtur01/static_web nginx -g "daemon off;"
sudo docker run -d -p 8080:80 --name static_web jamtur01/static_web nginx -g "daemon off;"
#端口限制在特定的IP上
sudo docker run -d -p 127.0.0.1:8080:80 --name static_web jamtur01/static_web nginx -g "daemon off;"

-P:可以用来对外公开在Dockerfile中EXPOSE指令中设置的所有端口

sudo docker run -d -P --name static_web jamtur01/static_web nginx -g "daemon off;"

运行一个容器时,Docker可以通过两种方法来在宿主机上分配端口。
* Docker可以在宿主机上随机选择一个位于49153~65535的一个比较大的端口好来映射到容器中的80端口上。
* 可以在Docker宿主机中指定一个具体的端口好来映射到容器中的80端口上。

  • 查看docker端口映射情况
sudo docker ps -l
##指定要查看映射情况的容器ID和容器的端口号
sudo docker port container_id 80

Docker是一个C/S架构

图片 1

  • Docker Client: Docker的客户端
  • Docker Server: Docker daemon的主要组成部分,接收用户通过Docker Client发送的请求,并按照相应的路由规则实现路由分发
  • Docker Registry: Registry是Docker镜像的中央存储仓库(pull/push)

通过docker pull命令可以把Registry上的docker镜像,下载到服务器本地

通过docker push命令可以把服务器本地的docker镜像,上传到Registry上

Registry在构建自动化平台,起着非常重要的作用!

图片 2

提示:Docker镜像运行之后会成为Docker容器----通过 docker run命令

Docker实战之入门以及Dockerfile,docker快速上手。相对于对单台机器进行Provisioning而言,云环境下则需要对多台机器进行Orchestration。Orchestration这个词翻译过来就是编排、编配的意思,我们也可以理解为集群管理。它主要由两部分工作组成:

docker安装

安装请参考docker官网:https://docs.docker.com/engine/installation/linux/ubuntulinux/

Docker容器启动速度非常快,体现在2个方面;

1.磁盘占用空间小,因为docker镜像采用了分层技术,构建的镜像大小,只有自身的大小,不包含父镜像的大小

2.内存消耗少,docker容器共享的宿主机的内核,没有操作的进程消耗

etcd

Docker实战准备

  1. 首先登陆OSChina Git
  2. 将Docker实战之入门以及Dockerfile,docker快速上手。docker-training项目Fork到自己的仓库
  3. 使用自己熟悉的SSH工具连接到服务器
  4. 执行git clone https://git.oschina.net/*YOURNAME*/docker-training.git,将你的远程仓库clone到服务器

Git 使用指南

后续会构建4个docker镜像,分别为:

Docker实战之入门以及Dockerfile,docker快速上手。centos7 (基础镜像)

php-fpm mysql(中间件镜像)

worpdress(应用镜像)

5.2.3. 如何和配置管理工具配合使用

为何把Dockerfile存放到git仓库中,并为每个项目创建git仓库?

方便通过自动化平台,自动构建docker镜像

Drone

一、Docker是什么?

回顾,在没有集装箱出现以前,传统运输行业中,会存在这些问题:

  • 在运输过程中,货物损坏
  • 装卸、运输货物,效率低下
  • Docker实战之入门以及Dockerfile,docker快速上手。运输手续繁多及运输环节多
  • 劳动强度大,及船舶周转慢

上图中的cgroups、namespaces和apparmor等都是Linux内核提供的功能。不管是传统的LXC还是Docker的libcontainer,都使用了Kernel的这些功能来实现容器功能。

有了Docker,以上问题,有望或者说在很大程度上可以得到解决

4.1.3. 新组件

基础镜像csphere/centos:7.1

#
# MAINTAINER        Carson,C.J.Zeong <zcy@nicescale.com>
# DOCKER-VERSION    1.6.2
#
# Dockerizing CentOS7: Dockerfile for building CentOS images
#
FROM       centos:centos7.1.1503
MAINTAINER Carson,C.J.Zeong <zcy@nicescale.com>

ENV TZ "Asia/Shanghai"
ENV TERM xterm

ADD aliyun-mirror.repo /etc/yum.repos.d/CentOS-Base.repo
ADD aliyun-epel.repo /etc/yum.repos.d/epel.repo

RUN yum install -y curl wget tar bzip2 unzip vim-enhanced passwd sudo yum-utils hostname net-tools rsync man && 
    yum install -y gcc gcc-c   git make automake cmake patch logrotate python-devel libpng-devel libjpeg-devel && 
    yum install -y --enablerepo=epel pwgen python-pip && 
    yum clean all

RUN pip install supervisor
ADD supervisord.conf /etc/supervisord.conf

RUN mkdir -p /etc/supervisor.conf.d && 
    mkdir -p /var/log/supervisor

EXPOSE 22

ENTRYPOINT ["/usr/bin/supervisord", "-n", "-c", "/etc/supervisord.conf"]

FROM centos:centos7.1.1503

基于父镜像构建其他docker镜像, style="">父镜像:可以通过docker pull 命令获得,也可以自己制作

MAINTAINER Carson,C.J.Zeong <zcy@nicescale.com>

Dockerfile维护者

ENV TZ "Asia/Shanghai"

ENV(environment)设置环境变量,一个Dockerfile中可以写多个。以上例子是:设置docker容器的时区为Shanghai

5.2.4. 安全性

传统软件行业中存在的问题

  • 软件更新发布低效
  • 业务无法敏捷
  • 环境一致性,难于保证
  • 不同环境之间迁移成本太高
  • 软件开发商,交付实施周期长---成本高

RUN apt-get -y install redis-server

介绍日常工作中经常用到的参数:

docker run -it #启动docker容器在前端 docker run -d #启动docker容器在后台

docker run -p docker run -P

在Dockerfile中有一条指令是EXPOSE 22,如果使用-P,宿主机会随机选择一个没有被使用的端口和docker容器的22端口端口映射,如果docker主机或者容器重启后,宿主机又会随机选择一个没有被使用的端口和docker容器的22端口做端口映射,这样端口会发生变化

如果使用-p,比如2222:22,这样不管是docker主机或者容器重启后,2222:22端口都是这样来映射,不会发生改变

生成docker容器

docker run -d -p 2222:22 --name base csphere/centos:7.1

37ac69acf47d501ffc61d8883ae2ba362a132d11e46897212a92b1936e0a0593

参数说明:

  • -d 后台运行
  • -it 前台交互式运行
  • -P 22 将宿主机的一个未使用的随机端口映射到容器的22端口
  • -p 2222:22 将宿主机的2222端口映射到容器的22端口
  • --name base 给容器命名为base
  • csphere/centos:7.1 使用这个镜像镜像创建docker容器

查看Docker容器

docker ps

ps默认只会显示容器在“running”的状态的,容器列表

docker ps -a

ps -a 会查看到所有的容器列表

Docker开发社区非常活跃,除了35名全职员工(外加一只乌龟)之外,还有450名左右的外部代码贡献者。到目前Docker Hub已经拥有超过16000多个应用,在GitHub上也有超过7000个Docker相关的项目,其中不乏很多受关注度非常高的项目。

什么是Dockerfile?

图片 3

Dockerfile是自动构建docker镜像的配置文件,Dockerfile中的命令非常类似linux shell下的命令

Dockerfile,可以让用户自定义构建docker镜像,支持以 # 开头的注释行

一般,Dockerfile分为4部分

  • 基础镜像(父镜像)信息
  • 维护者信息
  • 镜像操作命令
  • 容器启动命令
  1. DockerCon14总结
以上文件就是用来生成第一个docker镜像的Dockerfile,通过`docker

build`指令来生成docker镜像

docker build -t csphere/centos:7.1 .

如果Dockerfile在当前目录下,输入点.就可以进行加载当前目录下的Dockerfile

如果不在当前目录下需要运行docker build -t csphere/centos:7.1 <Dockerfile_dir>加载相对路径下的Dockerfile

docker镜像的命名规则 registry_url/namespace/image_name:tag 默认taglatest

在构建Docker镜像时,如果有自己内部的yum源,替换成自己内部的yum源地址,可以加快构建速度。

如果第一次构建失败,会有部分镜像layer生成,第二次构建会基于第一次构建所生成的layer(use cache),继续构建

Step 10 : EXPOSE 22
 ---> Running in 0ed1c5479ebc
 ---> c57a5bac41c8
Removing intermediate container 0ed1c5479ebc
Step 11 : ENTRYPOINT /usr/bin/supervisord -n -c /etc/supervisord.conf
 ---> Running in e16c7ac2fd45
 ---> 185ef7b101a8
Removing intermediate container e16c7ac2fd45
Successfully built 185ef7b101a8

可以看到每执行一条Dockerfile的指令都会生成一个镜像的layerc57a5bac41c8 185ef7b101a8 最后185ef7b101a8这个是docker镜像的ID,185ef7b101a8是由c57a5bac41c8 185ef7b101a8...layers叠加而成,体现了docker镜像是分层的

# docker images    查看当前主机本地有哪些docker镜像 
REPOSITORY                             TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
csphere/centos                         7.1                 185ef7b101a8        40 minutes ago      451.9 MB

通过docker镜像生成一个docker容器

docker help run #查看docker run命令的使用方法

Cloud Foundry在5月份发布的Docker版的BOSH工具,有兴趣的读者可以参考一下Decker 注 28 项目。

首先Docker是软件工业上的集装箱技术

但随着不可变基础设施的普及 注 18 ,幂等性将不再重要,因为我们的容器只需要配置一次。要对容器做出修改,可能只需要修改Dockerfile/manifest/recipe文件重新Provisioning即可。而且也不需要在容器内部安装任何agent,这样的话类似Ansible这样纯SSH的配置管理工具比较适合对Docker进行配置。甚至还可能出现专门为Docker的更简单的配置管理工具。

在集装箱出现后,完全改变了这种状况,是由于集装箱:

  • 规则标准化,大大减少了包装费用
  • 大大提升了货物装卸效率、及运输效率
  • 不同种运输工具之间转换更容易
  1. Docker架构解析

二、Docker的组成

我们前面说过,镜像文件是分层的,很多镜像文件可以共用很多层。比如我们这次往服务器push镜像的时候,实际push的只有一层( 744ce29b2fcf )而已,这是因为我们的镜像文件是基于 ubuntu 这个base镜像创建的,而ubuntu 镜像早已经在远程仓库中了。

三、Dockerfile介绍

通过下面的命令得到刚才容器的ID号并进行commit操作。

Dockerfile中有2条指令可以拷贝文件

ADD aliyun-mirror.repo /etc/yum.repos.d/CentOS-Base.repo

拷贝本地文件到docker容器里,还可以拷贝URL链接地址下的文件,ADD还具有解压软件包的功能(支持gzip, bzip2 or xz)

COPY test /mydir

拷贝本地文件到docker容器

RUN yum install -y curl wget....

RUN命令,非常类似linux下的shell命令 (the command is run in a shell - /bin/sh -c - shell form)

在Dockerfile中每执行一条指令(ENV、ADD、RUN等命令),都会生成一个docker image layer

RUN pip install supervisor

supervisor进程管理系统,推荐使用

ADD supervisord.conf /etc/supervisord.conf

添加supervisor的主配置文件,到docker容器里

RUN mkdir -p /etc/supervisor.conf.d

创建存放启动其他服务"supervisor.conf"的目录,此目录下的所有以.conf结尾的文件,在启动docker容器的时候会被加载

EXPOSE 22

端口映射 EXPOSE <host_port>:<container_port>

推荐使用docker run -p <host_port>:<container_port> 来固化端口

ENTRYPOINT ["/usr/bin/supervisord", "-n", "-c", "/etc/supervisord.conf"]

一个Dockerfile中只有最后一条ENTRYPOINT生效,并且每次启动docker容器,都会执行ENTRYPOINT

使用Dockerfile构建Docker镜像非常简单,我们只需要创建一个名为 Dockerfile 的文件,并编写相应的安装、配置脚本就可以了。我们还是以上面安装Redis服务为例,看看如何使用Dockerfile构建一个镜像。

所以,集装箱出现是传统行业中的一次重大变革

Docker — 云时代的程序分发方式

Docker引擎

实际上Docker的出现离不开很多Linux kernel提供的功能,甚至可以说Docker在技术上并没有什么特别重大的创新之处,利用的都是已经非常成熟的Linux技术而已,这些技术早在Solaris 10或Linux Kernel 2.6的时候就有了。可以毫不夸张的说Docker就是“站在了巨人的肩膀上”。

docker ps

「Blue-green deployment」这个词最初出现在《Continuous Delivery: Reliable Software Releases through Build, Test, and Deployment Automation 》一书,后经ThoughtWorks的Martin Fowler发扬光大 注 4 。

容器是一个基于Docker镜像创建、包含为了运行某一特定程序的所有需要的OS、软件、配置文件和数据,是一个可移植的运行单元。在宿主机来看,它只不过是一个简单的用户进程而已。

简单包括几个方面的意思

Docker除了能在各种主流Linux上使用之外,还出现了有专为运行Docker容器而定制的OS了,比如CoreOS 注 31 ,RedHat的Atomic 注 32 。

libchan

注 22 

CoreOS是一个精简版的Linux,可以运行在既有硬件或者云上,它也是一个最近备受关注的项目。CoreOS不提供类似yum或者apt类似的包管理工具,你不需要在CoreOS中安装软件,而是让程序都在Docker容器中去运行。CoreOS使用systemd和fleet来对容器进行管理,通过etcd进行服务发现和配置信息共享。

我们可以创建自己的Docker镜像,在我们的日常工作中会经常进行镜像构建操作。构建Docker镜像非常简单,而且方法也有几种。

注 8 

docker run 命令会启动一个容器。参数 ubuntu 指定了我们需要运行的镜像名称,后面的 bash 则指定了要运行的命令,注意这个命令是容器中的命令,而不是宿主机中的命令。参数 -i 用来为容器打开标准输入以和宿主机进行交互, -t 则会为容器分配一个终端。

现在PaaS平台的发展已经非常成熟了,这里我们只罗列一些在开发中使用Docker技术可能会给我们带来的益处。

5.3.1. 集群管理(Orchestration)和服务发现(Service Discovery)

如果你使用 docker history 命令来查看该镜像的历史信息,你会发现它的输出和 docker build 的记录是相匹配的,每一条Dockerfile中的指令都会创建一个镜像层。此命令还能查看每个镜像层所占空间大小,即 SIZE 列的内容。比如本例中 MAINTAINER 这样指令,实际上它只是关于镜像的元数据,并不占用额外的磁盘空间,所以它的层大小为0字节。而 RUN apt-get -y install redis-server 创建的层则会在镜像中增加文件,所以是需要占用磁盘空间的。

Project Atomic是最近才发布的一个项目,它也是一个瘦身版的Linux,只包含systemd/geard 注 33 /rpm-OSTree以及Docker组件,专门用来部署和管理Docker容器。它能在接近硬件裸机级别上高性能的运行大量容器,而且它还是基于SELinux的,在安全上也有保障。

注 26 

Quay除了能托管私有镜像之外,还能和GitHub集成,使用Dockerfile进行镜像构建。

4.2. 大公司的热情

PaaS平台

$ sudo docker run -t -i ubuntu bash

3.4. 发布镜像

3.2.1. 标签(Tag)

我们还可以为镜像打标签,这也和Git非常相似。其实你也可能在前面留意到了, docker images 的输出中有一列就是TAG的。我们在执行 docker build 或者 docker commit 的时候都可以同时为仓库名称指定一个TAG,格式为 user_name/repo_name:tag ,如果没有指定这个TAG,则默认为 latest 。

有时候构建测试的环境是一项费时费力的工作,而Docker能让这变得轻松。如果你的测试比较简单的话,甚至直接拿开发构建的镜像就可以开始了。

LXC很成熟很强大,然而它却不好使用,比如它不方便在多台机器间移动,不方便创建管理,不可重复操作,也不方便共享等等,相对于开发人员来说,它只是系统管理员的玩具。Docker的出现很好的解决了这些问题,它将容器技术的使用成本拉低到了一个平民价格。

服务发现

4.1.2. Docker Engine Docker Hub

注 31  ,在6月末刚刚宣布获得了八百万美元的A轮融资注 32 

Orchard

$ sudo docker commit -m="manually created image" -a="bin liu <liubin0329@gmail.com>" -run='{"CMD":["/usr/bin/redis-server"], "PortSpecs": ["6379"]}' c4be1df52810 liubin/redis:manually

1.3.3. namespaces

Shipyard是一个Docker镜像和容器管理工具,除了基本的镜像构建,容器启动等功能之外,它还具有在浏览器中attach到容器的功能,并通过hipache 16 来进行容器之间的连接。同时它也支持跨节点的Docker管理和容器Metrics采集。

容器技术和Hypervisor技术虽然不属于同一层次的概念,但是作为具有计算能力的应用运行载体来说,它们还是有一定的共通性和竞争关系,这里作此对比完全是为了加深读者对容器技术的理解而已。

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

Strider CD

2.2. Docker镜像(image)

Quay

Docker Hub的目的之一就是要成为应用程序交换的中转站,它还支持自动构建功能。自动构建的Dockerfile可以托管在GitHub或者Bitbucket上,当我们将代码提交并push到托管仓库的时候,Docker Hub会自动通过webhook来启动镜像构建任务。

3.3.2. 使用Dockerfile文件

PaaS平台大多基于容器技术,Docker天生就适合做PaaS。

Fig

下载镜像到本地

docker run –p 5000:5000 registry

CI/CD(持续集成/持续部署)

Chubby 注 20 可以称得上是很多服务发现、集群管理软件的鼻祖了,比如Zookeeper 注 21 ,这些软件都提供数据存储、leader选举、元数据存储、分布式锁、事件监听(或watch,监视)等功能。

我们可以将Docker镜像仓库理解为Git仓库。Dcoker镜像仓库分为远程和本地,本地的概念好理解,而一般来说远程仓库就是Registry,包括官方的或者自建的私有Registry;我们通过 docker pull 和 docker push 命令在本地和远程之间进行镜像传输。

Shippable

MAINTAINER bin liu <liubin0329@gmail.com>

最后再容笔者斗胆对Docker的将来做一些展望。除了Docker本身自己会蓬勃发展之外,围绕Docker的生态圈必将更加成熟和强大。

最后我们再从下面的这张图,更形象的认识一下这三个工具的作用及关系。

关于这次Docker大会的更多信息可以参考其官方网站: 

ENTRYPOINT ["/usr/bin/redis-server"]

5.3.2. 和OS的深度结合

  • 你的应用程序。

Docker镜像是Docker系统中的构建模块(Build Component),是启动一个Docker容器的基础。

2.3. Docker容器(Container)

-a : 查看所有容器,包括已经停止运行的。-l : 查看刚刚启动的容器。-q : 只显示容器ID-l -q : 则可以返回刚启动的容器ID。

libcontainer是一个容器的参考实现,它通过Go语言实现来使用Linux的命名空间等技术,而不需要额外的外部依赖。

  1. Docker简介

Consul 注 26 是一个服务发现和集群配置共享的软件,除了K/V store功能之外,它还支持跨数据中心及容错功能,并能进行服务健康监测。

Blue-green部署能带来如下好处。

Docker虽然入门和使用起来非常简单,但整个生态系统还是挺庞大的,而且其底层技术也都很复杂,由于篇幅有限及笔者学识不精,也只能说一些皮毛之事,最多只能算是抛块砖而已;而且笔者也有一种意犹未尽的感觉,但是由于篇幅所限,不能说到面面俱到,更多的内容,还请各位读者自己去深入挖掘。

快速进行横向扩展

2.2.1. Docker镜像

libchan现在是Docker的标准通信层,被称为网络上的go channel,普通的Go channel只能运行在单机上,而libchan可以跨Unix socket或纯TCP/TLS/HTTP2/SPDY/Websocket等运行。使用libchan,可以非常方便的进行任意结构的消息传递、实时双工异步通信、并发编程及同步等。

图 Docker平台

是软件就会存在bug,包括安全漏洞,Docker也不例外。就在今年6月份,Docker刚爆出了一个容器逸出的漏洞 注 19 。不管是Hypervisor技术还是容器技术,安全问题始终都是一个不可避免的话题,虽然它们出问题的几率要比中间件软件(Apache,Nginx、Tomcat)和软件框架(Struts、Rails)等的概率要小很多。

在松耦合的分布式环境下,应用程序不一定跑在同一台机上,甚至是跨越数据中心的。这时候服务发现就显得格外重要了。

官方推荐使用nsenter 注 17 工具来完成类似的工作,通过它可以进入到指定的namespace中并控制一个容器。

1.4. 容器技术VS虚拟机技术

注 25 

注 18 笔者个人偏见而已

1.3.5. 联合文件系统

Docker Hub

1.3.1. 容器技术

5.3. 对Docker展望

注 4 

注 21 

首先你要有一个Docker Hub账号并已经为登录状态,这样才能往Docker Hub上push镜像文件。注册Docker Hub账号只能通过网站注册 注 11 ,这里我们假设各位读者已经拥有Docker Hub了账号。

这时候我们可以使用 -d 参数来通过守护模式启动一个容器,这样容器将会在后台一直运行下去。这非常适合运行服务类程序。如果需要,我们可以再通过 docker attach 命令连接到运行中的容器。

Shippable支持Github和Bitbucket,并且提供100%免费的服务,包括私有仓库。

Docker项目始于2013年3月,由当时的PaaS服务提供商dotCloud开发,dotClound也是YCombinator S10的毕业生。尽管Docker项目很年轻,到现在也只有15个月而已,然而它的发展势头如此之猛已经让很多人感叹不已了。

$ sudo docker ps -a

5.2.1. Debug、调优

镜像 -> docker run -> 容器容器 -> docker commit -> 镜像

新的Docker平台由Docker Engine(运行环境 打包工具)、Docker Hub(API 生态系统)两部分组成。

查看本地镜像列表

容器(Container)有时候也被称为操作系统级虚拟化,以区别传统的Hypervisor虚拟技术。它不对硬件进行模拟,只是作为普通进程运行于宿主机的内核之上。

5.2. 运用中的问题点

Apache Mesos & Marathon & deimos & etc.

图 Docker如何和Linux内核打交道

很多PaaS平台都是基于容器技术实现的,比如目前最成功的PaaS平台Heroku。此外,还有比较著名的开源PaaS平台Cloud Foundry的Warden以及Google的Lmctfy(Let Me Contain That For You) 注 2 等。

如果你愿意,还可以将在本地制作镜像push到Docker Hub上和其他人分享你的工作成果。

Red Hat Enterprise Linux 7版将内置Docker,虽然版本还是0.11,不过很快就会升级的。另外Atomic项目也是Red Hat主导开发的。

前面我们已经介绍了Google公司内部的服务都是跑在容器之中的,Google对Docker也表现出了相当浓厚的兴趣。除了他们负责基础设施的VP Eric Brewer进行了主题为《Robust Containers》的演讲之外,他们还介绍了自己开源容器管理软件Kubernetes和对容器资源进行监控的cAdvisor。

就在DockerCon14开始的前一天,Flynn发布了Pinkerton,一个支持在其它容器中使用Docker镜像的技术。

消除环境不一致导致的问题

本文由bg游戏资讯发布于单机游戏资讯,转载请注明出处:Docker实战之入门以及Dockerfile,docker快速上手

关键词: 日记本 程序员 docker学习 Docker 首页投稿(暂

上一篇:编程狂人,第七十一期
下一篇:没有了