基于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 构建指令
- 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 设置指令
- 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
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 架构图
-
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