目的java
指定基础镜像mysql
特色linux
须要写在其余指令以前,以后的指令都依赖于该指令指定的镜像。git
语法github
FROM <image>
FROM <image>:
FROM <image>@web
实例spring
FROM java:8sql
目的docker
1.复制文件shell
语法
ADD ["",…""]
ADD <src>…<dest>
从src复制文件到容器的dest。src能够是Dockerfile所在目录的相对路径。
实例
ADD spring-boot-docker.jar app.jar
拷贝文件而且重命名
目的
1.加载本地目录下的配置文件到容器目标地址下
2.使容器中的一个目录具备持久化存储的功能,该目录可被容器自己使用,也可共享其余容器。。
语法
VOLUME ["<路径1>","<路径2>"…]
VOLUME <路径>
实例
VOLUME /tmp
VOLUME 指向了一个 /tmp的目录,因为 Spring Boot 使用内置的Tomcat容器,Tomcat 默认使用 /tmp做为工做目录。这个命令的效果是:在宿主机的 /var/lib/docker目录下建立一个临时文件并把它连接到容器中的 /tmp目录
目的
声明端口
特色
声明容器打算用什么端口,不会自动在宿主进行端口映射。
运行时用随机映射,会自动映射EXPOSE的端口。
-p <宿主端口>:<容器端口>,将容器对应端口服务公开给外界访问。
语法
EXPOSE <端口1> [<端口2>…]
实例
EXPOSE 8080
目的
入口点,在指定容器启动程序及参数
特色
场景一:让镜像变成像命令同样使用。
场景二:应用运行前的准备工做。
可屡次设置,但只有最后一个有效。
语法
ENTRYPOINT[“executable”,“param1”,“param2”]
ENTRYPOINT command param1 param2
实例
ENTRYPOINT [“java”,"-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
为了缩短 Tomcat 的启动时间,添加 java.security.egd的系统属性指向 /dev/urandom做为 ENTRYPOINT
1.完整项目在笔者github:spring-boot-docker
2.将项目打包为.jar形式,上传项目到linux服务器任意文件夹
FROM java:8 VOLUME /tmp ADD spring-boot-docker.jar /app.jar EXPOSE 8080 ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
# docker build -t spring-boot-docker . 末尾的点表明文件所在目录执行,指上下文目录
编译好的镜像以下:
建立数据卷用来保存mysql的数据,可多个容器共享一个数据卷,当容器被删除时,数据卷不会被删除,mysql的数据依然存在。
# docker volume create mysql_data
运行mysql容器
# docker run -it --rm --name mysql -v mysql_data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=roof -p 3306:3306 -d mysql
-v mysql_data:/var/lib/mysql
/var/lib/mysql是mysql容器数据存储位置
-e MYSQL_ROOT_PASSWORD=t
设置mysql密码
1.进入mysql容器
# docker exec -it mysql bash
2.输入用户名密码
mysql -u root -p
3.设置外部网络访问mysql权限
ALTER user 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'roof';
FLUSH PRIVILEGES;
4.建立数据库,添加数据
create database springboot DROP TABLE IF EXISTS `users`; CREATE TABLE `users` ( `user_id` varchar(20) NOT NULL, `user_password` varchar(100) DEFAULT NULL, PRIMARY KEY (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `users` VALUES ('hly', '123');
docker run --name spring-boot-docker -d -p 8080:8080 --link mysql:mysql spring-boot-docker
--link :alias 添加连接到另外一个容器;
name和id是源容器的name和id,alias是源容器在link下的别名。
为了方便部署,无需每次部署都须要运行mysql数据库,而后再进行建立表,插入数据等一些列操做,咱们能够制做一个mysql镜像,初始化数据库的数据。
首先须要建立一个文件夹,添加四个文件,以下。
FROM mysql:8 # 把数据库初始化数据文件复制到工做目录 COPY springboot.sql /springboot.sql COPY privileges.sql /privileges.sql # 把要执行的shell文件放到/docker-entrypoint-initdb.d/目录下,容器会自动执行这个shell COPY setup.sh /docker-entrypoint-initdb.d/setup.sh # 给执行文件增长可执行权限 RUN chmod a+x /docker-entrypoint-initdb.d/setup.sh
create database springboot; use springboot; DROP TABLE IF EXISTS `users`; CREATE TABLE `users` ( `user_id` varchar(20) NOT NULL, `user_password` varchar(100) DEFAULT NULL, PRIMARY KEY (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `users` VALUES ('hly', '123');
use springboot; ALTER user 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'roof'; FLUSH PRIVILEGES;
#!/bin/bash mysql -u root -p$MYSQL_ROOT_PASSWORD <<EOF source springboot.sql; source privileges.sql;
# docker build -t mysql .
# docker run -it --rm --name mysql -e MYSQL_ROOT_PASSWORD=roof -p 3306:3306 -d
# docker exec -it 1a6 bash
查看表,发现已经建立
参考资料
https://blog.csdn.net/leonardc/article/details/79612612
https://www.jianshu.com/p/21d66ca6115e