Docker
一.初识docker
Docker如何解决大型项目依赖关系复杂,不同组件依赖的兼容性问题?
- Docker允许开发中将应用、依赖、函数库、配置一起打包,形成可移植镜像
- Docker应用运行在容器中,使用沙箱机制,相互隔离
Docker如何解决开发、测试、生产环境有差异的问题?
- Docker镜像中包含完整运行环境,包括系统函数库,仅依赖系统的Linux内核,因此可以在任意Linux操作系统上运行
Docker是一个快速交付应用、运行应用的技术:
- 可以将程序及其依赖、运行环境一起打包为一个镜像, 可以迁移到任意Linux操作系统
- 运行时利用沙箱机制形成隔离容器,各个应用互不干扰
- 启动、移除都可以通过一行命令完成,方便快捷
Docker和虚拟机的差异:
- docker是一个系统进程;虚拟机是在操作系统中的操作系统
- docker体积小、启动速度快、性能好; 虚拟机体积大、启动速度慢、性能一般
Docker中的一些概念
镜像:
- 将应用程序及其依赖、环境、配置打包在一起
容器:
- 镜像运行起来就是容器,一个镜像可以运行多个容器
Docker结构:
- 服务端(Server):接收命令或远程请求,操作镜像或容器
- 客户端(Client):发送命令或者请求到Docker服务端
DockerHub:
- 一个镜像托管的服务器,类似的还有阿里云镜像服务,统称为DockerRegistry
Docker基本操作
镜像(image)常用命令
- docker images 查看当前镜像
- docker rmi 删除镜像
- docker pull 拉取镜像(没有指定版本的话,默认是最新的)
- docker push 上传镜像
- docker save 保存镜像
- docker load 读取镜像
容器(container)常用命令
docker run: 创建并运行一个容器
docker run --name mn -p 8080:80 -d nginx
命令解读
- --name: 给容器起一个名字,比如叫做mn
- -p: 将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口
- -d: 后台运行容器
- nginx: 镜像的名称
docker exec: 进入容器执行命令
docker exec -it mn bash
命令解读:
- -it: 给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互
- mn: 要进入的容器的名称
- bash: 进入容器后执行的命令,bash是一个linux终端交互命令
docker ps: 查看容器状态 (添加-a参数 查看所有状态的容器)
docker logs: 查看容器日志命令 (添加-f参数可以持续查看日志)
docker stop 容器名 : 停止容器
docker rm 容器名: 删除容器 (添加-f参数 可以删除运行中的容器)
数据卷(volume)常用命令
dorker volume[COMMAND]
docker volume命令是数据卷操作,根据命令后跟随的command来确定下一步的操作:
- create 创建一个volume
- inspect 显示一个或多个volume的信息
- ls 列出所有的volume
- prune 删除未使用的volume
- rm 删除一个或多个指定的volume
数据卷挂载
在创建容器时添加-v参数
docker run --name mn -p 8080:80 -v html:/usr/share/nginx/html -d nginx (注意:/usr/share/nginx/html 这个是官方提供的镜像中的html目录位置)
目录挂载
docker run \
> --name mysql \
> -e MYSQL_ROOT_PASSWORD=root \
> -p 3307:3306 \
> -v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf \
> -v /tmp/mysql/data:/var/lib/mysql \
> -d \
> mysql:5.7.25
镜像是分层结构,每一层称为一个Layer
- Baselmage层:包含基本的系统函数库、环境变量、文件系统
- Entrypoint:入口,是镜像中应用启动的命令
- 其它:在Baselmage基础上添加依赖、安装程序、完成整个应用的安装和配置
Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像, 每一个指令都会形成一层Layer
- FROM 指定基础镜像 FROM centos:6
- ENV 设置环境变量,可在后面指令使用 ENV key value
- COPY 拷贝本地文件到镜像的指定目录 COPY ./mysql-5.7.rpm /tmp
- RUN 执行Linux的sheLl命令,一般是安装过程的命令 RUN yum install gcc
- EXPOSE 指定容器运行时监听的端口,是给镜像使用者看的 EXPOSE 8080
- ENTRYPOINT 镜像中应用的启动命令,容器运行时调用 ENTRYPOINT java -jar xx.jar
# 指定基础镜像
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
# 安装JDK
RUN cd $JAVA_DIR \
&& tar -xf ./jdk8.tar.gz \
&& mv ./jdk1.8.0_144 ./java8
# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin
# 暴露端口
EXPOSE 8090
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar
DockerCompose有什么作用?
帮助我们快速部署分布式应用,无需一个个微服务去
构建镜像和部署