一、Docker介绍
1.1 引言
Docker解决的痛点:
环境不一致问题,多用户操作系统下会互相影响,运维成本过高问题,关于安装软件成本过高等。
1.2 Docker的思想
集装箱:
会将所有需要的内容放到不同的集装箱中,谁需要这些环境就直接拿这个集装箱就可以。
标准化:
- 运输的标准化:Docker有一个中央码头,所有上传的集装箱都放在这个中央码头。当需要某一环境,就直接指派“大海豚”去搬运这个集装箱。
- 命令的标准化:Docker提供了一系列的命令,帮助我们去获取\上传集装箱等操作。
- 提供了REST的API:衍生出了很多的图形化界面:Rancher等。
隔离性
Docker在运行集装箱中的内容时,会在Linux的内核中单独开辟出一部分空间,这部分空间不会影响到其他程序。
- 注册中心(中央码头):上面放的就是集装箱
- 镜像:集装箱
- 容器:运行起来的镜像
二、Docker的基本操作
2.1 安装Docker
# 1. 下载关于Docker的依赖环境
yum -y install yum-utils device-mapper-persistent-data lvm2
# 2. 设置Docker的镜像源,否则默认国外的拉取非常慢
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 3. 安装Docker
yum makecache fast
yum -y install docker-ce
# 4. 启动并设置为开机自动启动,测试
# 启动Docker服务
systemctl start docker
# 设置开机自动启动
systemctl enable docker
# 测试,使用hello-world模块
docker run hello-world
安装成功效果:
2.2 Docker的中央仓库
-
Docker官方的中央仓库:镜像最全,但因为在国外,所以下载速度很慢。
(
hub.docker.com
) -
国内镜像网站:
网易蜂巢(
c.163yun.com/hub
)、daoCloud(
hub.daocloud.io
)(免登录!)等。 -
在公司内部会采用私服的方式拉取镜像。
(需要添加配置:/etc/docker/daemon.json)若不存在需要手动创建文件
{ "registry-mirrors":["https://registry.docer-cn.com"], "insecure-registries":["<公司docker服务ip>:<公司docker服务port>"] } # 重启两个服务 systemctl daemon-reload systemctl restart docker
2.3 镜像的操作
docker pull
:拉取镜像到本地
docker pull 镜像名称[:tag] # tag:标签,为可选项,镜像版本
举例:docker拉取tomcat镜像
- 进入daocloud搜索tomcat,选择版本,点击拉取。
- 复制拉取命令。
- 执行docker指令。
docker pull daocloud.io/library/tomcat:8.5.16-jre8-alpine
执行效果:
联网进行下载,下载完成后进行SHA256校验,下载完毕。
Digest: sha256:0952282d72bf6254ebd361078d4262820973b94e250e30367048afb78cd8d9c6
Status: Downloaded newer image for daocloud.io/library/tomcat:8.5.16-jre8-alpine
daocloud.io/library/tomcat:8.5.16-jre8-alpine
docker images
:查看全部本地的镜像
特别的,CREATED表示在中央仓库创建的时间。
docker rmi
:删除本地镜像
docker rmi 镜像id
- rmi:remove image的缩写。
- 镜像id:即IMAGE ID,镜像的标识,是镜像的唯一id。
(可以简写为前几个字母/数字)
docker load/save
:镜像的导入、导出(不规范)
因为镜像大多是联网下载的。
将本地镜像导出:
docker save -o 导出路径 镜像id
加载本地镜像文件:
docker load -i 镜像文件
演示:
- 将本地环境下已安装的tomcat镜像打包导出,命名为my_tomcat.image:
命令:docker save -o ./my_tomcat.image 4560891aa934
2. 为了演示差异性,先行删除已安装好的tomcat镜像
3. 导入我们产生的tomcat镜像文件
命令:docker load -i my_tomcat.image
4. 此时tomcat镜像就已经导入成功。我们发现它的镜像id、文件大小都是和之前网络上下载的tomcat版本无异,说明此tomcat镜像id确实是唯一的。但是他的名称和tag都为
<none>
,所以为了后续操作,我们还是修改一下其名称比较好。
docker tag
:镜像的重命名
docker tag 镜像id 重命名名称:tag名称
演示:
修改刚刚导入镜像的名称为my_tomcat
,tag设为666
,译为版本号
2.4 容器的操作
docker run
:运行容器
简单写法:
docker run 镜像id
或
docker run 镜像名称[:tag]
常用写法:
docker run -d -p 宿主机端口:容器端口 --name 容器名称[:tag]
如果本地存在此镜像id或镜像名称,就会直接运行容器。
如果不存在,就会在网络上下载后完成运行。
- -d(
daemon
):表示后台运行容器。不加此选项即为前台进程,会占满整个shell界面,如果想要执行其他操作,容器就随即停止了。 - -p(
port
):指定特殊端口。为了映射当前Linux系统端口和容器端口。 - –name:容器名称。指定容器的名称。
docker start
:启动容器
因为容器启动后内部环境不会变化,所以使用者希望重新启动容器时使用此命令。
docker start 容器id
docker stop
:停止容器
docker stop 容器id
停止全部容器的命令:docker stop $(docker ps -qa)
docker rm
:删除容器
docker rm 容器id
删除全部容器的命令:docker rm $(docker ps -qa)
,前提是需要先停止容器。
docker ps
:查看正在运行的容器
docker ps [-q] [-a]
- -a(
all
):表示查看所有的容器,包括没有运行的容器。 - -q:表示只查看容器的标识(id),不查看其他信息。
docker logs
:查看容器日志
docker logs -f 容器id
- -f(
flush
):表示滚动查看日志的最后几行。
docker exec
:进入容器内部
docker exec -it 容器id bash
run是启动镜像,带的是镜像id。start启动的是容器,带的是容器的id。
三、Docker应用
3.1 准备工程文件
如Java项目打包好的的war文件。
3.2 准备MySQL容器
运行MySQL容器
docker run -d -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root daocloud.io/library/mysql:5.7.4
3.3 准备tomcat容器
运行tomcat容器,之后将war包通过命令部署到容器内部即可。
命令:
docker cp 文件名称 容器id:容器内部路径
如本项目:docker cp ssm.war fe12ed123:/usr/local/tomcat
此时,通过web访问ip:3306端口就可以查看到ssm服务。
四、数据卷
前面为了部署ssm的工程,需要使用cp
命令将宿主机内的ssm.war
文件复制到容器内部。
- 数据卷:
将宿主机的一个目录映射到容器的一个目录中。在宿主机中操作目录中的内容,那么容器内部的文件也会跟着一起改变。就像是容器在本地的一个操作符。
4.1 创建数据卷
docker volume create 数据卷名称
创建数据卷之后,默认会存放在一个目录下:/var/lib/docker/volumes/数据卷名称/_data
,此时只是在宿主机上创建目录,还未映射到容器内部。
4.2 查看具体数据卷详细信息
docker volume inspect 数据卷名称
4.3 查看全部数据卷
docker volume ls
4.4 删除数据卷
docker volume rm 数据卷名称
4.5 应用数据卷
- 当映射数据卷时,若数据卷不存在,Docker会自动创建。
特点:会将容器内部自带的文件,存储在默认的存放路径中。
docker run -v 数据卷名称:容器内部的路径 镜像id
- 指定一个路径作为数据卷的存放位置【推荐】
特点:不会将容器内部自带的文件,存储在默认的存放路径中。
docker run -v 路径:容器内部的路径 镜像id
eg:
docker run -d -p 8080:8080 --name ssm_tomcat -v /data/local/giturtle:/usr/local/tomcat/webapps b8djw6wd
启动容器时创建数据卷在giturtle这个数据卷目录,此目录时/usr/local/tomcat/webapps目录的映射,这个路径下是空的。
五、Docker自定义镜像
我们拉取镜像的中央仓库,也是Docker的用户们上传上去的。下面讲解如何上传自定义的镜像文件。
1. 创建一个Dockerfile文件,并且指定自定义镜像信息,主要包括:
- from:指定当前自定义镜像依赖的环境。
- copy:将相对路径下的内容复制到自定义镜像中。
- workdir:声明镜像的默认工作目录。
- cmd:需要执行的命令(在workdir下执行,cmd可以写多个,但只以最后一个为准)。
eg:自定义一个tomcat镜像,并将ssm.war部署到tomcat中
from daocloud.io/library/tomcat:8.5.15-jre8 copy ssm.war /usr/local/tomcat/webapps
(保证ssm.war与Dockerfile在同一目录)
- 将准备好的Dockerfile和相应文件拖拽到Linux操作系统中,通过Docker命令制作镜像。
docker build -t 镜像名称:[tag] .
此时创建出了自定义镜像,通过docker images
可查看到。
(.
表示把当前目录下的Dockerfile文件制作成自定义镜像)
六、Docker-Compose
之前运行一个镜像需要添加大量的参数,现在可以通过Docker-Compose编写这些参数。类似于Makefile文件。
Docker-Compose可以帮我们批量的管理容器。
只需要通过docker-compose.yml
文件维护即可。
6.1 下载Docker-Compose
- 去GitHub官网搜索Docker-Compose。
(推荐1.24.1版本) - 将下载好的文件发送至Linux操作系统中。
- 需要将文件名修改为Docker-Compose,给予其可执行权限。
- 方便后期操作,配置一个环境变量。在
/etc/profile
中环境变量里,添加/usr/local/bin
目录,此目录下存放的就是Docker-Compose文件。
(放置在两:
之间即可) - source /etc/profile加载一下配置文件,使其生效。此时在任意目录输入docker-compose命令,出现许多Options选项时说明配置加载成功。