写点东西《边学边写docker》
docker入门
什么是docker?
如上图↑
docker就是鲸鱼,也可以理解为一艘大船
- 上面装满了集装箱(容器)
- 集装箱里装满了不同的货物(镜像)
- 货源(仓库)
上面加粗的文字带出了docker三大概念:容器,镜像,仓库
如何理解镜像分层?
看下面两张图↓
- 可以简单理解为:每个镜像都有相同的bootfs(用于维持系统的基本运行),每新增一个应用会往上叠加一层(这些层都是只读)。
- 当运行容器时,会在最上层添加一层容器层,所有的修改都会在这一层,上层同名路径的修改会覆盖下层。
怎么用?
如何运行一个镜像?(货物装箱)
- 货物清单:从远程库中查找指定镜像。
docker search mysql
- 卸货:从远程仓库拉取镜像(mysql)。
docker pull mysql
- 装箱(运行):将镜像装入容器(自动运行)
docker run mysql
如何构建一个镜像?(货物)
下面以创建一个springboot项目docker部署为例。
- 新建一个springboot项目
- 在一个空的文件夹内创建dockerFile文件:
#以jdk作为基础镜像,本地库没有会从远程库下载
FROM openjdk
#设置jdk环境变量
ENV JAVA_HOME /usr/java/openjdk-18
ENV PATH $PATH:$JAVA_HOME/bin
#将本地目录./app下的文件拷贝到容器/app目录下
#COPY ./app /app
#容器cd /app
WORKDIR /app
#容器授权app.jar 777权限
#CMD ["chmod","777","app.jar"]
#启动命令:java -jar app.jar
ENTRYPOINT ["java","-jar","app.jar"]
本地目录结构如下:
3. 执行mvn pacage 打包成app.jar,然后将app.jar copy到上图↑app路径下
4. 编译生成镜像:
D:\>cd D:\dockerfile
D:\dockerfile>docker build -t app_prod .
- 运行镜像(windows环境)
D:\dockerfile>docker run -p 18081:8081 -v /D/lmapp/target:/app --name appCon app_prod
就可以看到成功启动的画面了(如果起不来,请直接在cmd 下 java -jar app.jar测试是否可以成功启动)
- 代码更新需要做2步操作:
- mvn package
- docker restart appCon
- 大功告成!!
什么是docker-compose?
compose翻译为组合的意思,可以理解为docker的批处理。
命令执行docker run …balabala可以单独运行一个docker镜像
docker-compose -f docker-compose.yml up 就可以批量运行yml文件中配置的多个docker镜像服务
下面以部署一个springboot项目,并且实现springboot项目链接mysql为例:
- 新建一个目录结构用于docker项目的发布,目录结构如下:
docker_project # 项目部署根目录
├── docker-compose # docker-compose目录
│ └── docker-compose.yml # docker-compose.yml配置文件
├── mysql # mysql数据保存目录
├── config # mysql配置
└── my.cnf
├── data # mysql数据
└── init # mysql初始化脚本
└── init.sql
└── service # 后端服务目录
├── application-prod.yml # springboot配置文件
├── app.jar # springboot打包jar文件
└── Dockerfile # springboot代码的镜像
- docker-compose都干了什么?怎么干的?看docker-compose.yml如下:
version: "3" # docker-compose版本
services: # docker-compose服务(要干啥?)
springboot: # 创建个springboot服务
build:
context: ./ #上下文路径(.相当于docker-compose.yml所在位置)
dockerfile: Dockerfile # Dockerfile文件名
depends_on: #依赖于下面的mysql运行后才会运行
- mysql57
ports:
- "18081:8081"
volumes: #映射 本机地址:容器地址
- "/D/lmJava/wsp/docker_project/service:/app"
links:
- mysql57 #对外访问域名
mysql57:
image: mysql:5.7.26
ports:
- "3306:3306"
volumes:
- "/D/lmJava/wsp/docker_project/mysql/data:/var/lib/mysql"
- "/D/lmJava/wsp/docker_project/mysql/init:/docker-entrypoint-initdb.d/"
- "/D/lmJava/wsp/docker_project/mysql/config/my.cnf:/etc/my.cnf"
environment:
MYSQL_ROOT_PASSWORD: root
- 运行:
docker-compose -f “D:/lmJava/wsp/docker_project/docker-compose/docker-compose.yml” up -d - 相关配置文件
my.cnf:
[mysqld]
user=mysql
default-storage-engine=INNODB
character-set-server=utf8
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
init.sql
CREATE USER 'user'@'%' IDENTIFIED BY 'pwd';
GRANT All privileges ON *.* TO 'user'@'%';
docker常用命令
//查看本地镜像
docker images或docker image ls
//删除本地镜像(-f:强制删除)
docker rmi 镜像Id -f
//查看running中的容器
docker ps
//查看所有容器(包含exited)
docker ps -a
//进入运行中的容器命令行(-it 命令行显示)
docker exec -it 容器id /bin/sh
//查看未运行的容器文件系统
docker export -o 导出文件名(.tar) 容器镜像id
//查看容器日志
docker logs 容器名称
//重启容器
docker restart 容器名称
//删除容器
docker rm 容器名称
//查看已有镜像的dokerfile
docker history 镜像名:标签
docker-compose常用命令
//运行(-d:后台运行)
docker-compose -f "docker-compose.yml文件路径" up -d
//查看
docker-compose -f "docker-compose.yml文件路径" ps
//停止
docker-compose -f "docker-compose.yml文件路径" down
未完待续,边学变更…
参考资料
Docker命令大全
Docker Dockerfile
Docker Compose
docker镜像的制作(超详细)、docker镜像结构原理、镜像的分享
docker快速部署java+nginx+mysql运行环境