docker and build app

docker 学习

1. docker关键点

1. images

docker镜像是一个只读的模板,上面才会有很多可写的layer层,镜像可以用来创建容器

container:是docker利用容器来运行应用,它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。

docker hub

备注:

docker 作为一种新的工具,是未来一个很有作为的产品。它按照集装箱的方式来管理,发布container内的应用。在开发部署,测试,软件交付,环境搭建(某些东西我直接docker pull 多好,不需要在自己费尽去折腾环境)方面有着很大的想象空间。基于docker的各个特点,未来将可能改变现在开发的很多东西

2. docker 安装

mac and ubuntu

linux (docker-engine, docker-machine, docker-compose)
  1. docker-engine

一般Linux现在都基本上可以满足: > 3.11.0-15-generic

  $ uname -r 
  need >= 3.11.0-15-generic

Update apt sources

  sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D

  sudo vim /etc/apt/sources.list.d/docker.list
  
  #On Ubuntu Precise 12.04 (LTS)
  deb https://apt.dockerproject.org/repo ubuntu-precise main

  # On Ubuntu Trusty 14.04 (LTS)
  deb https://apt.dockerproject.org/repo ubuntu-trusty main

  # On Ubuntu Vivid 15.04
  deb https://apt.dockerproject.org/repo ubuntu-wily main

  # Ubuntu Wily 15.10 
  deb https://apt.dockerproject.org/repo ubuntu-wily main

  apt-get update
  
  # 移除旧lxc-docker 
  apt-get purge lxc-docker 
  # 查看docker policy 
  apt-cache policy docker-engine
  
  # Install the recommended package.
  sudo apt-get update && sudo apt-get install linux-image-extra-$(uname -r)

  # install 
  sudo apt-get install docker-engine

  # start
  sudo service docker start
  1. docker-machine

     curl -L https://github.com/docker/machine/releases/download/v0.5.0/docker-machine_linux-amd64.zip >machine.zip && \ unzip machine.zip && \ rm machine.zip
    
        
     # this will be denyed
     sudo mv docker-machine* /usr/local/bin
    
     # add chmod 
     sudo chomd +x /usr/local/bin/docker-machine
    
     # or just run this command and redo above 
     su -i 
    
  2. docker-compose

     curl -L https://github.com/docker/compose/releases/download/1.5.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
    
     chmod +x /usr/local/bin/docker-compose
    

3. docker几个重要的工具

3.1 docker daemon –> docker-machine

用户不会直接和docker容器打交道,是通过docker daemon交互,再由daemon发送singal给容器,因此每次都必须开始daemon

docker-machine create --driver virtualbox test # 创建
docker-machine env test  # 查看env    

每次启动docker daemon的时候必须进行配置(初始化),或者直接写入到zsh里面,每次加载。

# Run this command to configure your shell:
# eval "$(docker-machine env test)" 


docker-machine ip dokcer # 查看ip 

4. 获取 images

4.1 from docker.io

docker pull images 

4.2 build by Dockerfile

touch Dockerfile 

FROM ruby:2.2.0
MAINTAINER freeza91 <useyes91@gmail.com>
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev
RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
ADD . /myapp

build

docker build -t tag_name . # build当前路径下的Dockerfile

一些常用的命令

docker images # 当前本地的镜像
docker rmi $(docker images | grep "^<none>" | awk "{print $3}") # Remove all untagged images
docker rmi image_id 
docker tag image_id tag_name # 给images指定tag

push

docker run -t -i images /bin/bash # for get container_id 

docker commit -m 'message' -a 'author' container_id tags

docker login 

docker push freeza91/xxx

4. 操作容器

docker run -t -i images /bin/bash # open docker
docker exec -it container_id bash # enter container

5. docker-compose

5.1 build

docker-compose build . 

web:
  build: .
  container_name: my_container 
  command: ruby app.rb -o 0.0.0.0
  volumes:
    - .:/myapp
  expose:
    - "4567"
  ports:
    - "8000:4567"


# other settings
    env_file: xxxx
    environment: xxx
    expose: port
    extend: base_file.yml
    external_links: other_image_container # 链接到 docker-compose.yml 外部的容器,
                                                 # 甚至 并非 Compose 管理的容器
    image: link_image_tag
    links: link_other image container # 链接到其它服务中的容器。使用服务名称(同时作为别名)
                                             # 或服务名称:服务别名 (SERVICE:ALIAS) 格式都可以。

docker build 和 docker-compose build 均可构建images,不同之处在于docker build更多用于构建image自身,docker-compose 多用于构建一个应用(构建自身,关联其他images)。

5.2 数据卷

volumes

一个共享的目录。当更新文件后,会同步到container中。

5.3 build and up

docker-compose build web 
docker-compse up web -d 

5.4 start app with differnet images

web:
  image: sinatra_with_mysql_redis
  container_name: my_test
  command: shotgun app.rb -o 0.0.0.0
  volumes:
    - .:/myapp
  ports:
    - "8000:9393"
  links:
    - redis
    - db
  external_links:
    - others

redis: 
  image: redis
  container_name: redis_
  ports:
    - "9393:6372"
db:
  image: mysql
  container_name: mysql_
  environment:
    - MYSQL_ROOT_PASSWORD=root
others:
  images: pg
  container_name: pg_

docker-compose是构建一个完成app的工具,一般在构建过程中,尽量要保证一个container运行一种应用。如果link其他image的话,其他app也会使用的话,可以多使用external_links

docker container 之间是自己创建的一种通信方式,不需要在暴露给外面

针对正在运行的container, 进入container对应用配置的话,可使用命令:

  docker run -it container_name/container_id bash
  
  docker logs container_id/container_name

6. docker 交付

example