目录
extra_hosts: - "nacos-headless:192.168.136.121" 这个什么?怎么用呀
privileged: true # 获取更高的权限 这个有什么用?
ports: - "38941:38941" - "30384:30384" 为什么会有两个端口?
docker volume:管理Docker卷 举例说明一下
学习一把 docker,先来一波注释:
version: '3.7' # 版本号,指定使用的 Docker Compose 文件格式的版本
networks: # 定义网络
kjds: # 网络名字
external: true # 标记这个网络是外部网络
services: # 定义服务
kjds-maintenance-web: # 服务名字
image: registry.cn-shenzhen.aliyuncs.com/xxx-test/kjds.xxx.web:1.0.0-release # 使用的镜像
container_name: kjds-xxx-web # 容器名字
restart: always # 容器退出时自动重启
privileged: true # 是否使用特权模式
ports: # 暴露端口
- "80:80" # 将容器的80端口映射到主机的80端口
volumes: # 挂载卷
- ./web-init/url_map.env:/etc/url/API_URL:ro # 映射文件
# URL 替换, :ro 表示只读,容器内部无法修改
- ./web-init/init.sh:/docker-entrypoint.d/init.sh # 容器启动时运行的脚本
networks: # 连接的网络
- kjds # 连接 kjds 网络
deploy: # 部署配置
replicas: 1 # 副本数
resources: # 资源限制
limits: # 设置容器的资源限制
cpus: "0.3" # 最多使用 30% 的 CPU
memory: 1024M # 最多使用 2G 的内存空间
reservations: # 设置为容器预留的系统资源(随时可用)
cpus: "0.1" # 保留 20% 的 CPU
memory: 1024M # 保留 2G 的内存空间
update_config: # 更新配置
parallelism: 1 # 更新的容器数量
delay: 10s # 更新之间的时间间隔
restart_policy: # 容器重启策略
condition: on-failure # 容器退出状态码不为0时自动重启
再来一波注释:
version: '3.7'
# 定义网络
networks:
kjds:
external: true
# 定义服务
services:
# 接口服务
base.svc.interface:
image: registry.cn-shenzhen.aliyuncs.com/xxxx-test/kjds.svc.xxxx:1.4.4-SNAPSHOT
container_name: kjds-svc-xxxx
restart: always
privileged: true
# 定义端口映射
ports:
- "38941:38941"
- "30384:30384"
# 指定使用的网络
networks:
- kjds
# 定义挂载卷
volumes:
- ./config/xxxx/:/opt/kjds/xxxx/bank/ccb/:ro # URL 替换
- ./config/xxxx/:/opt/kjds/xxxx/guarantee/:ro # URL 替换
# 定义额外的 hosts
extra_hosts:
- "nacos-headless:192.168.136.121"
# 定义部署配置
deploy:
replicas: 1
# 定义资源限制
resources:
# 设置容器的资源限制
limits:
cpus: "0.5" # 设置该容器最多只能使用 30% 的 CPU
memory: 3072M # 设置该容器最多只能使用 2G 的内存空间
# 设置为容器预留的系统资源(随时可用)
reservations:
cpus: "0.4" # 为该容器保留 20% 的 CPU
memory: 2048M # 为该容器保留 2G 的内存空间
# 定义更新配置
update_config:
parallelism: 1
delay: 10s
# 定义重启策略
restart_policy:
condition: on-failure # 当容器出现错误时重启容器
这是加载本地的jar包
version: '3'
services:
mocktest:
environment:
- TZ=Asia/Shanghai
container_name: mocktest
image: openjdk:8
ports:
- 8885:8885
volumes:
- /usr/localjar/jarfile/ccb-test-0.0.1-SNAPSHOT.jar:/app/ccb-test-0.0.1-SNAPSHOT.jar
command: java -jar /app/ccb-test-0.0.1-SNAPSHOT.jar
restart: always # 设置容器始终在停止时和启动时重启
deploy:
replicas: 1 # 设置服务的副本数量为 1,表示只部署一个实例
resources: # 资源限制配置
limits: # 设置容器的资源限制
cpus: "0.3" # 设置该容器最多只能使用 30% 的 CPU
memory: 2048M # 设置该容器最多只能使用 2G 的内存空间
reservations: # 设置为容器预留的系统资源(随时可用)
cpus: "0.2" # 为该容器保留 20% 的 CPUpw
memory: 2048M # 为该容器保留 2G 的内存空间
update_config:
parallelism: 1 # 设置同时进行更新的容器实例数量为 1
delay: 10s # 设置容器更新之间的延迟为 10 秒
external: true
是什么意思?
external: true
表示这个网络是由外部创建的,不由该 docker-compose
文件创建。这意味着在运行该 docker-compose
文件之前,该网络必须存在。一般情况下,这个外部网络是由其他 docker-compose
文件或手动创建的,该 docker-compose
文件需要连接到这个外部网络。这样可以在多个 docker-compose
项目之间共享网络,以便容器之间进行通信和服务发现。
外部怎么创建这个网络呢?
可以使用 docker network create
命令来创建一个外部网络。
举个例子,假设我们要创建一个名为 my-external-network
的外部网络,可以在终端输入以下命令:
docker network create --driver bridge my-external-network
这里使用了 bridge
驱动,也可以使用其他驱动,具体可以参考 Docker 官方文档。
创建好外部网络后,在编排文件中可以将 external
标记设置为 true
,然后指定该外部网络的名称,这样 Docker 就可以在运行时将服务连接到该外部网络中。
程序运行时候 jar包 在容器中的那个目录下?
在容器中,jar包通常会被放置在 /app
目录下,也有可能会放在 /opt
或其他自定义的目录中,具体取决于容器的配置。通常,Dockerfile 中会指定将 jar 包复制到容器内的哪个目录中。如果您使用的是第三方镜像,可以查看该镜像的文档或源代码来确定 jar 包的位置
上面的配置并没有指定程序在容器中的哪个目录下运行。容器启动时会运行默认命令,如果未指定默认命令,容器会直接退出。因此,需要通过指定command
或entrypoint
来定义程序在容器中的启动命令和工作目录。
extra_hosts: - "nacos-headless:192.168.136.121" 这个什么?怎么用呀
extra_hosts
是用于指定额外的主机名和IP地址的选项。在这个配置中,nacos-headless
是一个主机名,192.168.136.121
是与该主机名关联的IP地址。
在Docker中,容器之间通常使用网络进行通信,每个容器都有一个唯一的名称和IP地址。但是,在某些情况下,我们可能需要在容器内部引用其他主机上的服务,而这些服务在Docker网络中没有自己的DNS条目。在这种情况下,可以使用extra_hosts
选项将主机名和IP地址映射起来,以便容器内的应用程序可以使用主机名来访问服务。
privileged: true # 获取更高的权限 这个有什么用?
privileged: true
是 Docker Compose 中的一个配置选项,用于授予容器更高的特权级别,以访问主机系统的硬件资源或其他敏感资源。
当 Docker 容器运行需要与主机进行交互时,可能需要获取更高的特权级别。例如,当容器需要访问主机系统的网络或文件系统时,可以使用 privileged
来授予容器访问这些资源的权限。
需要注意的是,使用 privileged
可能会增加系统的风险,因为容器可以获得更高的权限,并有可能影响主机系统的安全性。因此,建议在使用 privileged
选项之前,先仔细考虑容器需要访问的资源,并确保授予权限的合理性。
ports: - "38941:38941" - "30384:30384" 为什么会有两个端口?
这个服务容器开放了两个端口,一个是 38941 端口,另一个是 30384 端口。其中,38941 端口可能用于服务的外部访问,而 30384 端口可能是服务容器内部使用的端口,比如用于与其他容器通信等。具体情况需要根据服务本身的实现来确定。
docker 常用 命令
- docker run:运行一个容器
- docker ps:列出正在运行的容器
- docker exec:在正在运行的容器内执行命令
- docker stop:停止容器运行
- docker start:重新启动容器
- docker rm:删除容器
- docker images:列出本地的所有镜像
- docker rmi:删除一个或多个本地镜像
- docker build:构建镜像
- docker tag:给镜像打标签
- docker push:推送镜像到Docker Hub或者私有仓库
- docker pull:从Docker Hub或私有仓库拉取镜像
- docker network:管理Docker网络
- docker volume:管理Docker卷
- docker-compose:使用docker-compose.yml文件来管理多个Docker容器
docker network 给举例说明一下
Docker network 是 Docker 中管理容器网络的工具,可以通过创建网络来连接容器,提供容器之间通信的能力。
比如,我们可以创建一个名为 my-network 的网络,并将两个容器 foo 和 bar 加入到该网络中:
- 创建网络 my-network:
docker network create my-network
- 创建容器 foo,并将其加入 my-network 网络:
docker run -d --name foo --network=my-network nginx
- 创建容器 bar,并将其加入 my-network 网络:
docker run -d --name bar --network=my-network nginx
此时,容器 foo 和 bar 就可以通过 my-network 网络相互通信了。例如,在容器 foo 中可以使用容器名 bar 来访问容器 bar 的服务,例如:
curl http://bar/
在同一个网络中的容器可以直接使用容器名进行互相访问,而不需要使用容器的IP地址或端口等信息。这在多个容器共同工作时非常方便。
docker volume:管理Docker卷 举例说明一下
Docker volume是Docker用于管理容器数据卷的一种机制。使用Docker volume,我们可以将宿主机的目录或者另一个容器的数据卷挂载到当前容器中,从而将数据持久化到宿主机或者其他容器中,便于容器的数据共享和管理。
举个例子,我们要创建一个基于Nginx的Web服务器,需要将Web应用程序挂载到容器中运行。这时,我们可以使用Docker volume进行管理。
首先,我们可以创建一个本地数据卷:
docker volume create mywebapp
接着,我们可以使用docker run命令启动一个容器,并将Web应用程序通过挂载mywebapp卷到容器中:
docker run -d --name mynginx -v mywebapp:/usr/share/nginx/html nginx
这样,当我们修改Web应用程序时,容器的数据卷也会同步更新,可以实现数据的持久化和共享。同时,我们也可以通过其他的容器来管理这个数据卷,比如备份、还原等操作。
总之,Docker volume可以轻松实现容器数据的持久化和共享,方便我们管理容器中的数据。
replicas: 1 这是什么?
replicas: 1 是指在 Kubernetes 中某个应用程序的副本数为1。这意味着 Kubernetes 会启动该应用程序的一个实例,如果实例出现故障或需要扩展应用程序,则 Kubernetes 将自动启动另一个副本,以确保应用程序的可用性和可靠性。replicas 的值可以根据实际需要进行扩展或缩减。例如,如果需要更高的可用性,可以将 replica 数增加到 3,这样如果一个副本出现故障,Kubernetes 将维护其余 2 个副本继续提供服务。