docker and build app
docker 学习
1. docker关键点
1. images
docker镜像是一个只读的模板,上面才会有很多可写的layer层,镜像可以用来创建容器
container:是docker利用容器来运行应用,它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
备注:
docker 作为一种新的工具,是未来一个很有作为的产品。它按照集装箱的方式来管理,发布container内的应用。在开发部署,测试,软件交付,环境搭建(某些东西我直接docker pull 多好,不需要在自己费尽去折腾环境)方面有着很大的想象空间。基于docker的各个特点,未来将可能改变现在开发的很多东西
2. docker 安装
mac and ubuntu
linux (docker-engine, docker-machine, docker-compose)
- 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
-
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
-
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