Docker入门
1. 微服务的持续构建与部署
2. Docker概念
3. Docker产生背景
3.1物理机时代
物理机-》安装操作系统 -》安装jdk …… 如果需要部署集群,那么就要增加物理机,会带来如下问题:
- 硬件成本增加
- 资源浪费,不能充分利用物理机的资源
- 硬件资源限制
- 运维成本
3.2 虚拟机时代
虚拟化技术:
充分利用资源:一台物理机上虚拟出来多个虚拟机去部署,充分利用物理机的磁盘,内存等硬件资源(以虚拟机为单位进行资源隔离)
更容易扩展
虚拟出来的机器,共享宿主机的物理资源,它可以有自己的操作系统和应用,问题也就在于它还是需要独自占用一个操作系统资源,虚拟机的操作系统资源本质还是宿主物理机的,有没有办法可以独立部署应用而不占用那么多的物理资源? 答案就是Docker
3.3 容器化
容器化:以进程为单位去进行资源隔离
4. Docker安装
(1)工具安装(需要root权限)
yum install -y yum-utils device-mapper-persistent-data lvm2
another app is holding the yum 问题处理:http://blog.itpub.net/29812844/viewspace-1988770/
执行rm -f /var/run/yum.pid ,然后重新安装即可
配置docker镜像源
[root@localhost kkxmoye]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
[root@localhost kkxmoye]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
Loaded plugins: fastestmirror, langpacks
adding repo from: https://download.docker.com/linux/centos/docker-ce.repo
grabbing file https://download.docker.com/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
repo saved to /etc/yum.repos.d/docker-ce.repo
[root@localhost kkxmoye]# yum clean all
Loaded plugins: fastestmirror, langpacks
Cleaning repos: base docker-ce-stable extras updates
Cleaning up list of fastest mirrors
[root@localhost kkxmoye]# yum makecache fast
Loaded plugins: fastestmirror, langpacks
Determining fastest mirrors
* base: mirrors.njupt.edu.cn
* extras: mirrors.njupt.edu.cn
* updates: mirrors.njupt.edu.cn
base | 3.6 kB 00:00:00
docker-ce-stable | 3.5 kB 00:00:00
extras | 2.9 kB 00:00:00
updates | 2.9 kB 00:00:00
(1/6): base/7/x86_64/group_gz | 153 kB 00:00:00
(2/6): extras/7/x86_64/primary_db | 230 kB 00:00:00
(3/6): updates/7/x86_64/primary_db | 6.5 MB 00:00:01
(4/6): base/7/x86_64/primary_db | 6.1 MB 00:00:01
(5/6): docker-ce-stable/7/x86_64/updateinfo | 55 B 00:00:02
(6/6): docker-ce-stable/7/x86_64/primary_db | 58 kB 00:00:02
Metadata Cache Created
[root@localhost kkxmoye]#
安装docker(默认会选择最近的一个镜像去安装)
[root@localhost kkxmoye]# yum -y install docker-ce
设置开机启动(centos7及以上,使用systemctl命令)
Complete!
[root@localhost kkxmoye]# systemctl start docker #启动docker
[root@localhost kkxmoye]# systemctl start docker.service #设置开机启动
[root@localhost kkxmoye]# systemctl enable docker.service #设置开机启动
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[root@localhost kkxmoye]#
如果安装下载较慢,可以配置镜像加速器: https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
vi /etc/docker/daemon.json
添加:
{
"registry-mirrors": ["https://ujeedfgc.mirror.aliyuncs.com"]
}
然后重启docker:
sudo systemctl daemon-reload
sudo systemctl restart docker
5. 拉取镜像及镜像启动
下载镜像:
启动tomcat:
-d 以守护进程方式运行
–name 进程的名字
-p 指定映射的端口 8080:8080 冒号前面的端口号是宿主机的访问端口,冒号后面的端口号是宿主机映射到docker容器上的tomcat的端口号
tomcat 镜像的名称,要和 docker images 命令中显示的镜像名相同,或者用镜像id
[root@localhost kkxmoye]# docker run -d --name first_tomcat -p 8080:8080 tomcat
去访问tomcat, 可以看到,能够访问到tomcat,但是找不到tomcat默认的主页,因为docker默认的tomcat的webapps目录下是空的,文件在webapps.dist里面
bd500 tomcat "catalina.sh run" 11 minutes ago Up 10 minutes 0.0.0.0:8080->8080/tcp first_tomcat
[root@localhost kkxmoye]# docker exec -it c3b6eb5bd500 /bin/bash # 登录到docker容器中的tomcat
root@c3b6eb5bd500:/usr/local/tomcat# ls
BUILDING.txt LICENSE README.md RUNNING.txt conf logs temp webapps.dist
CONTRIBUTING.md NOTICE RELEASE-NOTES bin lib native-jni-lib webapps work
root@c3b6eb5bd500:/usr/local/tomcat# mv webapps.dist/* webapps/
root@c3b6eb5bd500:/usr/local/tomcat#
exit 退出镜像
再去访问:
6. Docker常用命令
docker images 查看当前docker中的所有本地镜像
docker ps 查看运行中的容器(镜像一旦启动运行就变成了容器)
docker exec -it containerId /bin/bash 进入docker终端
docker pull [镜像版本] 拉取远程镜像仓库中的image
7. 镜像组成
镜像内部是由不同的层级来组成的:
已经存在的镜像,是可以直接拿来复用,不用再去下载;
镜像可以叠加:
- 联合文件系统
不同的操作系统,其内核都是相同的,
- 容器特性
原来的镜像层是只读的,如下图,tomcat的镜像是只读的,当tomcat镜像启动,成为容器后,它会多一个可写层
8. 自主构建镜像
构建一个自己的镜像,需要编写一个Dockerfile文件,如下:
FROM openjdk:8 # 构建docker容器的上一层的镜像
MAINTAINER lch@gupaoedu.com
LABEL name="gper-mall-eureka-server" version="1.0" author="lch" # 标签 版本
WORKDIR /gper/base # docker工作目录,不存在会创建
EXPOSE 9090 # 容器对外的访问端口
ADD ./spring-cloud-eureka-server-9090-0.0.1-SNAPSHOT.jar ./gper-mall-eureka-server.jar # 从宿主机拷贝到docker容器
ENTRYPOINT ["java","-jar","gper-mall-eureka-server.jar"] #
将dockerfile和jar文件上传到宿主机之前,要保证jar包能够独立运行,因此eureka-server的pom中指定启动类:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<!-- 构建docker file 使用,首先要保证jar包能够独立运行 -->
<configuration>
<mainClass>com.gupaoedu.example.springcloudeurekaserver9090.SpringCloudEurekaServer9090Application</mainClass>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
用java-jar命令执行 jar包,能够正常启动后,将dockerfile和将要构建的jar包上传到宿主机:
然后执行构建命令: docker build -t gpermall:eureka-server . ( 注意,最后面有个点号)
[root@localhost app]# docker build -t gpermall:eureka-server .
Sending build context to Docker daemon 48.23MB
Step 1/7 : FROM openjdk:8
8: Pulling from library/openjdk
b9a857cbf04d: Already exists
d557ee20540b: Already exists
3b9ca4f00c2e: Already exists
667fd949ed93: Already exists
661d3b55f657: Already exists
60cfec2a948e: Pull complete
79ee4b4b7121: Pull complete
Digest: sha256:b253b93dc528967eff64ade00a9079dc464fb75b9d27a7a578c8006ca0645de8
Status: Downloaded newer image for openjdk:8
---> 8ca4a86e32d8
Step 2/7 : MAINTAINER lch@gupaoedu.com
---> Running in 9cc9605e9648
Removing intermediate container 9cc9605e9648
---> a7af69e20fc9
Step 3/7 : LABEL name="gper-mall-eureka-server" version="1.0" author="lch"
---> Running in 515f6fd6dad1
Removing intermediate container 515f6fd6dad1
---> 846479b7b6f8
Step 4/7 : WORKDIR /gper/base
---> Running in 179b3155abd8
Removing intermediate container 179b3155abd8
---> 28d52adc3d25
Step 5/7 : EXPOSE 9090
---> Running in 64d0d4d2bfe3
Removing intermediate container 64d0d4d2bfe3
---> de41a352c931
Step 6/7 : ADD ./spring-cloud-eureka-server-9090-0.0.1-SNAPSHOT.jar ./gper-mall-eureka-server.jar
---> 7bdf7c12e6a1
Step 7/7 : ENTRYPOINT ["java","-jar","gper-mall-eureka-server.jar"]
---> Running in db4ce1c8983b
Removing intermediate container db4ce1c8983b
---> e7668b4971ed
Successfully built e7668b4971ed
Successfully tagged gpermall:eureka-server
[root@localhost app]#
启动这个docker镜像:docker run --name eureka-server-9090 -p 9090:9090 gpermall:eureka-server
然后就可以访问到docker容器上运行的项目了:
9. Docker持久化——Volume
在启动镜像前,加上-v参数,下面这个命令中的-v参数,表示将容器中的/usr/local/webapps 映射到宿主机上的/tmp/webapps目录下,这样即使容器中的数据删除了,容器下次启动后还是可以读取到webapps目录下的数据
**docker run -d --name tomcat_8080 -p 8080:8080 -v /tmp/webapps:/usr/local/tomcat/webapps tomcat
**
[root@localhost webapps]# docker run -d --name tomcat8080 -p 8080:8080 -v /tmp/webapps:/usr/local/tomcat/webapps tomcat
f90fab2c0966e1a847fa01c238bc302b2bc8ea941fb56a8dfb4d08dbdaabe211
[root@localhost webapps]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f90fab2c0966 tomcat "catalina.sh run" 16 seconds ago Up 15 seconds 0.0.0.0:8080->8080/tcp tomcat8080
[root@localhost webapps]# docker exec -it f90fab2c0966 /bin/bash
root@f90fab2c0966:/usr/local/tomcat# mv webapps.dist/* webapps/
root@f90fab2c0966:/usr/local/tomcat# ls webapps
ROOT docs examples host-manager manager
root@f90fab2c0966:/usr/local/tomcat# exit
exit
[root@localhost webapps]# ls /tmp/webapps/
docs examples host-manager manager ROOT
[root@localhost webapps]#
上面的脚本,通过-v命令启动了tomcat镜像,这里可以看到,镜像容器中的usr/local/tomcat/webapps目录下发生了改变 ,宿主机的/tmp/webapps目录下也对应改变了:
这里停止并删掉tomcat容器,然后再重新启动tomcat镜像:
[root@localhost webapps]# docker ps
doCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f90fab2c0966 tomcat "catalina.sh run" 4 minutes ago Up 4 minutes 0.0.0.0:8080->8080/tcp tomcat8080
[root@localhost webapps]# docker stop f90fab2c0966
f90fab2c0966
[root@localhost webapps]# docker rm f90fab2c0966
f90fab2c0966
[root@localhost webapps]# docker run -d --name tomcat8080 -p 8080:8080 -v /tmp/webapps:/usr/local/tomcat/webapps tomcat
aaf8ee487e37cfc0b399e7468747c8d17f12311235c0bb9e614a315636304211
[root@localhost webapps]#
可以发现,上面启动tomcat镜像后没有执行mv webapps.dist/* webapps/ 这个操作,访问tomcat还是能够进入到tomcat主页,说明持久化是生效了的。