docker——介绍、安装、实践

1. Docker介绍

  • Docker简介

   Docker官网:http://www.docker.com。简单的说Docker是一个能够把开发的应用程序自动部署到容器的开源引擎。使用Docker需要先了解容器、镜像和仓库的概念。

  • Docker之容器

   Docker的容器就是“软件界的集装箱”,它可以安装任意的软件和库文件,做任何的运行环境部署。白痴点说,我们可以在Docker的容器中配置centos环境、安装配置jdk、tomcat等。这功能类似虚拟机,不过Docker容器与主机共享操作系统内核,不同的容器之间可以共享部分系统资源,因此容器更加轻量级,消耗的资源也更少。而虚拟机会独占分配给自己的资源,几乎不存在资源共享,各个虚拟机实例之间近乎完全隔离,因此虚拟机更加重量级,消耗更多的资源。

  • Docker之镜像

   Docker的镜像类似虚拟机的镜像,但是可以从镜像仓库下载,Docker公司提供了很多镜像下载,我们也可以自己创建镜像(很简单)并提供给别人下载使用。Docker的镜像是分层的,最底层的叫做基础镜像,而一个镜像可以放到另一个镜像的顶部(类似继承的概念),比如我们在内核、引导文件系统的基础上创建一个centos系统的镜像,又在这个centos上面创建了一个配置jdk的镜像,又在这个jdk的镜像上面创建了一个配置tomcat的镜像。这些镜像是只读的,当我们从一个镜像启动容器时,Docker会在该镜像的最顶层加载一个读写文件系统,我们操作Docker的就是在这读写层中执行。

  • Docker之容器和镜像的关系

   容器和镜像的关系类似:我先创建一个“人”类(镜像),然后我们来实例化这个“人”类叫做“程序员”(容器),我们在“人”类(镜像)的基础上,教这个“程序员”(容器)java,并让他输出“hello world”。

  • Docker之仓库

   如果大家用过git就会很好理解,一般我们写完代码都会push到git的仓库中,提供给其他开发人员使用,或者直接从git上pull下来其他人写好的代码,而Docker的仓库管理的不仅仅是代码,而是整个开发的环境,包括我们的系统、环境变量、软件包和运行时执行的命令等。

 

2. Docker安装

  安装环境:centos7

  • Docker安装及基本命令
 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
View Code

 

3. Docker实践

 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)
View Code

 

4. Docker镜像

 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 .
View Code

 

 

参考文档:

https://blog.csdn.net/zjm9109/article/details/51785057

posted @ 2018-09-20 11:51  hezhixiong  阅读(211)  评论(0编辑  收藏  举报