Docker学习(上)+https://developer.aliyun.com/article/1416641
作用
- 容器数据持久化
- 外部机器和容器间通信
- 容器之间数据交换
配置数据卷
docker run -it --name=c1 -v /root/data:/root/data_container redis:latest /bin/bash
- 挂载路径需要写绝对路径
- 如果目录不存在会自动创建
- 可以挂载多个数据卷
docker run -it --name=c1 \ -v /root/data:/root/data_container \ -v /root/data1:/root/data1 \ redis:latest \ /bin/bash
数据卷概念
c3
挂载了一个数据卷,c1
和c2
分别挂载了c3
,那么他们也相当于挂载到了对应的数据卷
此时c3
就叫做数据卷容器
docker run -it --name=c3 -v /volumn redis:latest docker run -it --name=c2 --volumn-from c3 redis:latest docker run -it --name=c1 --volumn-from c3 redis:latest
部署应用案例
部署mysql
- 搜索应用
docker search mysql
- 拉取
mysql
镜像
docker pull mysql:5.6
- 创建容器,设置端口映射、目录映射
mkdir ~/mysql cd ~/mysql docker run -id \ -p 3307:3306 \ --name=c_mysql \ -v $PWD/conf:/etc/mysql/conf.d \ -v $PWD/logs:logs \ -e MYSQL_ROOT_PASSWORD=123456 \ mysql:5.6
- 映射端口
- 目录映射
- 设置
mysql
密码
进入容器
docker exec -it c_mysql /bin/bash
部署tomcat
mkdir ~/tomcat cd ~/tomcat docker run -id --name=c_tomcat \ -p 8080:8080 \ -v $PWD:/usr/local/tomcat/webapps \ tomcat
- 设置
webapp
映射目录 - 映射端口
部署nginx
docker run -id --name=c_nginx \ -p 80:80 \ -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \ -v $PWD/logs:/var/log/nginx \ -v $PWD/html:/usr/share/nginx/html \ nginx
Dockerfile
docker
镜像原理
为什么centos
镜像只有200MB
,而一个centos
操作系统要几个G
为什么tomcat
镜像有500MB
,而一个tomcat
安装包只有几十兆
docker
是一个分层的文件系统- docker的镜像复用宿主机的
bootfs
,自己只要有rootfs
和其他镜像层
镜像制作
容器转为镜像
docker commit 容器id 镜像名称:版本号
将镜像打成压缩包
docker save -o 压缩文件名称 镜像名称:版本号
将压缩包转为镜像
docker load -i 压缩文件名称
目录挂载的需要重新docker run
的时候使用-v
指定
dockerfile
一个文本文件,包含了一条条的指令。
每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像。
dockerfile
关键字
关键字 | 作用 | 备注 |
FROM | 指定父镜像 | 指定dockerfile基于那个image构建 |
MAINTAINER | 作者信息 | 用来标明这个dockerfile谁写的 |
LABEL | 标签 | 用来标明dockerfile的标签 可以使用Label代替Maintainer 最终都是在docker image基本信息中可以查看 |
RUN | 执行命令 | 执行一段命令 默认是/bin/sh 格式: RUN command 或者 RUN [“command” , “param1”,“param2”] |
CMD | 容器启动命令 | 提供启动容器时候的默认命令 和ENTRYPOINT配合使用.格式 CMD command param1 param2 或者 CMD [“command” , “param1”,“param2”] |
ENTRYPOINT | 入口 | 一般在制作一些执行就关闭的容器中会使用 |
COPY | 复制文件 | build的时候复制文件到image中 |
ADD | 添加文件 | build的时候添加文件到image中 不仅仅局限于当前build上下文 可以来源于远程服务 |
ENV | 环境变量 | 指定build时候的环境变量 可以在启动的容器的时候 通过-e覆盖 格式ENV name=value |
ARG | 构建参数 | 构建参数 只在构建的时候使用的参数 如果有ENV 那么ENV的相同名字的值始终覆盖arg的参数 |
VOLUME | 定义外部可以挂载的数据卷 | 指定build的image那些目录可以启动的时候挂载到文件系统中 启动容器的时候使用 -v 绑定 格式 VOLUME [“目录”] |
EXPOSE | 暴露端口 | 定义容器运行的时候监听的端口 启动容器的使用-p来绑定暴露端口 格式: EXPOSE 8080 或者 EXPOSE 8080/udp |
WORKDIR | 工作目录 | 指定容器内部的工作目录 如果没有创建则自动创建 如果指定/ 使用的是绝对地址 如果不是/开头那么是在上一条workdir的路径的相对路径 |
USER | 指定执行用户 | 指定build或者启动的时候 用户 在RUN CMD ENTRYPONT执行的时候的用户 |
HEALTHCHECK | 健康检查 | 指定监测当前容器的健康监测的命令 基本上没用 因为很多时候 应用本身有健康监测机制 |
ONBUILD | 触发器 | 当存在ONBUILD关键字的镜像作为基础镜像的时候 当执行FROM完成之后 会执行 ONBUILD的命令 但是不影响当前镜像 用处也不怎么大 |
STOPSIGNAL | 发送信号量到宿主机 | 该STOPSIGNAL指令设置将发送到容器的系统调用信号以退出。 |
SHELL | 指定执行脚本的shell | 指定RUN CMD ENTRYPOINT 执行命令的时候 使用的shell |
案例
搭建一个springboot
的环境
创建一个springboot
的项目,jdk
使用8
,maven
打包成jar
包传给ubuntu
在jar
包目录下创建dockerfile
# springboot_dockerfile FROM java:8 MAINTAINER ljq <luopanforever@163.com> ADD springbootDocker-0.0.1-SNAPSHOT.jar app.jar CMD java -jar app.jar
加载dockerfile
文件
docker build -f ./springboot_dockerfile -t app .
创建容器
docker run -id -p9000:8080 app
自定义centos
设置默认登录路径为/usr
可以使用vim
docker
服务编排
服务编排概念
按照一定的业务规则批量管理容器
Docker Compose
概述
Docker Compose是一个编排多容器分布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括服务构建,启动和停止。
使用步骤:
- 利用
dockerfile
定义运行环境镜像 - 使用
docker-compose.yml
定义组成应用的各服务 - 运行
docker-compose up
启动应用
一、安装Docker Compose
# Compose目前已经完全支持Linux、Mac OS和Windows,在我们安装Compose之前,需要先安装Docker。下面我 们以编译好的二进制包方式安装在Linux系统中。 curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose # 设置文件可执行权限 chmod +x /usr/local/bin/docker-compose # 查看版本信息 docker-compose -version
二、卸载Docker Compose
# 二进制包方式安装的,删除二进制文件即可 rm /usr/local/bin/docker-compose
三、 使用docker compose编排nginx+springboot项目
- 创建
docker-compose
目录
mkdir ~/docker-compose cd ~/docker-compose
- 编写
docker-compose.yml
文件
version: '3' services: nginx: image: nginx ports: - 80:80 links: - app volumes: - ./nginx/conf.d:/etc/nginx/conf.d app: image: app expose: - "8080"
- 创建
./nginx/conf.d
目录
mkdir -p ./nginx/conf.d
- 在
./nginx/conf.d
目录下 编写itheima.conf
文件
server { listen 80; access_log off; location / { proxy_pass http://app:8080; } }
- 在
~/docker-compose
目录下 使用docker-compose
启动容器
docker-compose up
- 测试访问
http://192.168.149.135/hello