1. Docker介绍html
Docker官网:http://www.docker.com。简单的说Docker是一个可以把开发的应用程序自动部署到容器的开源引擎。使用Docker须要先了解容器、镜像和仓库的概念。java
Docker的容器就是“软件界的集装箱”,它能够安装任意的软件和库文件,作任何的运行环境部署。白痴点说,咱们能够在Docker的容器中配置centos环境、安装配置jdk、tomcat等。这功能相似虚拟机,不过Docker容器与主机共享操做系统内核,不一样的容器之间能够共享部分系统资源,所以容器更加轻量级,消耗的资源也更少。而虚拟机会独占分配给本身的资源,几乎不存在资源共享,各个虚拟机实例之间近乎彻底隔离,所以虚拟机更加剧量级,消耗更多的资源。git
Docker的镜像相似虚拟机的镜像,可是能够从镜像仓库下载,Docker公司提供了不少镜像下载,咱们也能够本身建立镜像(很简单)并提供给别人下载使用。Docker的镜像是分层的,最底层的叫作基础镜像,而一个镜像能够放到另外一个镜像的顶部(相似继承的概念),好比咱们在内核、引导文件系统的基础上建立一个centos系统的镜像,又在这个centos上面建立了一个配置jdk的镜像,又在这个jdk的镜像上面建立了一个配置tomcat的镜像。这些镜像是只读的,当咱们从一个镜像启动容器时,Docker会在该镜像的最顶层加载一个读写文件系统,咱们操做Docker的就是在这读写层中执行。程序员
容器和镜像的关系相似:我先建立一个“人”类(镜像),而后咱们来实例化这个“人”类叫作“程序员”(容器),咱们在“人”类(镜像)的基础上,教这个“程序员”(容器)java,并让他输出“hello world”。github
若是你们用过git就会很好理解,通常咱们写完代码都会push到git的仓库中,提供给其余开发人员使用,或者直接从git上pull下来其余人写好的代码,而Docker的仓库管理的不只仅是代码,而是整个开发的环境,包括咱们的系统、环境变量、软件包和运行时执行的命令等。web
2. Docker安装redis
安装环境:centos7docker
1 # Docker:安装 2 yum -y install docker 3 # Docker:启动服务 4 systemctl start docker.service 5 # Docker:查看服务状态 6 systemctl status docker.service 7 # Docker:查看帮助 8 docker --help 9 # Docker:查看信息 10 docker info
3. Docker实践shell
1 # 运行Docker容器:Docker的命令都是docker开头,docker run就是运行容器的命令,-i参数标志保证容器中的STDIN是开启的,就是持久交互(…)的标准输入;-t参数告诉Docker为要建立的容器分配一个伪tty终端,这样新建立的容器就能提供一个交互式的shell,而不是一个运行在后台服务的容器;centos是咱们要使用的镜像名称,它由Docker公司提供,运行该命令的时候会首先在咱们的宿主机上找centos的镜像,若是有就直接使用,若是没有就从Docker Hub Registry上下载该镜像,相似的还有ubuntu、fedora甚至相似redis(配置好redis)和java(配置好java)的镜像;/bin/bash,是咱们告诉Docker在容器中要运行/bin/bash命令启动一个Bash shell。运行这个docker run命令后Docker就会在文件系统内部用这个镜像建立一个新容器,该容器拥有本身的网络、IP地址、以及一个用来和宿主机进行通讯的桥接网络接口。 2 docker run -it centos /bin/bash 3 4 # 启动容器以后,会进入以下("02f7b153c36c"是容器ID),至关于运行了一个新的虚拟机,以后咱们就能够在这里安装软件部署本身的环境,这就是一个"全新系统“,因此只有一些基础的命令和配置 5 [root@02f7b153c36c /]# 6 # 退出已进入的容器,返回到宿主机 7 exit 8 9 # 在宿主机查看正在运行和中止的容器 10 docker ps -a 11 12 # 在宿主机查看最后一次运行的容器 13 docker ps -l 14 15 # 重启容器,重启后能够用docker ps -l看到容器“02f7b153c36c”已经起来了 16 docker start 02f7b153c36c 17 18 # 从新进入容器 19 docker attach 02f7b153c36c 20 21 # 建立守护式容器,咱们也能够建立守护式容器,也就是在后台长期运行的容器,比较适用于运行应用程序和服务。咱们在docker run命令中的-d参数可使容器在后台运行,–name参数给该容器指定了一个名字,这样咱们能够根据容器的ID或者容器的名字来获取容器,而且咱们能够在建立容器的时候执行运行时命令,该命令会一直循环打印hello world,执行该命令后会返回一个容器的长UUID(每次建立一个容器至关于new一个新对象,获得不一样的实例) 22 docker run --name hello_world -d centos /bin/sh -c "while true; do echo hello world; sleep 1; done" 23 24 # 查看容器的日志,咱们可使用docker ps查看容器的状态,也可使用docker logs命令查看容器的日志,hello_world就是建立容器时指定的名字,咱们能够加-f参数来监控Docker日志,加-t参数为每一条日志加上时间戳。 25 docker logs hello_world 26 27 # 在容器内部运行进程,咱们能够对正在后台运行的容器执行命令,docker exec命令能够在容器内部额外启动新进程,-d参数是后台运行,也能够指定-it参数和/bin/bash命令开启交互式的进程,执行该命令咱们会在容器内的/etc下建立new_file文件。 28 docker exec -d hello_world touch /etc/new_file 29 30 # 中止容器,或者使用docker kill杀死容器,docker rm删除容器。 31 docker stop hello_world 32 33 # 杀死全部容器(目前没有支持杀死全部容器的命令) 34 docker kill $(docker ps -a -q) 35 36 # 删除全部容器(目前没有支持删除全部容器的命令) 37 docker rm $(docker ps -a -q)
4. Docker镜像ubuntu
1 # 查看镜像 2 docker images 3 # 咱们也能够在images后面指定查看某个镜像的内容,好比:docker images centos 4 5 # 拉去镜像 6 docker pull ubuntu:14.04 7 # docker pull就是拉取镜像了,ubuntu指定拉取哪一个镜像,后面的“:14.04”是这个镜像的标签(这里能够理解成ubuntu的版本,固然你能够随便给本身建立的镜像起名字和标签),若是咱们没有指定标签,Docker会默认给咱们的镜像一个“latest”标签,执行该命令就是咱们从Docker仓库拉取了一个具备14.04版本的ubuntu系统到本地。咱们也能够直接使用docker run命令运行某个镜像容器,若是该镜像本地不存在,也会先从Docker的仓库中拉取下来而后运行该镜像的容器。 8 9 # 查看docker仓库中的java镜像 10 docker search java 11 12 # 建立镜像 13 # 咱们可使用docker commit命令来建立镜像,可是通常推荐使用更灵活的docker build命令和Dockerfile文件来建立镜像。 14 # Dockerfile,我须要先建立一个存放Dockerfile文件的目录,而后使用touch建立一个Dockerfiler文件 15 touch Dockerfile 16 vim Dockerfile 17 ` 18 # Version: 0.0.1 19 FROM centos 20 MAINTAINER my name <zjm9109@126.com> 21 ENV UPDATE_TINE 2016-06-29 22 23 RUN yum -y install java-1.8.0-openjdk.x86_64 24 ENV JAVA_HOME /usr/lib/jvm/jre-1.8.0-openjdk-1.8.0.91-0.b14.el7_2.x86_64/ 25 ENV PATH $JAVA_HOME/bin:$PATH 26 ENV CLASSPATH .:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar 27 28 RUN mkdir /home/webapp 29 30 RUN yum -y install wget 31 RUN wget -P /home/webapp/ https://raw.githubusercontent.com/zjm9109/docker/master/1/beyond-center-webapp-0.0.1-SNAPSHOT.jar 32 33 ENTRYPOINT [ "java", "-jar", "/home/webapp/beyond-center-webapp-0.0.1-SNAPSHOT.jar" ] 34 35 EXPOSE 8080 36 ` 37 38 # Dockerfile文件的全部指令都是在开头,而且必须为大写字母,Dockerfile的指令会按从上到下的顺序执行,而且每条指令都会建立一个新的镜像层(前文说过的镜像继承关系),对该镜像进行提交并缓存起来,这样咱们能够在后期继续使用某一个镜像,好比咱们在Dockerfile中执行了一个下载java的指令,咱们再想下载java的时候,若是指令没有变就不须要从新下载,而直接使用该镜像(相似java中重用对象),也节省了内存不须要建立不少同样的镜像保存,也就是咱们构建同一个镜像,若是没有指令被修改,就会很快的构建完成,不过若是某一条指令修改了,那么从该指令以后的全部指令都会从新执行。 39 40 ` 41 Dockerfile指令 42 “#”用来注释,在这里我使用“#”在开头标注了版本; 43 “FROM”指令指定一个镜像的名字,若是本地存在则能够直接使用该镜像,若是本地不存在会从Docker仓库自动下载,后续的全部指令都是基于该镜像进行,我使用的是centos镜像; 44 “MAINTAINER ”指令告诉Docker建立该镜像人的名字、邮箱或者电话; 45 “ENV”指令会在该层镜像中设置环境变量,好比我在第三个指令中设置了“UPDATE_TINE”的环境变量,标注该镜像的修改时间,在第五个指令中设置了 “JAVA_HOME”的环境变量; 46 “RUN”指令会在该镜像运行指定的命令,好比第四个指令“RUN yum -y install java-1.8.0-openjdk.x86_64”会在该层镜像中下载一个1.8的jdk,在第八个指令中在该层镜像的“home”目录下建立了一个“webapp”目录; 47 “ENTRYPOINT”指令是在启动的容器的时候执行的命令,我在个人Dockerfile中使用该指令运行了一个我下载的jar; 48 “EXPOSE ”指令告诉Docker容器内的应用程序将会使用容器指定的端口,可是咱们不能任意访问容器运行中的服务端口,出于安全考虑Docker并不会自动打开该端口,咱们须要在docker run命令中另外加参数来指定须要打开的端口,我在个人Dockerfile中打开的是8080,由于个人jar默认运行的就是8080,后面会继续说明容器的端口问题。 49 其余经常使用指令 50 “CMD”指令相似“ENTRYPOINT”,不过“CMD”指令能够被docker run中的容器启动命令覆盖,而“ENTRYPOINT”只会把docker run中的容器启动命令做为参数不会被覆盖; 51 “WORKDIR”指令用于在容器内部设置一个工做目录,“ENTRYPOINT”和“CMD”指定的程序会在这个目录下执行; 52 “USER”指令用于指定镜像会以什么样的用户运行; 53 “COPY”指令用来将构建环境下的文件和目录复制到镜像中,好比:“COPY index.html /opt/webapp/index.html”指令用来把宿主机的index.html文件复制到镜像中的/opt/webapp/文件夹中,而且也叫index.html,也能够直接复制整个目录,因此咱们能够在宿主机上下载好个人jar,使用“COPY”复制到镜像中使用; 54 “ADD”指令和“COPY”指令相似,用来将构建环境下的文件和目录复制到镜像中,不过“ADD”指令能够复制URL,而且复制归档文件时自动解压; 55 “VOLUME”指令用来向基于镜像建立的容器添加卷,一个卷能够存在于一个或多个容器内的特定的目录。这个目录能够绕过联合文件系统,能够提供数据共享或者对数据进行持久化的功能,下文会继续介绍卷 56 ` 57 58 # 构建镜像 59 docker build -t webapp:v1 .
参考文档:
https://blog.csdn.net/zjm9109/article/details/51785057