一、简介
1、虚拟化
Docker 是⼀个开源项⽬,诞⽣于 2013 年初,最初是 dotCloud 公司内部的⼀个业余项⽬。它基于 Google 公司推出的 Go 语⾔实现。 项⽬后来加⼊了 Linux 基⾦会,遵从了 Apache 2.0 协议,项⽬代码在 GitHub 上进⾏维护。
为什么选择Docker?
- (1)上⼿快。
⽤户只需要⼏分钟,就可以把⾃⼰的程序“Docker化”。Docker依赖于“写时复制”(copy-on-write)模型,使修改应⽤程序也⾮常迅速,可以说达到“随⼼所致,代码即改”的境界。随后,就可以创建容器来运⾏应⽤程序了。⼤多数Docker容器只需要不到1秒中即可启动。由于去除了管理程序的开销,Docker容器拥有很⾼的性能,同时同⼀台宿主机中也可以运⾏更多的容器,使⽤户尽可能的充分利⽤系统资源。
- (2)职责的逻辑分类
使⽤Docker,开发⼈员只需要关⼼容器中运⾏的应⽤程序,⽽运维⼈员只需要关⼼如何管理容器。Docker设计的⽬的就是要加强开发⼈员写代码的开发环境与应⽤程序要部署的⽣产环境⼀致性。从⽽降低那种“开发时⼀切正常,肯定是运维的问题(测试环境都是正常的,上线后出了问题就归结为肯定是运维的问题)”
- (3)快速⾼效的开发⽣命周期
Docker的⽬标之⼀就是缩短代码从开发、测试到部署、上线运⾏的周期,让你的应⽤程序具备可移植性,易于构建,并易于协作。(通俗⼀点说,Docker就像⼀个盒⼦,⾥⾯可以装很多物件,如果需要这些物件的可以直接将该⼤盒⼦拿⾛,⽽不需要从该盒⼦中⼀件件的取。)
- (4)⿎励使⽤⾯向服务的架构
Docker还⿎励⾯向服务的体系结构和微服务架构。Docker推荐单个容器只运⾏⼀个应⽤程序或进程,这样就形成了⼀个分布式的应⽤程序模型,在这种模型下,应⽤程序或者服务都可以表示为⼀系列内部互联的容器,从⽽使分布式部署应⽤程序,扩展或调试应⽤程序都变得⾮常简单,同时也提⾼了程序的内省性。(当然,可以在⼀个容器中运⾏多个应⽤程序)
2、Docker组件
2.1 Docker服务器与客户端
Docker是⼀个客户端-服务器(C/S)架构程序。Docker客户端只需要向Docker服务器或者守护进程发出请求,服务器或者守护进程将完成所有⼯作并返回结果。Docker提供了⼀个命令⾏⼯具Docker以及⼀整套RESTful API。你可以在同⼀台宿主机上运⾏Docker守护进程和客户端,也可以从本地的Docker客户端连接到运⾏在另⼀台宿主机上的远程Docker守护进程。
- 服务端(server):Docker守护进程,负责处理Docker指令,管理镜像、容器等
- 客户端(client):通过命令或RestAPI向Docker服务端发送指令。可以在本地或远程向服务端发送指令。
2.2 Docker镜像与容器
Docker中有几个重要的概念:
镜像(Image):Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。
容器(Container):镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器进程做隔离,对外不可见。
镜像是构建Docker的基⽯。⽤户基于镜像来运⾏⾃⼰的容器。镜像也是Docker⽣命周期中的“构建”部分。镜像是基于联合⽂件系统的⼀种层式结构,由⼀系列指令⼀步⼀步构建出来
Docker可以帮助你构建和部署容器,你只需要把⾃⼰的应⽤程序或者服务打包放进容器即可。容器是基于镜像启动起来的,容器中可以运⾏⼀个或多个进程。我们可以认为,镜像是Docker⽣命周期中的构建或者打包阶段,⽽容器则是启动或者执⾏阶段。 容器基于镜像启动,⼀旦容器启动完成后,我们就可以登录到容器中安装⾃⼰需要的软件或者服务。
Docker也不关⼼你要把容器运到何⽅:我们可以在⾃⼰的笔记本中构建容器,上传到Registry,然后下载到⼀个物理的或者虚拟的服务器来测试,在把容器部署到具体的主机中。像标准集装箱⼀样,Docker容器⽅便替换,可以叠加,易于分发,并且尽量通⽤。
2.3 Registry(注册中⼼)
Docker⽤Registry来保存⽤户构建的镜像。Registry分为公共和私有两种。Docker公司运营公共的Registry
叫做Docker Hub
。⽤户可以在Docker Hub注册账号,分享并保存⾃⼰的镜像(说明:在Docker Hub下载镜像巨慢,可以⾃⼰构建私有的Registry)。
开源应用程序非常多,打包这些应用往往是重复的劳动。为了避免这些重复劳动,人们就会将自己打包的应用镜像,例如Redis、MySQL镜像放到网络上,共享使用,就像GitHub的代码共享一样。
- DockerHub:DockerHub是一个官方的Docker镜像的托管平台。这样的平台称为Docker Registry。
- 国内也有类似于DockerHub 的公开服务,比如 网易云镜像服务、阿里云镜像库等。
我们一方面可以将自己的镜像共享到DockerHub,另一方面也可以从DockerHub拉取镜像:
3、小结
Docker如何解决大型项目依赖关系复杂,不同组件依赖的兼容性问题?
- Docker允许开发中将应用、依赖、函数库、配置一起打包,形成可移植镜像
- Docker应用运行在容器中,使用沙箱机制,相互隔离
Docker如何解决开发、测试、生产环境有差异的问题?
- Docker镜像中包含完整运行环境,包括系统函数库,仅依赖系统的Linux内核,因此可以在任意Linux操作系统上运行
Docker是一个快速交付应用、运行应用的技术,具备下列优势:
- 可以将程序及其依赖、运行环境一起打包为一个镜像,可以迁移到任意Linux操作系统
- 运行时利用沙箱机制形成隔离容器,各个应用互不干扰
- 启动、移除都可以通过一行命令完成,方便快捷
4、Docker和虚拟机的区别
Docker可以让一个应用在任何操作系统中非常方便的运行。而以前我们接触的虚拟机,也能在一个操作系统中,运行另外一个操作系统,保护系统中的任何应用。
两者有什么差异呢?
虚拟机(virtual machine)是在操作系统中模拟硬件设备,然后运行另一个操作系统,比如在 Windows 系统里面运行 Ubuntu 系统,这样就可以运行任意的Ubuntu应用了。
Docker仅仅是封装函数库,并没有模拟完整的操作系统,如图:
对比来看:
小结:
Docker和虚拟机的差异:
- docker是一个系统进程;虚拟机是在操作系统中的操作系统
- docker体积小、启动速度快、性能好;虚拟机体积大、启动速度慢、性能一般
二、安装Docker
1、安装docker
yum
包更新到最新
yum update
安装需要的软件包
yum-util
提供yum-config-manager
功能,另外两个是devicemapper
驱动依赖的
yum install -y yum-utils device-mapper-persistent-data lvm2
设置yum
源为阿⾥云
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装docker
yum install docker-ce
查看docker
版本
docker -v
2、设置ustc
的镜像
ustc是⽼牌的linux镜像服务提供者了,还在遥远的ubuntu 5.04版本的时候就在⽤。ustc的docker镜像加速器速度
很快。ustc docker mirror的优势之⼀就是不需要注册,是真正的公共服务。
https://lug.ustc.edu.cn/wiki/mirrors/help/docker
https://lug.ustc.edu.cn/wiki/mirrors/help/docker
编辑该⽂件(本身没有该文件,编辑后即可添加):
vim /etc/docker/daemon.json
在该⽂件中输⼊如下内容:
{ "registry-mirrors": [ "https://docker.mirrors.ustc.edu.cn" ] }
3、docker的启动与停止
启动/停止docker
# 启动docker systemctl start docker # 停止docker systemctl stop docker # 重启docker systemctl restart docker # 查看docker状态 systemctl status docker
开机启动docker
systemctl enable docker
查看docker
概要信息
docker info
查看docker
帮助文档
docker --help
三、常用命令
1、镜像相关命令
1.1 查看镜像
docker images
- REPOSITORY:镜像名称。
- TAG:镜像标签。
- IMAGE ID:镜像ID。
- CREATED: 镜像的创建⽇期(不是获取该镜像的⽇期)。
- SIZE: 镜像⼤⼩。
这些镜像都是存储在Docker宿主机的/var/lib/docker⽬录下
1.2 搜索镜像
从网路中搜索镜像
docker search 镜像名称 docker search mysql
- NAME: 仓库名称
- DESCRIPTION: 镜像描述
- STARS: ⽤户评价,反应⼀个镜像的受欢迎程度
- OFFICIAL: 是否官⽅
- AUTOMATED: ⾃动构建,表示该镜像由Docker Hub⾃动构建流程创建的
1.3 拉取镜像
从中央仓库下载镜像到本地
docker pull 镜像名称 docker pull mysql
1.4 删除镜像
根据镜像ID删除镜像
docker rmi 镜像ID
删除所有镜像
docker rmi 'docker images -q'
2、容器相关命令
2.1 容器内容查看
查看正在运行容器
docker ps
查看所有容器
docker ps -a
查看最后一次运行的容器
docker ps -l
查看停止的容器
docker ps -f status=exited
2.2 查看容器详情
docker container inspect 8e62a22b080b
2.3 创建与启动容器
创建容器命令:docker run
docker run
=docker create
+docker start
- -i: 表示运⾏容器
- -t: 表示容器启动后会进⼊其命令⾏。加⼊这两个参数后,容器创建就能登录进去。即分配⼀个伪终端。
- –name: 为创建的容器命名。
- -v: 表示⽬录映射关系(前者是宿主机⽬录,后者是映射到宿主机上的⽬录),可以使⽤多个-v做多个⽬录或⽂件映射。注意:最好做⽬录映射,在宿主机上做修改,然后共享到容器上。
- -d: 在run后⾯加上-d参数,则会创建⼀个守护式容器在后台运⾏(这样创建容器后不会⾃动登录容器,如果只加-i -
- -p: 表示端⼝映射,前者是宿主机端⼝,后者是容器内的映射端⼝。可以使⽤多个-p做多个端⼝映射t两个参数,创建后就会⾃动进去容器)。
1. 交互式创建容器
docker run -it --name=容器名称 镜像名称:标签 /bin/bash
退出容器
exit
2. 守护式方式创建容器
docker run -di --name=容器名称 镜像名称:标签
# 启动Redis docker run -di --name=myredis -p 6379:7379 redis
登录守护式容器方式
docker exec -it 容器名称(或容器ID) /bin/bash
# 登录 redis docker exec -it 35f3bf9a06ef /bin/bash
2.4 启动和停止容器
启动容器
docker start 容器名称(或者容器ID) # 启动Redis docker start 35f3bf9a06ef
停止容器
docker stop 容器名称(容器ID) # 停止Redis docker stop 35f3bf9a06ef
2.5 文件拷贝
文件拷贝到容器中
docker cp 需要拷贝文件/目录 容器名称:容器目录
容器中文件拷贝出来
docker cp 容器名称:容器目录 拷贝后文件/目录
2.6 查看容器IP地址
docker inspect 容器名称(容器ID) # 查看Redis的ID docker inspect 35f3bf9a06ef
直接输出ID
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称(容器ID) # 获取指定IP docker inspect --format='{{.NetworkSettings.IPAddress}}' 35f3bf9a06ef
2.7 删除容器
docker rm 容器名称(容器ID) # 先停止容器、然后删除 docker stop 35f3bf9a06ef docker rm 35f3bf9a06ef
2.8 导入容器
导出容器是指,导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态。
docker export -o my.tar 8e62a22b080b
2.9 导入容器
将导出的容器导入之后会成为镜像。
docker import my.tar -- test01:1.1.1.1
2.10 查看统计信息
会显示 CPU 、内存、存储、网络等使用情况的统计信息
2.11 查看容器内进程
这个子命令类似于 Linux 系统中的 top 命令, 会打印出容器内的进程信息, 包括 PID 、 用户、时间、命令等。
docker top 8e62a22b080b
四、常见应用部署
1、MySQL部署
拉取MySQL镜像
docker pull centos/mysql-57-centos7
创建容器
docker run -di --name=tensquare_mysql -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 centos/mysql-57-centos7
-p
:代表端⼝映射,格式为 宿主机映射端⼝:容器运⾏端⼝-e
: 代表添加环境变量MYSQL_ROOT_PASSWORD
是root⽤户的登陆密码
2、Tomcat部署
拉取Tomcat
docker pull tomcat
创建容器
docker run -di --name=mytomcat -p 8080:8080 -v /usr/local/webapps:/usr/local/tomcat/webapps tomcat
3、Nginx部署
docker pull nginx
创建Nginx容器
docker run -di --name=mynginx -p 80:80 nginx
4、Redis部署
docker pull redis
创建容器
docker run -di --name=myredis -p 6379:6379 redis
五、数据备份和迁移
1、容器持久化为镜像
将运行中容器持久化为镜像
# 查看在运行容器 docker ps # 持久化Tomcat docker commit 78a69ea6da3a mytomcat_1
2、镜像备份
docker save -o [保存的目标文件名称] [镜像名称]
将镜像保存为tar文件
# 查看镜像(1中容器持久化的镜像) docker images # 保存为本地文件(mynginx.tar) docker save -o /data/mynginx.tar mytomcat_1
3、加载镜像文件
将保存到本地的镜像文件,加载到docker中
# 加载镜像 docker load -i mynginx.tar
六、自定义镜像部署(Dockerfile)
1、资源准备
下载JDK
wget https://codechina.csdn.net/weixin_44624117/software/-/raw/master/software/jdk-8u181-linux-x64.tar.gz
配置Docker打包配置文件:Dockerfile
# 指定基础镜像 FROM centos:8 # 拷贝jdk和java项目的包 COPY ./demo-docker.jar /tmp/app.jar COPY ./jdk-8u181-linux-x64.tar.gz /tmp/jdk-8u181-linux-x64.tar.gz # 配置环境变量 RUN cd /tmp \ && tar -zxvf /tmp/jdk-8u181-linux-x64.tar.gz -C /tmp # 配置环境变量 ENV JAVA_HOME=/tmp/jdk1.8.0_181 ENV PATH=$PATH:$JAVA_HOME/bin # 暴露端口 EXPOSE 8080 # 入口,java项目的启动命令 ENTRYPOINT java -jar /tmp/app.jar
创建Java项目并打包
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/test") public class Test { @RequestMapping("/test") public String get() { System.out.println("test"); return "test"; } }
https://download.csdn.net/download/weixin_44624117/86862162
配置完成后文件,完整文件(JDK+Jar+Dockerfile)
https://download.csdn.net/download/weixin_44624117/86862417
2、发布镜像
自定义发布到docker容器中
docker build -t docker_test:1.0 .
运行docker镜像
docker run -di --name=my_docker -p 8080:8080 e6bf70c38c35 /bin/bash
3、测试
curl http://localhost:8080/test/test
4、容器配置JDK环境
编写Dockerfile
文件
FROM centos:7.5.1804 RUN mkdir -p /opt/module RUN mkdir -p /opt/software COPY jdk-8u181-linux-x64.tar.gz /opt/software RUN tar -zxvf /opt/software/jdk-8u181-linux-x64.tar.gz -C /opt/module RUN rm -rf /opt/software/jdk-8u181-linux-x64.tar.gz ENV JAVA_HOME=/opt/module/jdk1.8.0_181 ENV PATH=$JAVA_HOME/bin:$PATH
构建镜像
docker build -t centos_java8:1.0.0 /root
5、为4添加ssh服务
Dockerfile
文件
# 设置继承镜像 FROM centos:7.5.1804 RUN mkdir -p /opt/module RUN mkdir -p /opt/software COPY jdk-8u181-linux-x64.tar.gz /opt/software RUN tar -zxvf /opt/software/jdk-8u181-linux-x64.tar.gz -C /opt/module RUN rm -rf /opt/software/jdk-8u181-linux-x64.tar.gz ENV JAVA_HOME=/opt/module/jdk1.8.0_181 ENV PATH=$JAVA_HOME/bin:$PATH # 提供作者信息 MAINTAINER atguigu_lzc (lizhenchao@atguigu.com) # 更换国内阿里云yum源 RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo RUN sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo RUN yum makecache # 安装sshd RUN yum install -y openssh-server openssh-clients RUN sed -i '/^HostKey/'d /etc/ssh/sshd_config RUN echo 'HostKey /etc/ssh/ssh_host_rsa_key'>>/etc/ssh/sshd_config # 生成 ssh-key RUN ssh-keygen -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key # 更改 root 用户登录密码为 RUN echo 'root:aaaaaa' | chpasswd # 开发 22 端口 EXPOSE 22 # 镜像运行时启动sshd RUN mkdir -p /opt RUN echo '#!/bin/bash' >> /opt/run.sh RUN echo '/usr/sbin/sshd -D' >> /opt/run.sh RUN chmod +x /opt/run.sh CMD ["/opt/run.sh"]
构建镜像
docker build -t centos_java_sshd:1.0 ./
docker images
运行容器
docker run -d -p 2222:22 515c6e742c17
登录测试
ssh root@localhost -p 2222