一、Docker架构图
1.1 仓库
Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。
1.2 镜像
Docker 镜像是用于创建 Docker 容器的模板,类似于Java中类的概念。
1.3 容器
是独立运行的一个或一组应用。通过镜像创建生成,类似于Java中的对象概念。
二、Docker安装
在CentOS上安装Docker(CentOS版本必须7+)
2.1 安装前置环境
yum install -y yum-utils device-mapper-persistent-data lvm2
2.2 设置docker-ce版安装源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
2.3 安装docker
yum -y install docker-ce
2.4 启动/停止docker
systemctl start/stop docker
2.5 基于阿里云配置镜像加速
登录网址: https://dev.aliyun.com/
按照官方的操作文档修改配置文件即可 <br />注意:如果/etc/docker/daemon.json文件不存在,创建一个即可
拿到加速地址后:
step1:进入docker目录下
step2:新建一个文件daemon.json
step3:复制加速地址
step4:保存后执行下面两个命令
sudo systemctl daemon-reload
sudo systemctl restart docker
2.6 重启docker服务
systemctl restart docker
2.7 测试docker服务
docker run hello-world
三、Docker的基本命令
3.1 镜像相关的命令
3.1.1 搜索镜像
docker search [镜像名称]
参数介绍:
-f, --filter 根据提供的条件过滤器输出
--format 用Go模板打印出漂亮的搜索结果
--limit [n] 搜索结果的最大数量(默认值为25)
--no-trunc 不要截断输出
3.1.2 拉取镜像(从仓库中下载镜像到本地)
docker pull [镜像名称][:标签]
例子:docker pull tomcat:8
在https://hub.docker.com/找docker镜像资料和版本号
注意:
拉取镜像时如果没有显示的指定tag标签,默认会拉取latest标签的版本镜像
3.1.3 查看本地镜像
docker images
参数介绍:
-q 只显示镜像唯一的标识信息
3.1.4 删除镜像
docker rmi [镜像名称:tag]/[镜像ID]
例子:
docker rmi tomcat:8
docker rmi f19c56ce92a8
参数介绍:
-f 强制删除镜像
3.1.5查看容器详细信息
docker inspect 容器名
例子:docker inspect mysql
3.2 容器相关的命令
3.2.1 根据镜像运行容器
docker run [镜像名称][:tag]
参数介绍:
-i 保持和 docker 容器内的交互
-t 为容器的标准输入,虚拟一个tty
-d 后台运行容器
--rm 容器在启动后,执行完成命令或程序后就销毁(不可于 -d 一起使用)
--name 给容器起一个自定义名称
--restart docker 1.12 新增加的参数,用来指定容器的重启策略, 当前提供的策略包括:
no 默认值,如果容器挂掉不自动重启。
on-failure,若容器的退出状态非0,则docker自动重启容器,还可以指定重启次数
always,只要容器退出,则docker将自动重启容器
例子:docker run -d --name mytomcat -p 9999:8080 --restart=always tomcat:8
-p 将宿主机中的某个端口映射到容器中的某个端口上
8888:宿主机端口 8080:容器端口
说明:由于浏览器访问不了tomcat容器里的端口,所以需要宿主机的端口映射到容器中的端口上
3.2.2 查看容器
docker ps
参数介绍:
-a 查看所有容器(默认不查询停止的容器)docker ps -a
-q 只查询容器的id
3.2.3 容器启动/停止/重启
docker start/stop/restart 容器名称
如果重启出现以下错误
step1:启动一下docker
systemctl restart docker
重启后,mytomcat并没有启动
step2:启动mytomcat
docker start mytomcat
【测试】访问
如果浏览器访问不了tomcat,则修改文件
把webapps.dist里面的文件全部复制到webapps里面
退出后重启tomcat:docker restart mytomcat
3.2.4 查看容器的元数据
docker inspect 容器名称
3.2.5 删除容器
docker rm 容器名称
参数介绍:
-f 表示强制删除一个容器(默认不能删除一个运行中的容器)
3.2.6 进入容器中
docker exec [option] 容器名称 [args]
例子:docker exec -it mytomcat bash
退出容器:exit
参数介绍:
-i 保持和 docker 容器内的交互
-t 为容器的标准输入,虚拟一个tty
-w 指定进入容器后的工作路径
args:表示进入容器后执行的命令,如果需要和容器进行交互式访问,需要配置参数为-it,并且命令设置为bash(表示通过命令行的方式交互访问容器)
注意:
该命令只能进入到运行中的容器
3.2.7 查看容器运行日志
docker logs 容器名称
参数介绍:
--tail n 选项可以指定查看最后n条日志
-t 选项则可以对日志条目附加时间戳。
--until 显示在某个时间戳(例如:2018-05-25T 13:23:37)之前的日志,还可以相对时间(例如:42m 42 minutes)
-f 实时打印日志内容
3.2.7 宿主机和容器间的数据拷贝
docker cp [OPTIONS] 容器名称:容器内路径 宿主机路径
docker cp [OPTIONS] 宿主机路径 容器名称:容器内路径
例子:
docker cp test.txt mytomcat:/usr/local/tomcat
docker cp mytomcat:/usr/local/tomcat/webapp ./
注意:
1、复制文件夹不需要添加任何参数(和Linux的命令有区别)
2、无论从哪里复制,命令都是在宿主机执行
3.2.8、查看容器日志
docker logs -f elasticsearch
四、容器数据卷
4.1 什么是容器数据卷?
数据卷存在于宿主机中,独立于容器,和容器的生命周期是分离的
数据卷可以目录也可以是文件
容器可以利用数据卷与宿主机进行数据共享,实现了容器间的数据共享和交换
4.2 容器数据卷的特点
1、容器启动时初始化数据卷,如果容器使用的镜像包含了数据,这些数据也会拷贝到数据卷中
2、对 数据卷 的修改会立马生效
3、数据卷的变化不会影响镜像的更新
4、数据卷是宿主机中的一个目录
4.3 数据卷的运用场景
1、在多个运行容器之间共享数据。如果您没有明确创建它,则会在第一次将其装入容器时创建卷。当该容器停止或被移除时,该卷仍然存在。多个容器可以同时安装相同的卷,无论是读写还是只读。仅当您明确删除卷时才会删除卷
2、当您想要将容器的数据存储在远程主机或云提供商上而不是本地时
3、当您需要备份,还原或将数据从一台Docker主机迁移到另一台时,卷是更好的选择。您可以停止容器,然后备份卷的目录
4.4 数据卷的相关命令
4.4.1 创建容器数据卷
docker volume create 数据卷名称
例子:docker volume create myvolume
注意
容器卷默认保存在宿主机的/var/lib/docker/volumes路径下
4.4.2 创建容器时指定数据卷
docker run -it
--mount source=数据卷名称,target=容器中的挂载路径,type=volume
--name 容器别名 镜像名称
参数介绍:
source 指定宿主机中数据卷的名称
target 指定容器中对应的挂载路径
type 指定为数据卷的方式挂载,还可以选择bind、tmpfs,默认为volume
注意:
1、如果挂载一个空的数据卷到容器中的一个非空目录中,那么这个目录下的文件会被复制到数据卷中
2、如果挂载一个非空的数据卷到容器中的一个目录中,那么容器中的目录中会显示数据卷中的数据。如果原来容器中的目录中有数据,那么这些原始数据会被隐藏掉
4.4.3 直接在创建容器时指定数据卷
docker run ... [-v 宿主机数据卷:docker容器路径:ro] []...
注意:
1、通过这种方式可以任意指定宿主机的数据卷位置
2、如果随意指定数据卷的位置,容器中对应路径的文件就不会复制到宿主机的数据卷中,而是全部被清空
3、:ro表示以只读的方式挂载容器卷,不写再表示以读写的方式挂载
4、可以通过-v连续设置多个容器卷路径
总结:
数据卷未显示声明路径(默认在/var/lib/docker/volumes下)
1、数据卷为空,对应的容器路径有数据,则容器中的数据直接同步到数据卷中
2、数据卷有数据,对应的容器路径不存在,则启动容器时,自动创建该容器路径,并且将数据卷的数据同步到该路径下
3、数据卷有数据,对应的容器路径也有数据(数据不同),会把数据卷中的数据同步到容器路径中,容器路径中的文件会被隐藏(宿主机 覆盖 容器)
例子:
docker run -d --name mytomcat2 -p 9999:8080 -v myvolume:/usr/local/tomcat/webapps.dist tomcat:8
(会把myvolume的数据同步到webapps.dist中,而webapps.dist本来的文件会被隐藏)
如果宿主机的数据卷为空,容器覆盖宿主机,如果数据卷不为空,则宿主机覆盖容器
数据卷声明指定路径
例子:docker run -d --name mytomcat2 -p 9999:8080 -v /usr/local/abc:/usr/local/tomcat/webapps.dist tomcat:8
1、数据卷为空,对应的容器路径有数据,则直接将容器路径中的数据隐藏
2、数据卷有数据,对应的容器路径不存在,则启动容器时,自动创建该容器路径,并且将数据卷的数据同步到该路径下
3、数据卷有数据,对应的容器路径也有数据(数据不同),会把数据卷中的数据同步到容器路径中,容器路径中的文件会被隐藏(宿主机 覆盖 容器)
无论情况如何,永远是宿主机 覆盖 容器路径
数据卷是文件的情况
注意:在执行docker run..命令前,myconfig文件夹必须存在,如果不存在,则会把application.yml文件里面的内容复制到myconfig中,此时myconfig是一个文件,不是文件夹
例子:
docker run -d --name mytomcat2 -v /usr/local/myvolume/application.yml:/usr/local/tomcat/webapps/application.yml tomcat:8
1、数据卷指定一个文件,对应的容器文件不存在,直接将数据卷文件覆盖到容器中
2、数据卷指定的文件不存在,容器的文件存在,启动容器会报错
如果需要绑定文件,则必须保证宿主机的数据卷中文件必须存在
注意:在数据卷修改文件后,需要重启容器 docker restart mytomcat2
五、Docker的应用
5.1 使用docker安装MySQL
5.1.1 拉取mysql的镜像
docker pull mysql:5.7
5.1.2 根据镜像创建容器
docker run -d
-v ~/mysql/conf:/etc/mysql/conf.d //2
-v ~/mysql/logs:/logs //3
-v ~/mysql/data:/var/lib/mysql //4
-p 3306:3306 //5
-e MYSQL_ROOT_PASSWORD='root' //6
--name mysql
mysql:5.7
代码解释
第二行:挂载mysql配置文件到宿主机
第三行:挂载mysql日志文件到宿主机
第四行:挂载mysql的数据路径到宿主机
第五行:将容器中3306端口映射到宿主机的3306端口上
第六方:设置MySQL的root账号密码为root
5.1.3、例子:
step1:在安装mysql前需要在/usr/local/目录下先新建一个文件夹mysql_docker
mkdir mysql_docker
step2:安装MySQL
docker run -d -v /usr/local/mysql_docker/conf:/etc/mysql/conf.d -v /usr/local/mysql_docker/logs:/logs -v /usr/local/mysql_docker/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD='root' --name mysql -p 3306:3306 mysql:5.7
step3:测试是否连接上
step4:修改数据库编码格式
在docker安装的mysql的默认编码是latinl( 拉丁文),如果插入数据会乱码,需要修改编码格式
在conf文件夹下新建my.conf文件
[mysqld]
character-set-server=utf8
step5:重启mysql容器 :docker restart mysql
5.2 使用docker安装tomcat
5.2.1 拉取tomcat的镜像
docker pull tomcat:8
5.2.2 运行tomcat容器
docker run -d
--name tomcat
-p 8080:8080
-v ~/tomcat/webapps:/usr/local/tomcat/webapps
tomcat:8
5.2.3 进入容器中进行相关拷贝
docker exec -it tomcat bash
cp -r webapps.dist/* webapps
注意:
docker镜像tomcat8之后容器中webapps中没有任何内容,需要将欢迎页导入
5.2.4 将自定义工程部署到tomcat中
1、使用maven命令或者工具将自定义工程打包
2、到工程的target目录下找到打的war包
3、将war包拷贝到宿主机的tomcat数据卷中
4、重启tomcat容器 docker restart tomcat
六、Docker镜像的制作与管理
6.1 什么是Dockerfile?
Docker简单来说就是docker镜像的描述文件,最基础原始的镜像文件都是通过dockerfile文件构建而来
6.2 Dockerfile模板指令介绍
FROM:指定基础镜像,必备的指令,并且必须是第一条指令。
MAINTAINER:指明该镜像的维护者和点子邮件。
比如:MAINTAINER xxxx "xxxxx@qq.com"
ENV:设置环境变量。
比如:EVN key1=value1 key2=value2...
RUN:在新镜像内部执行的命令,比如安装一些软件、配置一些基础环境,可使用\来换行。
比如:RUN yum install -y mysql-server
COPY:将主机的文件复制到镜像文件中,如果目标位置不存在会自动创建。
比如:COPY application.yml /etc/resources
ADD:和COPY一样,但是ADD会加上解压操作
EXPOSE:暴露镜像的端口供主机做映射,可以暴露多个端口。
比如:EXPOSE 8080
WORKDIR:在构建镜像时,指定镜像的工作目录,之后的命令都是基于此工作目录,如果不存在,则会创建目录,而且在进入容器时,会默认定位到该路径下。
比如:WORKDIR /usr/local
VOLUME:用来向基础镜像中添加数据卷
比如 VOLUME /root/mydata /root/condata
CMD:容器启动时需要执行的命令。
比如 CMD /bin/bash
6.3 案例:使用Dockerfile构建自定义工程的运行镜像
6.3.1 准备好Dockerfile文件以及需要部署的工程war包
6.3.2 Dockerfile文件内容
FROM tomcat:8
WORKDIR /usr/local/tomcat
COPY test.war ./webapps
EXPOSE 8080
RUN ./bin/startup.sh
解释:
第一行:该镜像时基于tomcat:8镜像构建
第二行:设置当前基础路径,也是后续命令的相对路径
第三行:将工程war包复制到tomcat的webapps路径下
第四方:对外暴露8080端口,也就是tomcat访问路径
第五行:设置容器启动时命令,即启动tomcat
6.3.3 通过Dockerfile构建镜像
执行命令
docker build -f ./Dockerfile -t mytest:v1 .
解释:
-f 用来指定Dockerfile模板文件
-t 用来指定自定义镜像的名称以及tag
最后的.表示当前路径
6.4 将自定义镜像推送至镜像中心(私服、阿里云等,这里以阿里云举例)
登录阿里云,并且选择容器镜像服务
创建容器仓库
登录阿里云的仓库并且通过命令推送镜像到阿里云
docker login --username=账号 registry.cn-hangzhou.aliyuncs.com
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/ken-hub/myhub:[镜像版本号]
docker push registry.cn-hangzhou.aliyuncs.com/ken-hub/myhub:[镜像版本号]
6.5、打war包案例:
step1:新建一个springboot项目,并打war包
step2:制作镜像
FROM tomcat:8
WORKDIR /usr/local/tomcat
COPY duckerdemo.war ./webapps
EXPOSE 8080
CMD ["catalina.sh","run"]
step3:生成容器
docker build -f ./DockerFile -t myapp:v1 .
注意war包名一定要一致,否则创建镜像失败
step4:生成容器并测试
6.6、打jar包案例:
step1:工程打包
注意:如果是打jar包,必须有下面的插件,不然编译没问题,运行有问题
step2:新建文件夹并把jar包拉取到文件夹下
step3:制作镜像
vim DockerFile
FROM openjdk:8
WORKDIR /usr/local
COPY duckerdem.jar ./
EXPOSE 8080
CMD ["java"."-jar","duckerdem.jar"]
step4:与war包步骤相同