# 一.常用命令

# 1.启动停止

# 启动docker
systemctl start docker

# 加入自动启动
systemctl enable docker

# 重启docker
systemctl restart docker

# 查看docker状态
systemctl status docker

# docker版本
docker version

# 卸载docker
yum remove docker-ce
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 2.系统命令

# 查看版本信息
docker version

# 查看具体信息
docker info

# 查看docker容器帮助
docker --help
1
2
3
4
5
6
7
8

# 3.容器数据卷

# 查看挂载列表信息
docker volume ls

# 查看挂载信息
docker volume inspect [volume]

# 挂载操作
docker run -it -v /home/muse/test:/home  centos /bin/bash

# 匿名挂载
docker run -d -P --name nginx1 -v :/ect/nginx  nginx

# 具名挂载
docker  run  -d -P  --name nginx2 -v nginx2:/etc/nginx  nginx
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 4.docker stats

# 检测容器占用的内存和cpu,以及Io情况
docker stats
1
2

image-20230323164253102

# 5.清理 Docker 数据

# 清理未使用的 Docker 镜像:
docker image prune -a

# 清理未使用的 Docker 容器:
docker container prune

# 清理未使用的 Docker 卷:
docker volume prune

# 清理 Docker 系统:
docker system prune
1
2
3
4
5
6
7
8
9
10
11

# 二.镜像命令基础

# 1.查看镜像

# 查看镜像
docker images

# 含中间映像层
docker images -a

# 只显示镜像ID
docker images -q

# 含中间映像层
docker images -qa

# 显示镜像摘要信息(DIGEST列)
docker images --digests

# 显示镜像完整信息
docker images --no-trunc

# 显示指定镜像的历史创建;参数:-H 镜像大小和日期,
# 默认为true;--no-trunc  显示完整的提交记录;-q  仅列出提交记录ID
docker history -H redis
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 2.查询镜像

# 搜素镜像
docker search  rabbitmq

# --filter=stars=600:只显示 starts>=600 的镜像
docker search --filter=stars=600 mysql

# --no-trunc 显示镜像完整 DESCRIPTION 描述
docker search --no-trunc mysql

# --automated :只列出 AUTOMATED=OK 的镜像
docker search  --automated mysql
1
2
3
4
5
6
7
8
9
10
11

# 3.镜像详情

# 获取镜像的详细信息,镜像ID 号可以不用打全。
docker  inspect   镜像ID号
1
2

# 4.拉取镜像

# 下载Redis官方最新镜像,相当于:docker pull redis:latest
docker pull redis

# 下载仓库所有Redis镜像
docker pull -a redis

# 下载私人仓库镜像
docker pull bitnami/redis

# 下载指定版本镜像
docker  pull rabbitmq:3.8.11

# 指定平台
docker pull --platform linux/amd64 <image_name>:<tag>
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 5.删除镜像

# 单个镜像删除,相当于:docker rmi redis:latest
docker rmi redis

# 强制删除镜像
docker rmi -f   imgageID
docker rmi -f   imgageID1  imgageID2  imgageID3
docker rmi  -f  $(docker images -aq)

# 多个镜像删除,不同镜像间以空格间隔
docker rmi -f redis tomcat nginx

# 删除无用的镜像
docker rmi $(docker images | grep "none" | awk '{print $3}')
1
2
3
4
5
6
7
8
9
10
11
12
13

# 6.生成 TAG

# 给镜像打标签
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
docker tag centos centos:v1
1
2
3

# 7.生成本地文件

# 将镜像保存为本地文件
docker   save   -o  存储文件名   存储的镜像

# 保存为文件
docker save openjdk:8 -o openjdk.tar

# 压缩文件
tar zcvf openjdk.tar.gz openjdk.tar
1
2
3
4
5
6
7
8

# 8.加载镜像

# 解压文件
tar -xzvf openjdk.tar.gz

# 加载镜像
docker load -i openjdk.tar
1
2
3
4
5

# 三.镜像命令高阶

# 1.查看有几个镜像

--quiet-qdocker images 命令的一个选项,它的作用是让命令的输出只显示镜像的 ID,而不显示其他详细信息,如仓库名称、标签、创建时间或大小等。这个选项通常用于脚本或自动化任务中,当你只需要镜像 ID 而不需要其他信息时非常有用。

docker images --quiet | wc -l
1

# 2.格式化打印

docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.ID}}\t{{.Size}}"
1

# 3.删除 none 镜像

删除 none 的镜像,要先删除镜像中的容器。要删除镜像中的容器,必须先停止容器。

# 查看镜像
docker images

# 直接删除带none的镜像,直接报错了。提示先停止容器
docker rmi $(docker images | grep "none" | awk '{print $3}')

# 停止容器
docker stop $(docker ps -a | grep "Exited" | awk '{print $1 }')

# 删除容器
docker rm $(docker ps -a | grep "Exited" | awk '{print $1 }')

# 删除镜像
docker rmi $(docker images | grep "none" | awk '{print $3}')
1
2
3
4
5
6
7
8
9
10
11
12
13
14

删除所有为空的:

docker rmi $(docker images -f "dangling=true" -q)
1

# 4.提交镜像

参数说明:

-a 提交的镜像作者; -c 使用 Dockerfile 指令来创建镜像; -m :提交时的说明文字; -p :在 commit 时,将容器暂停

# 基于当前redis容器创建一个新的镜像;
docker commit -a="DeepInThought" -m="my redis" [redis容器ID]  myredis:v1.1
1
2

# 5.镜像加速

http://hub-mirror.c.163.com
1
{
  "builder": {
    "gc": {
      "defaultKeepStorage": "20GB",
      "enabled": true
    }
  },
  "experimental": false,
  "features": {
    "buildkit": true
  },
  "registry-mirrors": ["http://hub-mirror.c.163.com"]
}
1
2
3
4
5
6
7
8
9
10
11
12
13

# 6.清理未使用镜像

docker image prune -a

# 跳过yes
docker image prune -a -f
1
2
3
4

# 7.查看镜像指令

docker history langchain-chainlit-chat-app
1

# 8.查看镜像架构

要查看一个 Docker 镜像是 ARM 架构还是 x86 架构,你可以通过以下几种方法来检查镜像的架构信息:

如果你已经拉取了镜像,可以使用 docker inspect 来查看镜像的详细信息,包括它的架构。

docker inspect <镜像ID或镜像名称>
1

输出中查找 "Architecture" 字段,它会显示镜像的架构。例如,amd64 表示 x86_64 架构,armarm64 表示 ARM 架构。

# 四.容器命令

# 1.查询容器

# 1.基础用法

#查询容器列表
docker ps 参数
1
2

# 2.参数-a


#查看生成的容器   启动+不启动
docker ps -a
1
2
3

# 3.格式化

#查看容器名称
docker ps --format "{{.Names}}"
1
2
# 表格格式化输出
docker ps -a --format "table {{.ID}}\t{{.Image}}\t{{.Names}}\t{{.Command}}\t{{.Status}}\t{{.Ports}}"

# 常用表格格式化输出
docker ps -a --format "table {{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Ports}}"
1
2
3
4
5

# 4.最近创建

#显示最近创建容器
docker ps -l

#显示最近创建的3个容器
docker ps -n 3
1
2
3
4
5

# 5.不截断输出

#不截断输出
docker ps --no-trunc
1
2

# 2.启动容器

#启动容器
docker start  容器id

#重启容器
docker restart 容器id
1
2
3
4
5

# 3.停止容器

# 停止容器
docker  stop  容器id

# 停止指定容器
docker stop $(docker ps -a -q -f name=nebula)

# 强制停止容器
docker  kill  容器id
1
2
3
4
5
6
7
8

# 4.拷贝数据

#从宿主机拷贝到容器
docker cp /home  容器id:/home
docker cp /home/train.csv aigateway:/home/fastai/zzy/test0

#从容器拷贝到宿主机
docker  cp 容器name:/home   /home

#拷贝容器数据到宿主机,容器可以未启动成功
docker  cp c0392d2705b2:.chainlit/config.toml   /kwan/chainlit/langchain-chainlit-docker-deployment-template/.chainlit

#./ 代表当前目录
docker cp  chatbot:/app/app.py ./
1
2
3
4
5
6
7
8
9
10
11
12

举例:需要在宿主机执行

docker  cp 8de806c5a8b7:/usr/share/elasticsearch/data   /data/deploy-fastagi/middleware/elasticsearch/graph/
1

# 5.进入容器

# 1.使用方式

docker attach 1e560fca4907
1
docker exec -it 1e560fca4907 bash
1
# windows进入docker容器
docker exec -it 38de0a4e449b   /bin/bash
1
2

# 2.容器生命周期

  • docker attach:退出会话时,容器会停止。
  • docker exec:退出会话时,容器继续运行。

# 3.进程管理

  • docker attach:直接与容器的主进程交互。
  • docker exec:在容器内部启动新的进程。

# 4.使用场景

  • docker attach:适用于需要临时进入容器进行操作,且不介意容器停止的场景。
  • docker exec:适用于需要进入容器进行操作,但希望容器继续运行的场景。

# 6.退出容器

#退出容器
exit
1
2

# 7.删除容器

#删除容器
docker rm  参数   容器id

#删除多个容器
docker rm -f $(docker ps -a -q)

#删除所有容器
docker rm $(docker ps -aq)

# 强制删除所有容器
docker rm -f $(docker ps -aq)

#只删除已停止的容器
docker container prune

# -l 移除容器间的网络连接,连接名为 db
docker rm -l db

#-v 删除容器,并删除容器挂载的数据卷
docker rm -v redis

#强制删除容器
docker rm -f xxxxxx

# 关闭容器
sudo docker kill d208b8055fd0

# 删除指定容器
docker rm  -f $(docker ps -a -q -f name=nebula)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

# 五.容器启动

# 1.启动命令参数

通过 run 命令创建一个新的容器

  • --name="", 指定容器名字,后续可以通过名字进行容器管理,links 特性需要使用名字
  • -v, --volume=[], 给容器挂载存储卷,挂载到容器的某个目录
  • -h, --hostname="", 指定容器的主机名
  • --dns=[], 指定容器的 dns 服务器
  • -d, --detach=false, 指定容器运行于前台还是后台,默认为 false
  • -p, --publish=[], 指定容器暴露的端口
  • -P, --publish-all=false, 指定容器暴露的端口
  • -i, --interactive=false, 打开 STDIN,用于控制台交互
  • -t, --tty=false, 分配 tty 设备,该可以支持终端登录,默认为 false
  • -u, --user="", 指定容器的用户
  • -a, --attach=[], 登录容器(必须是以 docker run -d 启动的容器)
  • -w, --workdir="", 指定容器的工作目录
  • -c, --cpu-shares=0, 设置容器 CPU 权重,在 CPU 共享场景使用
  • -e, --env=[], 指定环境变量,容器中可以使用该环境变量
  • -m, --memory="", 指定容器的内存上限
  • --volumes-from=[], 给容器挂载其他容器上的卷,挂载到容器的某个目录
  • --cap-add=[], 添加权限
  • --cap-drop=[], 删除权限
  • --cidfile="", 运行容器后,在指定文件中写入容器 PID 值,一种典型的监控系统用法
  • --cpuset="", 设置容器可以使用哪些 CPU,此参数可以用来容器独占 CPU
  • --device=[], 添加主机设备给容器,相当于设备直通
  • --dns-search=[], 指定容器的 dns 搜索域名,写入到容器的/etc/resolv.conf 文件
  • --entrypoint="", 覆盖 image 的入口点
  • --env-file=[], 指定环境变量文件,文件格式为每行一个环境变量
  • --expose=[], 指定容器暴露的端口,即修改镜像的暴露端口
  • --link=[], 指定容器间的关联,使用其他容器的 IP、env 等信息
  • --lxc-conf=[], 指定容器的配置文件,只有在指定--exec-driver=lxc 时使用
  • --net="", 容器网络设置
  • --privileged=false, 指定容器是否为特权容器,特权容器拥有所有的 capabilities
  • --restart="":指定容器停止后的重启策略
  • --rm=false, 指定容器停止后自动删除容器(不支持以 docker run -d 启动的容器)
  • --sig-proxy=true, 设置由代理接受并处理信号,但是 SIGCHLD、SIGSTOP 和 SIGKILL 不能被代理

# 2.启动命令

##新建并启动容器,参数:-i  以交互模式运行容器;-t  为容器重新分配一个伪输入终端;--name  为容器指定一个名称
docker run -it -p 9876:9876 09bbc30a03b6

#后台启动容器,参数:-d  已守护方式启动容器
docker run -d mycentos

#启动h2o
docker run -d -p 9876:9876 h2oai/h2o-open-source-k8s

#通过镜像名字启动容器
docker run --name nginx -p 80:80 -d nginx
docker run --name h2o-k8s -p 54321:54321 -d qyj1992/h2o-k8s

#通过镜像名字启动容器
docker run -d -p 80:80 nginx

#运行容器
docker run  参数  image名字

#启动nginx,并挂在配置文件目录到宿主机
docker run -d --name deepexi-belle-damo-nginx --privileged=true --dns 114.114.114.114 -p 80:80  \
-v /etc/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf \
 --restart=always deploy.deepexi.com/datasense-test/deepexi-belle-damo-nginx:v1.0.0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# 3.配置 host

在 docker run 运行容器的时候,添加参数--add-host [域名]:[IP]

#添加域名映射
docker run -d -p 8100:8100 --add-host demo-db:192.168.1.21 --name demo demo:v0724.01
1
2

如果要配置多个域名,那添加多个参数就 ok 了。如下面例子中的 host 和 host2

#添加多个域名映射
docker run -d -p 8100:8100 --add-host demo-db:192.168.1.21 --add-host2 demo-db:192.168.1.22 --name demo demo:v0724.01
1
2

# 4.启动后挂载

当你使用 docker run 命令启动一个容器后,如果需要挂载更多的目录,可以使用 docker container update 命令来更新容器的配置。

例如,假设你已经启动了一个名为 my_container 的容器,现在你想要将目录 /app 挂载到这个容器中。可以使用以下命令来更新容器的配置:

docker container update -v /home/app/chatbot/config.toml:/app/.chainlit/config.toml chatbot
1

在这个命令中,--mount 参数用于指定要挂载的目录,source=/app 表示要挂载的目录为本地的 /app 目录,target=/app 表示要挂载到容器中的目录为 /app

注意,如果你更新了容器的配置,容器需要重新启动才能应用新的配置。可以使用 docker container restart 命令来重新启动容器。例如,以下命令可以重新启动名为 my_container 的容器:

docker container restart my_container
1

重新启动容器后,新挂载的目录就可以在容器中使用了。

#将容器中的文件移动到宿主机
docker  cp f5c2c45967f0:/app/.chainlit/config.toml  /home/app/chatbot
1
2

# 5.共用网络

--network=host 是在 Docker 命令中指定的一个选项,它具有以下作用:

当您在 Docker 中运行容器时,默认情况下,每个容器都会有自己的网络命名空间,这意味着容器内部和宿主机之间的网络是隔离的。容器中的应用程序可以通过 Docker 网络进行通信,但它们无法直接访问宿主机的网络。

使用 --network=host 选项可以使容器与宿主机共享网络命名空间。这样,容器内的应用程序可以像它们直接运行在宿主机上一样访问宿主机的网络接口。

具体而言,--network=host 的作用如下:

  1. 容器可以使用宿主机的 IP 地址。
  2. 容器中的应用程序可以使用宿主机上打开的端口。
  3. 容器可以直接访问宿主机上的网络设备,如网络接口卡。

这种模式对于需要与宿主机紧密集成的应用程序非常有用,例如需要绑定宿主机上特定端口的应用程序或需要访问宿主机上的网络设备的应用程序。

需要注意的是,使用 --network=host 选项会使容器丧失网络隔离的优势,因此需要谨慎使用,并确保对容器内部的网络安全进行适当的配置和保护。

# 6.无法删除容器

当你遇到错误信息 "Error response from daemon: cannot stop container: d208b8055fd0: permission denied" 时,这通常意味着你没有足够的权限来停止 Docker 容器。以下是一些可能的解决方案:

  1. 使用 sudo 提升权限:如果你没有以 root 用户运行 Docker 命令,可能需要使用sudo来提升权限。例如,使用 sudo docker stop d208b8055fd0

  2. 检查 AppArmor 状态:如果你的系统使用 AppArmor,可能需要禁用 AppArmor 服务。根据[^3^],可以尝试以下命令:

    sudo systemctl stop apparmor
    sudo service apparmor teardown
    
    1
    2
  3. 重启 Docker 服务:有时候重启 Docker 服务可以解决停止容器的问题。使用以下命令:

    sudo systemctl restart docker
    
    1
  4. 强制停止容器:如果容器无法正常停止,你可以尝试强制停止它。使用以下命令:

    sudo docker kill d208b8055fd0
    
    1
  5. 检查是否有未知的 AppArmor 策略:根据[^2^],如果遇到权限问题,可以尝试使用以下命令来移除未知的 AppArmor 策略:

    sudo aa-remove-unknown
    
    1
  6. 检查用户权限:确保你属于 docker 用户组。如果不是,可以使用以下命令添加:

    sudo usermod -aG docker ${USER}
    
    1
  7. 检查容器状态:确保容器不是在运行状态。如果是,你不能直接删除它,需要先停止。

  8. 检查是否有其他进程锁定了容器:有时候,可能有其他进程锁定了容器,导致无法停止。检查是否有其他命令行会话或脚本正在使用该容器。

请根据你的具体情况尝试上述方法之一或组合使用,以解决你的问题。

# 7.-d 和-it 的区别

在使用 Docker 时,docker run 命令用于创建和启动一个容器实例。-d-it 是两个常用的选项,它们分别用于不同的场景:

  1. -d: 这个选项表示 "detached" 模式,即后台运行容器。当你使用 -d 选项时,Docker 会在后台启动容器,并且不会阻塞当前的命令行或终端。这通常用于需要持续运行的服务或应用。例如:

    docker run -d my_image
    
    1

    这条命令会启动一个名为 my_image 的 Docker 容器,并在后台运行。

  2. -it: 这个选项是 -i-t 的组合。

    • -i 表示 "interactive",即使没有附加到容器的标准输入,Docker 也会保持容器运行。
    • -t 表示 "pseudo-tty",它会分配一个伪终端或终端给容器,这样你就可以与容器进行交互,就像在本地终端一样。

    使用 -it 选项时,你可以启动一个容器并立即进入其命令行界面。这通常用于调试或需要与容器交互的场景。例如:

    docker run -it my_image bash
    
    1

    这条命令会启动一个名为 my_image 的 Docker 容器,并打开一个 bash 会话,允许你与容器进行交互。

# 六.容器高阶操作

# 1.操作全部容器

#docker中     所有的容器命令
docker start $(docker ps -a | awk '{ print $1}' | tail -n +2)

#docker中    关闭所有的容器命令
docker stop $(docker ps -a | awk '{ print $1}' | tail -n +2)

#docker中 删除所有的容器命令
docker rm $(docker ps -a | awk '{ print $1}' | tail -n +2)

#docker中    删除所有的镜像
docker rmi $(docker images | awk '{print $3}' |tail -n +2)
1
2
3
4
5
6
7
8
9
10
11

# 2.内存查看

docker stats 是 Docker 命令行工具的一部分,用于显示关于运行中容器的实时资源使用情况的统计信息。下面是对 docker stats 命令的中文详细解释:

#查看状态
docker stats

#显示指定容器
docker stats container_name

#显示所有容器(包括停止的)
docker stats --all

#指定格式
docker stats --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}"
1
2
3
4
5
6
7
8
9
10
11

image-20240110174014079

docker stats 输出的信息包括以下列:

  • CONTAINER:容器的名称或 ID。
  • CPU %:CPU 使用率。
  • MEM USAGE / LIMIT:内存使用量和限制。
  • MEM %:内存使用率。
  • NET I/O:网络输入/输出。
  • BLOCK I/O:块设备输入/输出。
  • PIDS:进程 ID 数量。

# 3.详细信息

# docker容器详细信息
docker inspect d208b8055fd0
1
2

# 4.查看 top 信息

#查看容器的进程信息
docker  top   容器id
1
2

# 5.删除无标签镜像

删除无标签镜像的命令非常简洁,如下所示:

docker rmi $(docker images -f "dangling=true" -q)
1

这个命令的执行流程可以分为几个步骤:

  1. 列出所有无标签镜像docker images -f "dangling=true"命令会列出所有没有标签的镜像。

  2. 获取镜像 ID-q选项确保命令只输出每个无标签镜像的 ID,不包括其他信息。

  3. 删除镜像docker rmi命令用于删除指定的镜像。

  4. 命令替换$(...)是一个命令替换,它将上一个命令的输出(即所有无标签镜像的 ID)作为当前命令的参数。

# 6.清理未使用容器

docker container prune
1

# 7.容器变量

要在容器内部打印 WORKER_TIMEOUT,你可以使用以下步骤:

  1. 进入容器:使用 docker exec 命令进入正在运行的容器。
docker exec -it <container_id> /bin/sh
1
  1. 打印环境变量:一旦进入容器,可以使用 echo 命令打印 WORKER_TIMEOUT 的值。
echo $WORKER_TIMEOUT
1
  1. 如果没有设置:如果返回空值,说明该环境变量未设置。可以通过在容器启动时设置来配置它。

# 8.导入导出

# 导出
docker export 3fb3dd9716a8 > redis.tar

# 导入
cat redis.tar | docker import - redis:6-alpine
1
2
3
4
5

注意事项:

  • 需要注意导入导出的 docker 的版本一致,避免出现不可用的情况
  • 最好还是使用离线镜像包

# 七.日志相关

# 1.容器 id

#查看末尾3000行
docker logs --tail 3000  8fb12d346c3c

#滚动最后100行
docker logs -f --tail 100  8fb12d346c3c
1
2
3
4
5

# 2.容器名称

#查看末尾3000行
docker logs -f  --tail 500  ${CONTAINER_NAME}
1
2

# 3.带关键字

#滚动最后100行
docker logs -f --tail 100  38de0a4e449b  | grep 'ads_day_city_brand_sku_size_rep'

#最后3000带查询
docker logs --tail 30000  38de0a4e449b | grep 'java.lang.StringIndexOutOfBoundsException'

#查询执行失败的原因
docker logs --tail 100000  38de0a4e449b  | grep -A 100 'jobWasExecuted:' | grep '2022/04/02'

#查询错误的原因
docker logs --tail 40000  38de0a4e449b  | grep 'Exception' | grep '数据处理异常,错误信息='

#查询关键字
docker logs --tail 40000  38de0a4e449b  | grep '数据处理异常,错误信息='


docker logs --tail 400000000  0805f522a031  | grep '请求数据耗时'

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 4.输出到文件

#输出到文件,>>是追加到文件结尾
docker logs --tail 1000  38de0a4e449b   >> logs_error.txt
1
2

# 5.滚动查看日志

docker logs -f -t -n=5 {容器id}
1

# 6.时间范围

docker logs -f --since "2023-02-22" b93a3a7a64f5
1

# 7.批量删除容器日志

查看磁盘占用情况:

df -mh
1
#!/bin/bash
echo "==================== start clean docker containers logs =========================="

logs=$(find /var/lib/docker/containers/ -name *-json.log)

for log in $logs
        do
                echo "clean logs : $log"
                cat /dev/null > $log
        done
echo "==================== end clean docker containers logs   =========================="
1
2
3
4
5
6
7
8
9
10
11

# 八.项目实战

# 1.push to harbor

创建 push_to_kwan_harbor.sh 文件,文件内容如下:

#!/usr/bin/env bash

PROFILE=$1

if [ "$PROFILE" = "dev" ] || [ "$PROFILE" = "test" ] || [ "$PROFILE" = "uat" ] || [ "$PROFILE" = "prd" ]; then
  echo "building profile $PROFILE"
else
  echo "param 1 can only be dev test uat prd"
  return
fi

mvn clean package -P $PROFILE
docker login deploy.kwan.com -u datasense -p 自己的密码
docker build -t kwan-dsc-belle-insight-$PROFILE .
docker tag kwan-dsc-belle-insight-$PROFILE:latest deploy.kwan.com/datasense-test/kwan-dsc-belle-insight-$PROFILE:latest
docker push deploy.kwan.com/datasense-test/kwan-dsc-belle-insight-$PROFILE:latest
docker rmi kwan-dsc-belle-insight-$PROFILE:latest deploy.kwan.com/datasense-test/kwan-dsc-belle-insight-$PROFILE:latest
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 2.构建镜像

sh push_to_kwan_harbor.sh test
1

# 3.启动文件

创建 run.sh 文件

#!/usr/bin/env bash

PROFILE=$1

if [ "$PROFILE" = "dev" ] || [ "$PROFILE" = "test" ] || [ "$PROFILE" = "uat" ] || [ "$PROFILE" = "prd" ]; then
  echo "building profile $PROFILE"
else
  echo "param 1 can only be dev test uat prd"
  return
fi

CONTAINER_NAME=kwan-dsc-belle-insight-$PROFILE
IMAGE_NAME=deploy.kwan.com/datasense-test/kwan-dsc-belle-insight-$PROFILE:latest

docker rm -f ${CONTAINER_NAME}
docker rmi ${IMAGE_NAME}
docker pull ${IMAGE_NAME}
docker run -d --name ${CONTAINER_NAME} --privileged=true --dns 114.114.114.114 -e PROFILE=${PROFILE} -w /home -p 8099:80 -v $PWD/logs:/home/logs -v /home/uploads:/home/uploads --restart=always ${IMAGE_NAME}
docker logs -f ${CONTAINER_NAME}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

在服务器上执行,不存在,则生成,存在,则覆盖源文件:

cat <<EOF >run.sh
#!/usr/bin/env bash

PROFILE=\$1

if [ "\$PROFILE" = "dev" ] || [ "\$PROFILE" = "test" ] || [ "\$PROFILE" = "uat" ] || [ "\$PROFILE" = "prd" ]; then
  echo "building profile \$PROFILE"
else
  echo "param 1 can only be dev test uat prd"
  return
fi

CONTAINER_NAME=kwan-dsc-belle-insight-\$PROFILE
IMAGE_NAME=deploy.kwan.com/datasense-test/kwan-dsc-belle-insight-\$PROFILE:latest

docker rm -f \${CONTAINER_NAME}
docker rmi \${IMAGE_NAME}
docker pull \${IMAGE_NAME}
docker run -d \
--name \${CONTAINER_NAME} \
--privileged=true \
--dns 114.114.114.114 \
-e PROFILE=\${PROFILE} \
-w /home \
-p 8099:80 \
-v \$PWD/logs:/home/logs \
-v /home/uploads:/home/uploads \
--restart=always \
\${IMAGE_NAME}
docker logs -f \${CONTAINER_NAME}
EOF
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

执行脚本文件

sh run.sh test
1

# 4.Dockerfile

deploy.kwan.com 为私仓 harbor,这里我的 kwan 是不存在的。

1.直接执行

FROM deploy.kwan.com/dce/d2sf-skywalking-base:jdk8-alpine-8.5.0

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone

WORKDIR /home
USER root

ENV PROFILE="dev"
ENV LC_ALL en_US.UTF-8
ENV LANG en_US.UTF-8

COPY ./kwan-dsc-belle-insight-provider/target/*.jar /home/app.jar

EXPOSE 80

ENTRYPOINT ["java", "-Duser.timezone=Asia/Shanghai -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -Xloggc:logs/gc.log", "-jar", "/home/app.jar", "--server.port=80", "--spring.profiles.active=${PROFILE}"]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

2.转为脚本执行

FROM deploy.kwan.com/dce/d2sf-skywalking-base:jdk8-alpine-8.5.0

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone

WORKDIR /home
USER root

ENV PROFILE="dev"
ENV LC_ALL en_US.UTF-8
ENV LANG en_US.UTF-8
ENV JAVA_OPTS=""
ENV PARAMS=""

COPY ./kwan-dsc-belle-insight-provider/target/*.jar /home/app.jar

EXPOSE 80

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
RUN echo 'java $JAVA_OPTS -jar ./app.jar --spring.profiles.active=$PROFILE $PARAMS' > entrypoint.sh

ENTRYPOINT ["sh", "entrypoint.sh"]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# 5.安装 Docker Compose

安装 Docker Compose 在 Linux 上通常是一个简单的过程,你可以按照以下步骤进行:

  1. 下载 Docker Compose:首先,你需要从 Docker 官方 GitHub 仓库下载 Docker Compose 的二进制文件。你可以使用 curl 命令来下载。在终端中运行以下命令:

    sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    
    1

    这个命令会将 Docker Compose 下载到 /usr/local/bin 目录中,并且命名为 docker-compose

  2. 添加执行权限:下载完成后,你需要为 docker-compose 添加执行权限。运行以下命令:

    sudo chmod +x /usr/local/bin/docker-compose
    
    1
  3. 验证安装:安装完成后,你可以运行以下命令来验证 Docker Compose 是否成功安装:

    docker-compose --version
    
    1

    如果一切顺利,你应该能够看到安装的 Docker Compose 版本号。

现在,Docker Compose 已经安装完成并且可以在你的 Linux 系统中使用了。记得定期检查 Docker Compose 的更新,并根据需要更新到最新版本。

上次更新: 11/29/2024, 10:12:16 AM