/ linux

基于docker部署应用

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

  • docker是轻量级容器技术,直接运行在linux之上,同时实现了虚拟技术的资源隔离,性能远远高于虚拟机技术
  • 将软件编译成一个镜像,在这个镜像里做好对软件的各种配置,然后发布,运行这个镜像,运行中的镜像称之为容器

1. 安装配置

centos 系统下安装

$ yum install docker #install
$ service docker start #run

Ubuntu系统下安装

$ sudo apt-get docker.io #install
$ service docker start #run

2. 镜像操作

  • 基本操作
$ docker tag [imageId] [imageName] #give an easy to understand name
$ docker images  #search images list
$ docker search node  #search image
$ docker pull docker.io/node  #download image
$ docker rmi image-id  #delete image
$ docker rmi ${docker images -q} #delete all image
$ docker build -t [iamgeNname] <dockerFilePath> #build iamge
$ docker ps  #search runing list [-a all list include runing and stop]
  • 运行镜像(创建实例)
$ docker run -i -t --rm \
           -p 3000:3000 \
           -v `pwd`:/src \
           ghost/docker-dev:0.1
           /bin/bash

参数:

  • -d 表示detached 执行完这句命令控制台将不会被阻碍,可继续输入命令操作,即守护进程方式运行
  • -i 在交互模式下启动容器(对比 -d 是在分离模式下). 这就意味一旦交互会话结束,容器就会退出
  • -t 会分配一个pseudo-tty.
  • -p 端口映射 6378:6379 将容器的6379映射到本机的6378
  • --name 指定容器的名称
  • --rm 会在退出时移除容器及其文件系统,如果不指定这个参数,容器会以停止状态一直存在磁盘上,你能从停止状态重新运行它
  • --privileged 拥有容器内对挂载卷的操作
  • --volumes-from 挂载容器卷,用来共享数据,备份、恢复和迁移数据
  • 定义容器卷docker run -d -v /dbdata --name db1 hellodocker/docker-dev:0.1
  • 其它实例引用docker run -d --volumes-from db1 --name db2 hellodocker/docker-dev:0.1,db2使用了db1的容器卷,当容器db1被删除时,容器卷也不会被删除,只有所有容器不再使用此容器卷时,才会被删除
  • /bin/bash 容器中运行的bash,直接与容器进行交互

  • -v $PWD:/src 将当前的工作目录挂载到主机上容器中的 /src 里面. 将当前目录作为一个卷挂在,而不是使用Dockerfile中的ADD命令,在文本编辑器中做的任何修改都可以立即在容器中看到

    docker挂载宿主机已存在目录后,在容器内对其进行操作,报“Permission denied”,可以指定特权参数--privileged启动容器

  • eg:docker run -it --privileged --rm -p 3000:3000 -v /web/hellodocker:/src hellodocker/docker-dev:0.1

  • 实例操作

$ docker start [container_id] #run container again
$ docker attach [container_id] #connection container
$ docker cp [container_id]:path:targetPath #复制容器内的文件到宿主机目录上
$ docker inspect [container_id] #查看容器详细信息
$ docker exec [container_id] [bash] #发送命令至容器内运行,如/bin/bash 启动容器交互
$ docker commit [container_name/id] [imageName/imageVersion] #将容器封装为一个镜像
  • 删除实例
docker rm $(docker ps -a -q) #删除所有停止的容器
  • 镜像离线安装
    cat ubuntu-14.04-x86_64.tar.gz |docker import - ubuntu:ubuntu14

3. 打包应用

Dockfile是一种被Docker程序解释的脚本,Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令。其指令是忽略大小写的,建议使用大写,使用 # 作为注释,每一行只支持一条指令,每条指令可以携带多个参数,根据作用可以分为两种,构建指令和设置指令

3.1 构建指令

  1. FROM(指定基础image)FROM <image>:<tag>
  • MAINTAINER(用来指定镜像创建者信息)
  • RUN(安装软件用),RUN可以运行任何被基础image支持的命令
    RUN <command> (the command is run in a shell - `/bin/sh -c`)  
    RUN ["executable", "param1", "param2" ... ]  (exec form)  
    
  • ENV(用于设置环境变量)ENV <key> <value>
  • ADD(从src复制文件到container的dest路径) ,构建指令,所有拷贝到container中的文件和文件夹权限为0755,uid和gid为0

3.2 设置指令

  1. VOLUME(指定挂载点),使容器中的一个目录具有持久化存储数据的功能,该目录可以被容器本身使用,也可以共享给其他容器使用,VOLUME ["<mountpoint>"]
  • ENTRYPOINT(设置container启动时执行的操作)
    ENTRYPOINT ["executable", "param1", "param2"] (like an exec, the preferred form)  
    ENTRYPOINT command param1 param2 (as a shell)  
    
  • CMD(设置container启动时执行的操作),设置指令,用于container启动时指定的操作。该操作可以是执行自定义脚本,也可以是执行系统命令。该指令只能在文件中存在一次,如果有多个,则只执行最后一条。
    CMD ["executable","param1","param2"] (like an exec, this is the preferred form)  
    CMD command param1 param2 (as a shell)  
    
  • WORKDIR(切换目录)设置指令,可以多次切换(相当于cd命令),对RUN,CMD,ENTRYPOINT生效,WORKDIR /path/to/workdir
  • EXPOSE(指定容器需要映射到宿主机器的端口)EXPOSE <port> [<port>...]
  • USER(设置container容器的用户)ENTRYPOINT ["memcached", "-u", "daemon"]

3.4 完整示例

Dockerfile

# Pull base image  
FROM ubuntu:13.10  
  
MAINTAINER zing wang "leidy6@qq.com"  
  
# update apt-get  
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe"> /etc/apt/sources.list  
RUN apt-get update  
  
# Install curl  
RUN apt-get -y install curl  
  
# Install JDK 7  
RUN cd /tmp &&  curl -L 'http://download.oracle.com/otn-pub/java/jdk/7u65-b17/jdk-7u65-linux-x64.tar.gz' -H 'Cookie: oraclelicense=accept-securebackup-cookie; gpw_e24=Dockerfile' | tar -xz  
RUN mkdir -p /usr/lib/jvm  
RUN mv /tmp/jdk1.7.0_65/ /usr/lib/jvm/java-7-oracle/  
  
# Set Oracle JDK 7 as default Java  
RUN update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-7-oracle/bin/java 300     
RUN update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-7-oracle/bin/javac 300     
  
ENV JAVA_HOME /usr/lib/jvm/java-7-oracle/  
  
# Install tomcat7  
RUN cd /tmp && curl -L 'http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.8/bin/apache-tomcat-7.0.8.tar.gz' | tar -xz  
RUN mv /tmp/apache-tomcat-7.0.8/ /opt/tomcat7/  
  
ENV CATALINA_HOME /opt/tomcat7  
ENV PATH $PATH:$CATALINA_HOME/bin  
  
ADD tomcat7.sh /etc/init.d/tomcat7  
RUN chmod 755 /etc/init.d/tomcat7  
  
# Expose ports.  
EXPOSE 8080  
  
# Define default command.  
ENTRYPOINT service tomcat7 start && tail -f /opt/tomcat7/logs/catalina.out  

tomcat7.sh

export JAVA_HOME=/usr/lib/jvm/java-7-oracle/  
export TOMCAT_HOME=/opt/tomcat7  
  
case $1 in  
start)  
  sh $TOMCAT_HOME/bin/startup.sh  
;;  
stop)  
  sh $TOMCAT_HOME/bin/shutdown.sh  
;;  
restart)  
  sh $TOMCAT_HOME/bin/shutdown.sh  
  sh $TOMCAT_HOME/bin/startup.sh  
;;  
esac  
exit 0 

运行

docker build -t ray/jdk-tomcat:0.1 .  
docker run -d -p 8080:8080 ray/jdk-tomcat:0.1 

4. 理论

  • docker 架构图
    docker 架构图

  • image

镜像就是一个只读的模板,可以用来创建 Docker 容器,并提供简单机制来创建镜像或者更新现有的镜像,可以共享使用

  • container

容器是来运行应用,容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以理解为简易版的linux环境和运行在其中的应用

  • repository

仓库是集中存放镜像文件的场所


5.其它

5.1 boot2Docker

boot2Docker是基于virtualBox虚拟机软件来运行docker,在windows下载使用boot2docker ssh 登录virtualBox虚拟机后,再执行常规命令

在windows命令行进入docker后,不能复制,而且操作也不方便,因此用支持SSH的工具来管理是很好的,比如SECURECRT, PUTTY等,推荐用SECURECRT.
在命令行下用boot2docker ip 可以查询到IP,默认的用户名和密码是: docker/tcuser

5.2 国内源

在下使用的是阿里源,注册阿里开发帐号,您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器:

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://89zirbnk.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

5.3 docker管理工具portainer

基于本地容器的部署,以192.168.2.29这台主机为例。

1.首先需要开启docker的2375端口

vi /etc/sysconfig/docker
centos6下使用 other_args=‘-Htcp://0.0.0.0:2375 -H unix:///var/run/docker.sock‘
centos7下使用 OPTIONS=‘-Htcp://0.0.0.0:2375 -H unix:///var/run/docker.sock‘

然后重启docker
2.拉取镜像并启动

docker pull portainer/portainer
docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v /opt/portainer:/data portainer/portainer

5.4 查看docker镜像构建信息

1.目录 /var/lib/docker/image/devicemapper/imagedb/content/sha256/,以镜像名开头的json文件
2.格式化查看:cat file.json|python -m json.tool