Docker安装与快速入门(Mac)

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。 –百度百科

Docker 结构如下
struction
其核心就是利用LXC来实现类似虚拟机的功能从而更高效利用硬件资源。
docker ispect docker_container_id

安装

  1. 安装Docker
    本文主要针对Mac安装,Windows和Linux类似。
    1. 检查系统版本
      要安装Docker Toolbox需要OSX版本>=10.8 “Mountain Lion”, 查看方法是点击左上角苹果图标->About this Mac
      system version
      如果系统不符合要求请先更新系统。
    2. 获取安装文件
    3. 双击打开安装镜像,安装向导会显示将要安装的程序列表
      What will be installed
      按下’Continue‘之后将会提供自定义安装选项,你可以选择安装哪些程序:
      options
      建议全部安装。
      点击Install并输入密码将会开始安装。
    4. 安装完成
      completed
      其中,Docker Quickstart Terminal相当于通过终端进入docker的快捷方式,省去了登录等操作,Kitematic是Docker的图形化界面,可以可视化地从Docker Hub下载镜像并直接使用。下面都以命令行为界面

基本操作


  1. 安装image
    sudo docker pull ubuntu:12.04
    等价于
    sudo docker pull registery.hub.docker.com/ubuntu:12.04
    即从默认仓库下载;但是,有时官方仓库下载较慢,可以使用下面的命令指定仓库:
    sudo docker pull dl.dockerpool.com:5000/ubuntu:12.04
  2. docker run常用参数

  • ‘-i’:Keep STDIN open even if not attached
  • ‘-t’:Allocate a pseudo-tty分配一个控制台同容器交互

对于执行容器内的交互式操作,例如shell脚本。我们必须使用 -i -t来申请一个控制台同容器进行数据交互。但是当通过管道同容器进行交互时,就不能使用-t. 例如下面的命令
echo test | docker run -i busybox cat

  • ‘-d’ 使容器在后台模式(detached mode)运行,当前终端窗口不再被容器监听,可以使用docker attach来重新挂载
  • --rm:容器终止后会立即删除
  • ‘-a=[]’指定容器挂载哪些流(‘STDIN’,’STDOUT’,’STDERR’)不带这个参数时全部挂载
  • ‘–name’:给容器命名
    docker run –name wei -itd busybox
  • docker ps 列出运行中docker容器
    • ’-a’ 列出所有容器
    • ‘-q’列出所有进程的CONTAINER ID,
    • 作用:比如杀死所有进程
      docker kill $(docker ps -q)
  • Docker镜像
    1. 修改已有镜像
    2. 先使用下载的镜像启动容器
      sudo docker run -it training/sinatra /bin/bash
      记住容易id,在容器中添加json和gem两个应用
      root@0b2616b0e5a8:/#: gem install json
      使用exit退出后提交更新后的副本
      sudo docker commit -m “Add json gem” -a “Docker Newbee” 0b2616b0e5a8 ouruser/sinatra:test
      ‘-m’参数说明信息,’-a’指定更新的用户信息,之后是用来创建镜像的容器id,最后指定目标镜像仓库名和tag信息,创建后回返回这个镜像的id
    3. 使用Dockerfile创建镜像
    4. 新建目录和Dockerfile
      mkdirsinatra cd sinatra
      $ touch Dockerfile
    5. Dockerfile中每条指定都创建镜像的一层,最多127层
      # This is a comment
      FROM ubuntu:14.04
      MAINTAINER Docker Newbee newbee@docker.com# 作者
      RUN apt-get -qq update
      RUN apt-get -qqy install ruby ruby-dev
      RUN gem intall sinatra
      # put my local web site in myApp folder to /var/www
      ADD myApp /var/WWW
      # expose httpd port
      EXPOSE 80
      # the command to run
      CMD [“/usr/sbin/appachectl”, “-D”, “FOREGROUND”]
    6. build 生成镜像
      sudo docker build -t=”ouruser/sinatra:v2”
      ‘-t’标记添加tag,指定新的镜像的用户信息
    7. 用新的镜像启动容器
      sudo docker run -it ouruser/sinatra:v2 /bin/bash
      docker tag 5db5f8471261 ouruser/sinatra:devel
      更改镜像标签
    8. 上传镜像
      sudo docker push ouruser/sinatra
    9. 存出和载入
    10. 存出
      sudo docker save -o ubuntu_14.04.tar ubuntu:14.04
    11. 载入
      sudo docker load –input ubuntu_14.04.tar

      sudo docker load < ubuntu_14.04.tar
    12. 移除
      docker rmi training/sinatra
      注意:在删除镜像之前应该先docker rm掉依赖于该镜像的所有容器
  • Docker 容器
    1. 新建并启动:docker run
      sudo docker run -it ubuntu:14.04 /bin/bash
      启动一个bash终端,允许用户进行交互
    2. 启动已终止程序:docker start
    3. 守护态运行:’-d’
      获取容器的输出信息:
      sudo docker logs insane_babbage
      进入守护态容器:
      docker attach container_name
    4. 终止容器:
      docker stop container_name
      重新启动容器:
      docker start container_name
      重启容器:
      docker restart container_name
      会将运行态的容器终止再重新启动
    5. 导出和导入容器
      • 导出容器快照到本地:
        docker export container_id > container_name.tar
      • 从本地快照导入容器:
        docker import container_path example/imagerepo
    6. 删除容器
      docker rm container_id
      删除前容器需停止
  • Docker Hub
    1. 登录:
      docker login
      输入用户名和密码后,认证信息保存在本地用户目录的.dockercfg文件中
    2. 基本操作
      • 搜索镜像:
        docker search centos
      • 下载镜像
        docker pull centos
      • 上传镜像
        docker push image_name
      • 自动创建 略
    3. 私有仓库
  • Docker数据管理

    1. 两种方式:

    • 数据卷 (Data Volumes)
    • 数据卷容器(Data volumes container)
  • 数据卷

  • 特性
    • 数据卷可以在容器间共享
    • 对数据卷的修改会立刻生效
    • 对数据卷的更新不会影响镜像
    • 卷会一直存在,直到没有容器使用它
  • 创建数据卷
    在使用docker run命令的时使用 -v 参数创建并挂载数据卷到容器里。在一次run中可以多次使用以挂载多个数据卷
    docker run -d -P –name web -v /webapp training/webapp python app.py
    注意:可以在Dockerfile中使用VOLUME来添加一个或多个新的卷到该镜像创建的容器中。
  • 挂载一个主机目录到容器
    docker run -d -P –name web -v /src/webapp:/opt/webapp python app.py
    将主机的/src/webapp目录挂载到容器中得/opt/wepapp
    最后加上:ro挂载为只读
    Dockerfile不支持这个用法
  • 挂载一个主机文件到容器
  • 数据卷容器

    如果有一些持续更新的数据需要在容器之间共享,最好创建数据卷容器,数据卷容器是用来专门提供数据卷供其他容器使用的容器。

  • 创建:
    docker run -d -v /dbdata –name dbdata training/postgres echo Data-only Container
    #挂载
    docker run -d –volumes-from dbdata –name db1 training/postgres
  • 删除
    如果删除了挂载的容器(dbdata, db1)数据卷不会被自动删除,需要在删除最后一个还挂在着它的容器使用docker rm -v
  • 备份
    docker run –volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar …
  • 恢复
    # 创建带有数据卷的容器dbdata2
    docker run -v /dbdata –name dbdata2 ubuntu /bin/bash
    # 创建另一个容器,挂载dbdata2容器,并使用untar解压备份文件到挂载的容器卷中
    docker run –volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar
  • Docker 中网络管理
    1. 外部访问容器
      通过-P或-p参数来指定端口映射
      • -P:随机映射一个49000-49900的端口到内部容器开放的网络端口
      • -p:指定端口,支持格式有ip:hostPort:containerPort|ip::containerPort|hostPort:containerPort还可使用udp标记来指定udp端口-p 127.0.0.1:5000:5000/udp
      • 使用docker port来查看当前映射的端口配置
        docker port nostalgic_morse 5000

        127.0.0.1:49155

    2. 容器互联
      #创建数据库容器
      docker run -d –name db training /postgres
      # 互联
      docker run -d -P –name web –link db:db training/webapp python app.py
      这样容器db和web容器建立互联关系, --link格式:--link name:alias, name是要链接的容器的名称,alias是这个链接的别名,连接的容器可以在docker ps中查看到
      • 查看连接信息
      • 环境变量
        docker run –rm –name web2 –link db:db training /webapp env
        得到环境变量

        DB_NAME=/web2/db
        DB_PORT=tcp://172.17.0.5:5432
        DB_PORT_5000_TCP=tcp://172.17.0.5:5432

        前缀采用大写的连接别名
      • 父容器web2的/etc/hoists文件
        docker run -it –rm –link db:db training/webapp /bin/bash
        # cat /etc/hosts
        172.17.0.7 aed84ee21bde

        172.17.0.5 db
        这里有两个hosts,第一个是web容器,web容器用id作为它的主机名,第二个为db容器的ip和主机名, 可以使用ping db来测试web2和db容器的连接状况
  • 高级网络配置
    1. 网络结构
      网络结构
    2. 配置DNS
      Docker通过向新建容器挂载3个相关配置文件使宿主主机DNS更新后所有容器dns通过/etc/resolv.conf文件立刻得到更新
      • -h HOSTNAME | --hostname=HOSTNAME指定容器的主机名,会被写到容器的/etc/hosts/etc/hostname
      • --link=CONTAINER_NAME:ALIAS:添加一个其他容器的主机名到/etc/hosts中,让新容器的进程可以使用主机名ALIAS连接它
      • dns=IP_ADDRESS:让容器解析不在/etc/hosts中的主机名
      • dns-search=DOMAIN:设定容器的搜索域
    3. 容器访问外部网络
      容器访问外部网络需要本地转发支持,通过
      sysctl net.ipv4.ip_forward(Mac: sysctl net.inet.ip.forwarding)
      查看有没有开启转发,1为开启0为关闭,通过下述命令打开
      sysctl -w net.ipv4.ip_forward=1(Mac:sysctl net.inet.ip.forwarding=1)
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值