一、初识Docker
1、部署问题
大型项目组件较多,运行环境较为复杂,部署时会碰到一些问题:
依赖关系复杂,容易出现兼容性问题。
开发、测试、生产环境有差异。
2、docker的解决方式
对于依赖问题的解决方式:将应用的libs(函数库)、deps(依赖)、配置与应用一起打包
将每个应用放到一个隔离容器去运行,避免相互干扰。
对于操作环境的解决方式:将用户程序与所需要调用的系统函数库一起打包。
运行到不同操作系统时,直接基于打包的函数库,借助于操作系
统的Linux内核来运行。
3、Docker架构
镜像(image):Docker将应用程序及其所需要的依赖、函数库、环境、配置等文件打包在一起。
容器(container):镜像中的应用程序运行后形成的进程就是容器。Docker会给容器做隔离,对外不可见。
DockerHub:是一个Docker镜像的托管平台。
Docker是一个CS架构程序。组成:服务端、客户端
服务端:Dockers守护进程,负责处理Docker指令,管理镜像、容器等。
客户端:通过命令或RestAPI向Docker服务端发送指令。可以在本地或者远程发送。
4、Docker安装,基于CentOS7
安装yum工具
yum install -y yum-utils\
> device-mapper-persistent-data \
> lvm2 --skip-broken
更新本地镜像源
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
yum makecache fast
安装命令
yum install -y docker-ce
5、启动Docker
关闭防火墙(实际开发环境不能关闭),此处是为了方便启动
systemctl stop firewalld
启动命令
systemctl start docker #启动
systemctl stop docker #停止
systemctl restart docker #重启
docker -v #查看版本
6、镜像加速
使用国内的比使用国外的快。
阿里云配置文档地址:阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台
二、Docker基本操作
1、镜像相关命令
镜像名称组成:[repository]:[tag]。第一个名字、第二个版本号
拉取具体操作:1、在镜像仓库搜索需要的镜像(DockerHub)
2、通过命令拉取,docker pull nginx
3、查看已经拉取的镜像,docker images
2、容器相关命令
案例:
a、运行一个nginx容器
去docker hub查看nginx的容器命令
命令:docker run --name thissname -p 80:80 -d nginx
解释:docker run:创建并运行一个容器
--name:给容器起一个名字
-p:将宿主机端口与容器端口映射,左侧宿主端口,右侧容器端口
-d:后台运行
nginx:镜像名称。
b、进入Nginx容器,修改HTML内容
1、进入容器。
命令:docker exec -it thissname bash
解释:docker exec:进入容器内部,执行命令
-it:给当前进入的容器创建一个标准输输出终端,允许我们与容器交互
thissname:容器名称
bash:进入容器后执行的命令,此命令是Linux终端交互命令
2、进入对应html路径
命令:cd /usr/share/nginx/html
3、修改内容
命令:sed -i 's#Welcome#this shit#g' index.html
三、数据卷
1、概念
容器与数据耦合问题
1、不便于修改:当我们修改文件时需要进入容器内部。
2、数据不可复用:在容器内部的修改对外部不可见,对新建的容器也不可用
3、升级维护难: 数据在容器内,如果要升级容器必然删除旧容器。
数据卷是一个虚拟目录,指向宿主文件系统中的某个目录。作用:创建数据卷后,宿主中对应的文件和容器中对应的文件就相互关联起来了,数据就同步了。
2、实操
操作命令:
1、docker volume [command] 此命令是数据卷操作,命令中的command是确认下一步。
create:创建一个volume
inspect:显示一个或多个volume的信息
ls:显示所有volume
prune:删除未使用的volume
2、-v 挂载数据卷
语法:-v [宿主目录] :[容器内目录]
-v [宿主文件]:[容器内文件]
命令:docker run --name thissname -p 80:80 -v html:/root/html -d nginx
解释:docker run:创建并运行一个容器
--name:给容器起一个名字
-v:把html数据卷挂在到容器内的/root/html这个目录
-p:将宿主机端口与容器端口映射,左侧宿主端口,右侧容器端口
-d:后台运行
nginx:镜像名称。
案例:在宿主机修改容器内部的html文件
1、启动容器,并挂在对应文件。
docker run --name thissname -p 80:80 -v html:/usr/share/nginx/html -d nginx
2、查看宿主机对应文件
docker inspect html
解释:html为数据卷名称
3、进入目录修改
四、自定义镜像
1、镜像结构
基础镜像(BaseImage):应用依赖的系统函数库、环境、配置、文件等。
层(layer):在BaseImage基础上添加安装包、依赖、配置等。
入口(Entrypoint):镜像运行入口。
2、DockerFile
一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。每个指令都会形成一层Layer。
3、部署java项目
1、上传文件
项目jar包、jdk压缩包、DockerFile配置文件。
# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量
ENV JAVA_DIR=/usr/local
# 拷贝jdk和jar包
copy ./jdk8.tar.gz $JAVA_DIR/
copy ./eureka-server-1.0-SNAPSHOT.jar /tmp/eureka.jar
# 安装JDK
# jdk1.8.0_162:jdk解压后的文件名
RUN cd $JAVA_DIR && tar -xf ./jdk8.tar.gz && mv ./jdk1.8.0_162 ./java8
# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin
# 暴露接口
EXPOSE 8001
# 入口启动命令
ENTRYPOINT java -jar /tmp/eureka.jar
2、 构建
命令:docker build -t javaweb:1.0 .
-t:等于-tag
javaweb:1.0 :名字加版本
.:目录,点表示当前目录
3、启动
docker run --name java -p 8001:8001 -d javaweb:1.0
五、DockerCompose
1、DockerCompose
基于Compose文件,我们可以快速部署分布式应用,无需一个个手动创建。
Compose文件是一个文本文件,通过指令定义集群中的每一个容器运行。
官网:https://docs.docker.com/compose/compose-file
2、安装
下载对应dockerCompose文件。
sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
给文件增加执行权
chmod +x docker-compose
3、使用
1、准备配置文件docker-compose.yml
version: "3.3"
services:
eureka:
build: ./eureka
ports:
- "8001:8001"
user:
build: ./user
order:
build: ./order
gateway:
build: ./gateway
ports:
- "8004:8004"
2、将项目配置文件中的地址改为dockercompose配置文件中的服务名
3、上传文件,执行启动命令
docker-compose up