You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

399 lines
11 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# $Docker$使用方法
### 一、安装
#### 1、脚本安装
```shell
yum install -y yum-utils
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin -y
```
#### 2、配置镜像源
> 因为 “**未知**” 的原因,造成国内的$Docker$源全部失效,只好使用老毛子的$Docker$源,科学无国界~
```shell
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<EOF
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://huecker.io",
"https://dockerhub.timeweb.cloud",
"https://noohub.ru"
]
}
EOF
systemctl daemon-reload
```
#### 3、常用命令
```shell
# 启动Docker
systemctl start docker
# 卸载Docker
yum remove docker-ce
# 删除镜像、容器、配置文件等内容
rm -rf /var/lib/docker
```
### 二、镜像
**查看可用版本**
```
docker search tomcat
```
**下载$Tomcat$镜像**
```
docker pull tomcat # 下载最新版本的Tomcat
docker pull tomcat:9.0 # 下载9.0版本的Tomcat
docker pull tomcat:8.0 # 下载8.0版本的Tomcat
```
**查看本地镜像**
```
docker images
```
**删除本地下载好的镜像**
```
docker rmi -f <IMAGE_NAME_OR_ID>
```
### 三、容器
#### 1、运行容器
```
docker run --name tomcat -p 8080:8080 -v $PWD/test:/usr/local/tomcat/webapps/test -d tomcat
```
**命令说明**
```
-p 8080:8080将主机的 8080 端口映射到容器的 8080 端口
-v $PWD/test:/usr/local/tomcat/webapps/test 将主机中当前目录下的 test 挂载到容器的 /test
-d这个参数表示以“detached”模式运行容器即在后台运行。
tomcat这是要运行的 Docker 镜像的名称。在这个命令中,它假定您已经有了一个名为 tomcat 的本地镜像,或者 Docker 将尝试从 Docker Hub 拉取一个名为 tomcat 的公共镜像。
```
#### 2、查看容器
```
docker ps
```
#### 3、删除容器
```
docker rm -f 4bf2bd13f5b0
```
#### 4、进入容器
```
docker exec -it 4bf2bd13f5b0 /bin/bash
```
#### 5、将文件复制到容器外
```
docker cp 4bf2bd13f5b0:/usr/local/1.txt ./
```
#### 6、将文件复制回容器
```
docker cp ./1.txt 4bf2bd13f5b0:/usr/local/
```
### 四、使用$Dockerfile$创建镜像
> $dockerfile$ 内容如下:
```shell
# 指定了使用openjdk:8u332-jre-slim-bullseye镜像作为基础镜像并且给这个镜像起了一个别名runner
FROM openjdk:8u332-jre-slim-bullseye AS runner
# WORKDIR指令用于设置容器内部的工作目录即后续指令执行时的当前目录。当Docker容器启动并执行命令时这些命令将在WORKDIR指定的目录中执行。
WORKDIR /root
# ENV TZ这样的用法通常是用来设置时区环境变量TZ代表Time Zone
ENV TZ=Asia/Shanghai
# 将target文件夹下的jar包gw-charge.jar复制到容器的/root目录下
COPY ./target/gw-charge.jar /root/gw-charge.jar
# 每个参数的含义:
#-server选择服务器server模式这是JVM的高性能模式。
#-XX:+UnlockExperimentalVMOptions启用JVM中的实验性选项。
#-XX:+UseCGroupMemoryLimitForHeap让JVM堆内存大小限制与cgroups的内存限制一致。cgroups是一种Linux内核特性用于限制进程组使用的资源。
#-XX:MaxRAMFraction=1设置JVM可以使用的最大堆内存占系统总内存的比例为100%。
#设置这个环境变量后您可以在Docker容器中启动Java应用程序时使用这些参数。
ENV JAVA_OPTS="-server -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=1 "
# 这行指令设置了名为ENV_OPTS的环境变量其值是一个用于Spring应用程序的命令行参数用来激活名为test的配置文件。
# 这个参数通常在启动Spring应用程序时使用以确保应用程序加载正确的配置。
# Spring Boot会根据以下优先级顺序来确定激活的配置文件
#命令行参数:使用-Dspring.profiles.active=...指定的配置文件具有最高的优先级。
#环境变量如果设置了SPRING_PROFILES_ACTIVE环境变量它将覆盖配置文件中的设置。
#配置文件中的spring.profiles.active在application.properties或bootstrap.properties以及对应的YAML格式中设置的spring.profiles.active具有较低的优先级。
#在您提供的情况中通过ENV指令设置的环境变量ENV_OPTS包含了-Dspring.profiles.active=test这意味着在启动Java应用程序时将通过命令行参数指定test配置文件为激活配置。因此即使bootstrap.yml文件中设置了profiles: active: dev应用程序最终将使用test配置文件因为命令行参数的优先级高于配置文件中的设置。
#所以最终JAR包执行时将使用test配置文件。
ENV ENV_OPTS="-Dspring.profiles.active=dev"
#ENV ENV_OPTS="-Dspring.profiles.active=pro"
# sh -c这告诉Docker容器使用shShell来执行后面的命令字符串。-c参数表示后面跟着的是要执行的命令。
#java $JAVA_OPTS $ENV_OPTS ...这是要执行的Java命令其中$JAVA_OPTS和$ENV_OPTS是之前通过ENV指令设置的环境变量它们将在运行时被替换为它们各自的值。
#-Djava.security.egd=file:/dev/./urandom这是一个Java系统属性用于设置Java加密图形设备EGD的路径。这里指定为/dev/./urandom这是一个提供高熵随机数的Unix特殊文件常用于加密操作。
#-jar /root/gw-charge.jar这指定了要执行的Java归档文件JAR的位置和名称。这里假设JAR文件位于容器的/root目录下名为gw-charge.jar。
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS $ENV_OPTS -Djava.security.egd=file:/dev/./urandom -jar /root/gw-charge.jar" ]
```
#### 创建容器
```
mkdir /usr/local/publish
cd /usr/local/publish
yum install lrzsz -y
rz -be
选择D:\dsWork\YltProject\Ylt\gw-charge\Dockerfile文件后上传
```
将$Java$的微服务项目打包:
![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/202408070818789.png)
![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/202408070818135.png)
#### 继续打包
```
mkdir target
cd target
rz -be
选择D:\dsWork\YltProject\Ylt\gw-charge\target\gw-charge.jar
cd ..
docker build -t gw-charge .
```
这里 `-t gw-charge` 为新创建的镜像指定了一个标签($tag$`.` 表示 $Dockerfile$ 在当前目录。
![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/202408070821632.png)
生成结束:
![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/202408070821581.png)
##### 本地多了一个镜像
```
docker images
```
![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/202408070823604.png)
**运行容器**:一旦镜像构建完成,您可以使用 `docker run` 命令从该镜像启动一个新容器。
```
docker run -d -p 7001:7001 gw-charge
```
`-d` 参数表示在后台运行容器,`-p 7001:7001` 表示将容器内部的 $7001$ 端口映射到宿主机的 $7001$ 端口。
![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/202408070824703.png)
#### 查看容器
```
docker ps -a
```
#### 查看日志
```
docker logs c128a94e5884
```
#### 查看启动界面
http://10.10.14.212:7001
![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/202408070839957.png)
### 五、未来可能的操作
```
# 拷贝出来做备份
docker cp b30008f6e67d:/root/gw-charge.jar ./gw-charge-backup.jar
# 拷贝回去
docker cp ./gw-charge.jar b30008f6e67d:/root
#重启Docker
docker restart b30008f6e67d
# 查看
docker ps
```
#### 查看容器的启动脚本(或命令)
```
docker inspect --format '{{.Config.Entrypoint}}' b30008f6e67d
```
结果:
![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/202408071443832.png)
```
[sh -c java $JAVA_OPTS $ENV_OPTS -Djava.security.egd=file:/dev/./urandom -jar /root/gw-charge.jar]
```
$Q$: \$$JAVA\_OPTS$ \$$ENV\_OPTS$中什么东西呢?
办法:
##### 1、进入容器
```shell
docker exec -it b30008f6e67d /bin/bash
```
##### 2、查看环境变量
```shell
root@b30008f6e67d:~# echo $ENV_OPTS
-Dspring.profiles.active=dev
root@b30008f6e67d:~# echo $JAVA_OPTS
-server -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=1
```
#### 安装$OpenJDK 21$
```
docker pull openjdk:21
```
**删除镜像**
```
docker rmi -f 079114de2be1
```
### 六、实测阿里云容器服务
> **参考文档**[使用个人版实例推送拉取Docker镜像_容器镜像服务(ACR)](https://help.aliyun.com/zh/acr/user-guide/use-a-container-registry-personal-edition-instance-to-push-and-pull-images?spm=a2c4g.11186623.0.0.631a1ecdldRK92)
```shell
docker login --username=东师黄海 registry.cn-hangzhou.aliyuncs.com
Password: DsideaL4r5t6y7u
```
```shell
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credential-stores
Login Succeeded
```
```[root@Docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ms-manager-sass-ui-ylt-main latest 15dfab4dc6ce 5 hours ago 207MB
gw-charge latest 45fdc8de8e89 7 hours ago 234MB
[root@Docker ~]# docker tag 45fdc8de8e89 registry.cn-hangzhou.aliyuncs.com/yltproject/yltproject:1.0
[root@Docker ~]# docker push registry.cn-hangzhou.aliyuncs.com/yltproject/yltproject:1.0
The push refers to repository [registry.cn-hangzhou.aliyuncs.com/yltproject/yltproject]
6ad13f10ba81: Pushed
5f70bf18a086: Pushed
602b7d6108d1: Pushed
d279e3a2f938: Pushed
771f5a5313b8: Pushed
43b3c4e3001c: Pushed
1.0: digest: sha256:d4d017f42400a68867bb4a12b0bc64d04a4ec6ffb40fe2f75c6949632f3d618d size: 1577
[root@Docker ~]#
```
![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/202408071648698.png)
![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/202408071648987.png)
#### 新写的模块打包发布
```
# 生成镜像
docker build -t jfinal .
# 查看镜像
docker images
# 删除镜像
docker rmi -f <IMAGE_NAME_OR_ID>
# 运行容器
docker run --name jfinal -p 8888:8888 -d jfinal
# 查看日志
docker logs d70ce374a7ad
# 删除容器
docker rm -f 8ed8d718533e
# 查看容器
docker ps -a
# 进入容器
docker exec -it d70ce374a7ad /bin/bash
# 重启容器
docker restart d70ce374a7ad
```
![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/202408080740519.png)
![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/202408080742503.png)