预热篇
注意:如果登录linux已经是root权限了就不用在命令前加sudo了。
一、卸载之前的docker
$sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
二、docker-ce安装
$sudo yum install -y yum-utils device-mapper-persistent-data lvm2
$sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
$sudo yum makecache fast
$sudo yum -y install docker-ce
三、启动docker-ce
$sudo systemctl start docker
四、docker常用命令
命令 | 含义 | 实例 |
---|---|---|
docker images | 查看所有镜像 | docker images |
docker ps -a | 查看容器 | docker ps -a |
docker rmi 镜像ID | 删除某个镜像 | docker rmi 383401d398fa |
docker rmi $(docker images -q) | 删除所有镜像 | docker rmi $(docker images -q) |
docker stop 容器 ID | 停止某个容器 | docker stop 383401d398fa |
docker rm 容器 ID | 删除某个容器 | docker rm 383401d398fa |
docker restart 容器 ID | 重启某个容器 | docker restart 383401d398fa |
docker stop $(docker ps -a -q) | 停止所有容器 | docker stop $(docker ps -a -q) |
docker rm $(docker ps -a -q) | 删除所有容器 | docker rm $(docker ps -a -q) |
docker build -t springboot . | 通过Dockerfile构建镜像 | docker build -t springboot . |
docker run -itd --net=host -v /opt/:/opt/ --name app spring:latest | 通过脚本构建容器并启动 | |
docker logs -f -t --tail 100 容器 ID | 查看日志 | docker logs -f -t --tail 100 pay-master |
docker history 镜像名 | 查看镜像构建历史 | docker history mongo |
docker exec -it -u root 容器ID bash | 进入容器 | docker exec -it -u root jenkins bash |
Ctrl+d | 退出docker容器 | Ctrl+d |
exit | 退出docker容器 | exit |
实战篇
五、Dockerfile
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG DEPENDENCY=target/dependency
RUN set -xe \ && apk --no-cache add ttf-dejavu fontconfig
ENV TIME_ZONE Asiz/Shanghai
ENV JAVA_OPTS="-server -Duser.timezone=GMT+08 -Djava.security.egd=file:/dev/./urandom"
ENTRYPOINT [ "/bin/sh", "-c", "sh /opt/app/start.sh" ]
- FROM openjdk:8-jdk-alpine
docker引用的是 openjdk:8-jdk-alpine镜像
- VOLUME /tmp
指向了一个/tmp的目录,由于 Spring Boot 使用内置的Tomcat容器,Tomcat 默认使用/tmp作为工作目录。这个命令的效果是:在宿主机的/var/lib/docker目录下创建一个临时文件并把它链接到容器中的/tmp目录
- ARG DEPENDENCY=target/dependency
当解压插件执行完成后,target目录下会有一个dependency目录
.
├── BOOT-INF
│ ├── classes
│ └── lib
├── META-INF
│ ├── MANIFEST.MF
│ └── maven
└── org
└── springframework
ENTRYPOINT 最后一个参数是启动类
- RUN set -xe \ && apk --no-cache add ttf-dejavu fontconfig
安装字体,Captcha需要字体支持
- ENV TIME_ZONE Asiz/Shanghai
Docker容器设置上海时区,解决时区及时间同步问题
- JAVA_OPTS="-server -Duser.timezone=GMT+08 -Djava.security.egd=file:/dev/./urandom"
引用环境变量,最终是传入容器里交付件的启动命令中
- ENTRYPOINT [ “/bin/sh”, “-c”, “sh /opt/sh/start.sh” ]
脚本启动,指定启动的路径
- ENTRYPOINT [“java”,"-jar","~/app.jar"]
不用脚本的启动方式
六、start.sh
#!/bin/bash
java $JAVA_OPTS -server -Xms400m -Xmx500m -Xmn400m -Duser.timezone=GMT+08 \
-Djava.security.egd=file:/dev/./urandom -jar /opt/app/app.jar \
--logging.level.=ERROR \
--spring.datasource.url=jdbc:mysql://localhost:3306/hibernate?useSSL=false \
--spring.datasource.username=root \
--spring.datasource.password=123456 \
--spring.redis.host=localhost \
--spring.redis.password=zzx123456 \
--spring.redis.port=6379 \
最后启动项目就能访问应用了
注意:这里我们用下面命令启动
$docker run -itd --net=host -v /opt/netty/:/opt/ --name app spring:latest
为什么?
我的jar包和start.sh脚本的真实路径如下
而我的Dockerfile执行bash脚本的路径是:/opt/app/start.sh
同样我的start.sh启动jar包的路径是:/opt/app/app.jar
看清楚了吧?
启动命令中/opt/netty/:/opt/表示用/opt/netty/路径去映射docker的/opt/路径
有什么好处?
当服务器需要管理多个应用时,我们将多个应用都放在/opt下方便管理,但不映射的话没法启动多个应用,所以这样做!