【Docker】【附命令含义】Jar包打镜像、上传到私有仓库、启动

一、准备相关镜像

1.1 拉取镜像

# 拉取jdk8镜像
docker pull docker.io/java:openjdk-8u111-jre-alpine
# 拉取私有仓库registry镜像
docker pull registry

修改docker配置。编辑/etc/docker/daemon.json,设置insecure-registries

{"insecure-registries":["安装registry仓库ip:端口(5000)"]}

重启docker

systemctl daemon-reload
systemctl restart docker

1.2 启动私有仓库

-d 后台启动
-p 端口映射 宿主机端口:容器内端口
-v 数据卷映射 宿主机位置:容器内位置
–restart=always docker启动后会自动启动该容器
name [容器名称]
最后的registry 镜像名

# 递归创建目录
mkdir -pv /opt/docker/registry
mkdir -pv /etc/docker/registry
# 设置数据卷并启动
docker run -d -p 5000:5000 -v /opt/docker/registry:/var/lib/registry  --restart=always --name registry registry

二、创建一个Dockerfile文件

假定要打包的jar的访问端口为9402,名称为app.jar。Dockerfile和app.jar在同级目录下

# 1.语法:FROM <image>:<tag>  
# 指明构建的新镜像是来自于哪个基础镜像,如果没有选择 tag,那么默认值为 latest。
# 如果不以任何镜像为基础,那么写法为:FROM scratch。
FROM docker.io/java:openjdk-8u111-jre-alpine
# 2.语法:LABEL <key>=<value> <key>=<value> <key>=<value> ...
# 功能是为镜像指定标签。也可以使用 LABEL 来指定镜像作者。
LABEL maintainer="dreambyday"
# 3.语法:RUN <command> 
# 构建镜像时运行的 Shell 命令,比如构建的新镜像中我们想在 /usr/local 目录下创建一个 java 目录。
RUN mkdir -p /skywalking
RUN mkdir -p /home/app
# 4.语法:ADD <src>... <dest>
# 拷贝文件或目录到镜像中。src 可以是一个本地文件或者是一个本地压缩文件,压缩文件会自动解压。还可以是一个 url,如果把 src 写成一个 url,那么 ADD 就类似于 wget 命令,然后自动下载和解压。
# ADD apache-skywalking-apm-8.9.1.tar.gz /skywalking

# 5.语法:COPY <src>... <dest>
# 拷贝文件或目录到镜像中。用法同 ADD,只是不支持自动下载和解压。
COPY app.jar /home/app
# 6.语法:EXPOSE <port> [<port>/<protocol>...]
# 暴露容器运行时的监听端口给外部,可以指定端口是监听 TCP 还是 UDP,如果未指定协议,则默认为 TCP
# 如果想使得容器与宿主机的端口有映射关系,必须在容器启动的时候加上 -P 参数。
EXPOSE 80 443 9402/tcp

# 7.语法:ENV <key> <value> 添加单个,ENV <key>=<value> ... 添加多个。
# ENV JAVA_HOME /usr/local/java/openjdk-8u111-jre-alpine/

# 8.语法:WORKDIR /path/to/workdir
# 为 RUN、CMD、ENTRYPOINT 以及 COPY 和 AND 设置工作目录。
WORKDIR /home/app
# 9.语法:
# CMD ["executable","param1","param2"],比如:CMD ["/usr/local/tomcat/bin/catalina.sh", "run"]
# CMD ["param1","param2"],比如:CMD [ "echo", "$JAVA_HOME" ]
# CMD command param1 param2,比如:CMD echo $JAVA_HOME
# 启动容器时执行的 Shell 命令。在 Dockerfile 中只能有一条 CMD 指令。如果设置了多条 CMD,只有最后一条 CMD 会生效。
# 如果创建容器的时候指定了命令,则 CMD 命令会被替代
# 关于CMD的详细测试看https://blog.csdn.net/xyz/article/details/118269856
# 两者对比:https://blog.csdn.net/taiyangdao/article/details/73214449
CMD java -jar app.jar --spring.profiles.active=sqlfx,prod
# 10.语法:
# ENTRYPOINT ["executable", "param1", "param2"],比如:ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh", "run"]
# ENTRYPOINT command param1 param2,比如:ENTRYPOINT ehco $JAVA_HOME
# 如果在 Dockerfile 中同时写了 ENTRYPOINT 和 CMD,并且 CMD 指令不是一个完整的可执行命令,那么 CMD 指定的内容将会作为 ENTRYPOINT 的参数;
# 如果在 Dockerfile 中同时写了 ENTRYPOINT 和 CMD,并且 CMD 是一个完整的指令,那么它两会互相覆盖,谁在最后谁生效

# 11.VOLUME["/var/lib/mysql"]  
# 指定容器挂载点到宿主机自动生成的目录或其他容器。一般的使用场景为需要持久化存储数据时。
# 容器的 /var/lib/mysql 目录会在运行时自动挂载为匿名卷,匿名卷在宿主机的 /var/lib/docker/volumes 目录下
# 一般不会在 Dockerfile 中用到,更常见的还是在 docker run 的时候通过 -v 指定数据卷。

三、编写构建、启动脚本

1. 编写启动命令:restart.sh

# 停止并删除容器
docker ps -a| grep app | awk '{print $1}' | xargs docker rm -f
# 删除名为csa的镜像
docker images | grep app | awk '{print $3}' | xargs docker rmi
# 使用当前目录的 Dockerfile 创建镜像名为csa,tag为1.0.0的镜像。注意结尾有.
docker build -t app:1.0.0 .
# # 通过 -f Dockerfile 文件的位置创建镜像
# docker build -f /usr/local/dockerfile/Dockerfile -t app:1.0.0 .

# 语法:docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
# 标记本地镜像,将其归入某一仓库
docker tag csa:1.0.0 127.0.0.1:5000/app:1.0.0
# 上传镜像到仓库
docker push 127.0.0.1:5000/app:1.0.0
# 启动容器,外部访问端口为8899
docker run -d -p 8899:9402 -v /home/app/Docker版/logs:/home/app/logs  --name csa 127.0.0.1:5000/app:1.0.0

2. 结合配置中心可能遇到的问题

配置中心注册的是容器内部服务的ip,而不是容器所在宿主机的ip,因此其它服务通过注册中心找不到相应服务。可以设置容器内外网络连通。

docker run -d --network=host -v /home/csa/Docker版/logs:/home/app/logs --name csa 172.18.18.148:5000/csa:1.0.0

设置–network=host后,默认容器暴露端口和服务端口相同,设置端口映射无用。

3. 文件目录

前几步完成后得到的目录如下。
在这里插入图片描述

四、其它操作

1 删除私有仓库镜像

在1.2节已经将私有仓库镜像映射到宿主机。所以可以直接删除/opt/docker/registry数据卷镜像达到删除私有参仓库镜像的目的。

详细参考

2 同一个镜像有多个仓库源导致无法删除

删除时用[REPOSITORY:TAG]删除

docker rmi REPOSITORY:TAG

3 进入容器

docker exec -it [containerId] sh 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值