目录
1.docker入门
1.1 docker概述
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows 机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
1.2 docker安装
安装前提说明:目前,CentOS 仅发行版本中的内核支持 Docker,Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 或以上。
1.2.1 确定linux系统是centos7的版本
#查看内核
#uname命令用于打印当前系统相关信息(内核版本号、硬件架构、主机名称和操作系统类型等)。
[root@iZbp1ggv5mguiqofg5lm4aZ ~]# uname -r
3.10.0-1160.42.2.el7.x86_64
1.2.2 安装方法
yum -y install curl
curl -sSL https://get.daocloud.io/docker | sh
1.2.3 启动docker
systemctl start docker
systemctl enable docker //开机自启
1.2.4 查看版本
docker version
1.3 docker加速配置
Docker 运行容器前需要本地存在对应的镜像,如果镜像不存在本地,Docker 会从镜像仓库下载(默认是Docker Hub 公共注册服务器中的仓库)因为直接从dockerhub上下载镜像很慢,所以需要配置阿里云镜像加速
https://account.aliyun.com/login/login.htmoauth_callback=https%3A%2F%2Fcr.console.aliyun.com%2Fcn-hangzhou%2Finstances%2Fmirrors&lang=en
2.docker的三个基本概念
Image
(镜像)Container
(容器)Repository
(仓库)
2.1 Image(镜像)
镜像:(镜像,从认识上简单的来说,就是面向对象中的类,相当于一个模板。从本质上来说,镜像相当于一个文件系统。Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。)
镜像常用命令:
docker pull 镜像的名字:版本 -------拉取镜像
docker images --------查看本地的所有镜像
docker rmi 镜像名字:版本 -------删除镜像
docker version ---------查看docker版本
docker info --------- 查看docker的具体信息
docker help -------docker帮助文档
2.2 Container(容器)
容器:(容器,从认识上来说,就是类创建的实例,就是依据镜像这个模板创建出来的实体。容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。因此容器可以拥有自己的root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。)
容器常用命令:
docker run -- 运行容器
--name -- 起一个名字 (每个容器的名字都是唯一的)
-p -- 端口映射
-v -- 文件挂载 可以将容器内部的文件 挂载到宿主机上
-it -- 交互式运行
-e -- 指定环境变量
-d -- 后台运行
进项的名称:版本号
docker ps -- 查看正在运行的容器
docker ps -a -- 查看所有的容器
docker rm -f 容器的名字或者是ID --- 删除容器
docker exec -it 容器的名称 bash -- 进入容器内部
find / -name 文件名称 -----linux的命令 查找文件的位置
ctrl + D ------退出容器 不会让容器停止
docker cp 容器的名字:/路径 宿主机的路径名字 -- 拷贝
docker start | stop | restart
docker logs 容器名称 --- 查看日志
2.3 Repository(仓库)
仓库:Docker 仓库是集中存放镜像文件的场所。镜像构建完成后,可以很容易的在当前宿主上运行,但是, 如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry (仓库注册服务器)就是这样的服务。有时候会把仓库 (Repository) 和仓库注册服务器 (Registry) 混为一谈,并不严格区分。Docker 仓库的概念跟 Git 类似,注册服务器可以理解为 GitHub 这样的托管服务。实际上,一个 Docker Registry 中可以包含多个仓库 (Repository) ,每个仓库可以包含多个标签 (Tag),每个标签对应着一个镜像。所以说,镜像仓库是 Docker 用来集中存放镜像文件的地方类似于我们之前常用的代码仓库。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本 。我们可以通过<仓库名>:<标签>的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签.。
仓库又可以分为两种形式:
public(公有仓库)
private(私有仓库)
Docker Registry 公有仓库是开放给用户使用、允许用户管理镜像的 Registry 服务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。
除了使用公开服务外,用户还可以在本地搭建私有 Docker Registry 。Docker 官方提供了 Docker Registry镜像,可以直接使用做为私有 Registry 服务。当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。
3.容器数据卷
3.1什么是容器数据卷
docker将应用和环境打包成镜像,如果数据在容器中,那么删除容器时,数据就会丢失,我们希望数据可以存储到本地,容器间可以共享数据!docker产生的数据可以同步到本地!这就是卷技术!通过将容器内的目录挂载到宿主机(Linux)上面来实现。
3.2使用数据卷
3.2.1 方式一:直接使用 -v 命令挂载
docker run -it -v 宿主机目录:容器内目录 -p 主机端口:容器内端口
docker run -it -v 宿主机目录:容器内目录 -p 主机端口:容器内端口
# -it 交互式进入
# -v volume卷技术
# -p 主机端口
实例:
docker run --name tomcat-car -p 8082:8080 -v /root/docker-v/tomcat/webapps/:/usr/local/tomcat/webapps/ -d tomcat
# docker run 启动容器
# --name tomcat-car 给容器起名为:tomcat-car
# -p 8082:8080 端口映射:容器端口:镜像默认端口
# -v 将容器内的/usr/local/tomcat/webapps/下的数据挂载到宿主机/root/docker-v/tomcat/webapps/下
# -d 后台运行
# tomcat:版本号 镜像名:版本号(忽略的话默认为最新版本)
3.2.2 方式二:使用Dockerfile添加
3.3 数据卷使用案例
- 在根目录下创建docker-v 作为宿主机目录
mkdir docker-v
- 在docker-v目录下创建容器需要挂载数据文件存放的目录,分别创建
mkdir mysql
mkdir tomcat
mkdir nginx
3.3.1 mysql案例
①mysql存放数据的目录为/var/lib/mysql/data
②在宿主机/root/docker-v/mysql/目录下创建data目录
mkdir data
③创建端口为3307的,名字是:mysql-v,密码是123456的mysql容器,启动并在后台运行。
docker run --name mysql-v -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 -v /root/docker-v/mysql/data:/var/lib/mysql/ -d mysql:5.7
3.3.2 tomcat案例
①tomcat容器存放数据的目录为:/usr/local/tomcat/webapps
②在宿主机:/root/docker-v/tomcat/目录下创建webapps目录
mkdir webapps
③创建端口为:8082的tomcat容器
docker run --name tomcat-car -p 8082:8080 -v /root/docker-v/tomcat/webapps/:/usr/local/tomcat/webapps/ -d tomcat
3.3.3 nginx案例
①容器内配置文件目录为 /etc/nginx/conf.d/default.conf 容器存放静态资源的目录/usr/local/res/
②复制default.conf文件到宿主机/root/docker-v/nginx/下
docker cp nginx1:/etc/nginx/conf.d/default.conf default.conf
③更改default.conf配置文件下的存放静态资源的目录为 /usr/local/res/;
vi default.conf
④在宿主机下创建/root/docker-v/nginx/usr/local/res/目录存放静态资源
⑤ 创建名称为nginx-v3,端口号为86的nginx容器,分别将配置文件default.conf与静态资源目录res挂载。
docker run --name nginx-v3 -p 86:80 -v /root/docker-v/nginx/default.conf:/etc/nginx/conf.d/default.conf -v /usr/local/res/:/usr/local/res/ -d nginx
4.DockerFile
4.1 Dockerfile基础知识
4.1.1 Dockerfile是什么
- Dockerfile是用来构建Docker镜像的构建文件,由一系列参数和命令构成的脚本
- 文本内容:包含了若干的命令行,并支持#作为注释行
- 文本格式:基础镜像FROM,维护者MAINTAINER,操作指令ADD,容器启动后指令等共计4部分。
4.1.2 DockerFile的三步构建步骤?
①编写Dockerfile文件,必须符合file的规范,文件名为:Dockerfile
②在Linux里面使用docker build 命令构建镜像
③执行 docker run命令,创建运行镜像对应的容器
4.1.3 DockerFile的语法规则
1,每条保留字指令都必须为大写字母后面要跟随至少一个参数
2,指令从上到下顺序执行
3,#表示注释
4,每条指令都会创建一个新的镜像层,并对镜像进行提交
4.1.4 Dockerfile的关键字
FROM 基础镜像,当前新镜像是基于哪个镜像的
MAINTAINER 镜像维护者的姓名和邮箱地址
RUN 容器构建时需要运行的命令
EXPOSE 当前容器对外暴露的端口[只是提示作用,]
WORKDIR 指定在创建容器后,终端默认登陆进来的工作目录
ENV 用来在构建镜像过程中设置环境变量
ADD 将宿主机目录下的文件拷贝进镜像并且ADD命令会自动处理URL和解压tar包
COPY 类似ADD,拷贝文件和目录到镜像中 ,语法COPY src dest COPY [''src","dest"]
VOLUME 容器数据卷,用于数据保存和持久化工作
CMD 指定一个容器启动时要运行的命令格式CMD['ls'] run -it cenos -lh
shell: CMD <命令>
exec CMD ['可执行文件',"参数1","参数2"]
DockerFile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换
ENTEYPONT 指定一个容器启动时要运行的命令 ENTEYPORT ['ls'] run -it cenos -lh
ENTRYPOINT的目地和CMD一样,都是在指定容器启动程序及参数
OBBUILD 当构建一个被继承的Dockerfile时运行命令,父镜像在被子镜像继承后触发父镜像的onbuild
4.2 制作Docker镜像
4.2.1制作镜像的相关材料
①项目的打包文件,war包或者jar包。
②镜像的构建文件:Dockerfile
③run.sh脚本文件,编写构造镜像的相关命令:docker build
注:可以不编写 .sh文件,直接在liunx中执行docker build命令来构建镜像。
4.2.2 具体步骤
war包格式:
①创建文件夹docker
②复制项目的war包到docker文件夹下
③编写Dockerfile文件:使用IDEA编写有提示
FROM tomcat:8 #镜像基于tomcat8
ENV WORKPATH /usr/local/tomcat/webapps #设置环境变量
COPY ./car.war ${WORKPATH} #复制当前文件夹下的car.war(项目的war包)到指定路径
WORKDIR ${WORKPATH} #指定在创建容器后,终端默认登陆进来的工作目录
RUN unzip ./car.war -d ROOT #解压war包
RUN rm -f car.war #删除war包
CMD ["catalina.sh","run"] # 容器运行时,启动tomcat
④编写run.sh文件
cd ..&& docker build ./my-car -t my-car:1.0
当run.sh文件被执行时,执行以上命令,命令内容为:
先切换到上一级目录下,然后执行构建命令,在当前目录下,构造名称为:my-car 版本为1.0的镜像。
⑤在liunx根目录下创建文件夹存放镜像
mkdir my-images
- 进入到 my-images目录下:
cd my-images/
- 在 my-images目录下创建 my-car目录用于存放制作镜像的材料
mkdir my-car
- 进入到my-car目录下:
cd my-car/
⑥将“war包、Dockerfile、run.sh”文件复制到Linux下的/root/my-images/my-car/中
⑦给run.sh文件授予权限
chmod 777 run.sh
⑧启动run.sh构造镜像
./run.sh
⑨运行镜像,创建端口为8088的容器
docker run --name mycar -p 8088:8080 -d mycar:1.0
jar包形式:
与war包形式步骤基本相同,Dokerfile文件内容不同
FROM openjdk:8 #基于openjdk8运行
ENV workdir /root/docker/jarapp
COPY ./test.jar ${workdir}/test.jar
WORKDIR ${workdir}
EXPOSE 8080
CMD ["java","-jar","test.jar"] #使用java -jar命令运行
5.docker的网络模式
5.1 docker的四种网络模式
bridge模式:使用 –net =bridge 指定,默认设置;
host模式:使用 –net =host 指定;none模式:使用 –net =none 指定;
container模式:使用 –net =container:NAMEorID 指定。
5.2部署项目案例
具体步骤:
①先启动一台mysql容器,名称为 mysql-car ,端口为3308
docker run --name mysql-car -p 3308:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
②将项目中的数据库连接地址,固定IP改为域名映射模式 ,将项目重新打包
118.178.105.2 ——》 mysql-serve #当连接mysql-serve时,会连接到mysql-car
③将项目制作为自定义docker镜像 mycar:2.0,名称为mycar,版本为2.0
④启动三台mycar容器:名称分别为:car-1,car-2,car-3
docker run --name car-1 -p 8081:8080 --link mysql-car:mysql-server -d mycar:2.0
docker run --name car-2 -p 8081:8080 --link mysql-car:mysql-server -d mycar:2.0
docker run --name car-3 -p 8081:8080 --link mysql-car:mysql-server -d mycar:2.0
⑤启动一台nginx容器:
docker run --name nginx-car -p 81:80 --link car-1:car-1 --link car-2:car-2 --link car-3:car-3 -d nginx
⑥更改nginx的配置文件default.conf
cd docker-v/nginx/
vi default.conf
首行添加以下内容:
upstream www.car.com {
server car-1:8080;
server car-2:8080;
server car-3:8080;
}
将local改为以下内容:
location / {
proxy_pass http://www.car.com;
#root /usr/local/res/;
#index index.html index.htm;
}
⑦复制default.conf到容器nginx-car中
docker cp default.conf nginx-car:/etc/nginx/conf.d/default.conf
⑧重启nginx-car容器
docker restart nginx-car