为什么用docker?
大型项目组件较多,运行环境也较为复杂,部署时会碰到一些问题:
- 依赖关系复杂,容易出现兼容性问题
- 开发、测试、生产环境有差异
docker如何解决部署中产生的问题?
Docker为了解决依赖的兼容问题的,采用了两个手段:
- 将应用的Libs(函数库)、Deps(依赖)、配置与应用一起打包
- 将每个应用放到一个隔离容器去运行,避免互相干扰
Docker如何解决不同系统环境的问题?
Docker将用户程序与所需要调用的系统(比如Ubuntu)函数库一起打包
Docker运行到不同操作系统时,直接基于打包的函数库,借助于操作系统的Linux内核来运行
Docker和虚拟机的差异:
- docker是一个系统进程;虚拟机是在操作系统中的操作系统
- docker体积小、启动速度快、性能好;虚拟机体积大、启动速度慢、性能一般
docker命令:
docker安装和启动:
查看docker服务端状态:systemctl status docker
启动docker服务端:systemctl start docker
停止docker服务端 :systemctl stop docker
重启docker服务端 :systemctl restart docker
开机启动docker服务端:systemctl enable docker
镜像:
docker images 查看镜像列表
docker rmi 镜像名称或镜像id 删除镜像
docker rmi -f 镜像名称或镜像id 强制删除镜像
docker rmi docker images -q 删除全部镜像
docker pull 镜像名称 拉取镜像
docker push 推送镜像到镜像中心
docker save 将镜像保存为压缩包
docker load 加载镜像
容器:
docker ps 查看运行中的容器列表
docker ps -a 查看所有的容器列表
docker run —name 容器名称 -d -p 8080:8080 镜像名称 创建容器
docker stop 容器名称 停止一个容器
docker start 容器名称 启动一个容器
docker restart 容器名称 重启一个名称
docker pause 容器名称:让一个运行的容器暂停
docker unpause 容器名称:让一个容器从暂停状态恢复运行
docker rm 容器名称:删除一个容器
docker rm -f 容器名称:强制删除一个容器
docker exec -it 容器名称 bash:进入一个容器
docker logs -f 容器名称:持续查看日志
数据卷:
docker volume create 数据卷名称 :创建一个数据卷
docker volume ls:查看所有数据卷
docker volume inspect 数据卷名称:查看数据卷详细信息卷
docker volume rm 数据卷名称:删除指定数据卷
docker volume prune:删除所有未使用的数据卷
挂载数据卷
给MySQL挂载本地目录
基于ubuntu镜像自定以镜像
# 指定基础镜像FROM ubuntu:16.04# 配置环境变量,JDK的安装目录ENV JAVA_DIR=/usr/local# 拷贝jdk和java项目的包COPY ./jdk8.tar.gz $JAVA_DIR/COPY ./docker-demo.jar /tmp/app.jar# 安装JDKRUN cd $JAVA_DIR \&& tar -xf ./jdk8.tar.gz \&& mv ./jdk1.8.0_144 ./java8# 配置环境变量ENV JAVA_HOME=$JAVA_DIR/java8ENV PATH=$PATH:$JAVA_HOME/bin# 暴露端口EXPOSE 8090# 入口,java项目的启动命令ENTRYPOINT java -jar /tmp/app.jar
在Dockerfile所在目录下运行命令:docker build -t 镜像名称 .
基于java8构建Java项目
Dockerfile文件如下:
FROM java:8-alpineCOPY ./app.jar /tmp/app.jarEXPOSE 8090ENTRYPOINT java -jar /tmp/app.jar
