1.太长不看版

在容器的启动命令前执行

ip -4 route list match 0/0 | awk '{print $3 " host.docker.internal"}' >> /etc/hosts

在容器中访问host.docker.internal即可访问宿主机上的服务。

  1. 本机上运行了minio作为对象存储:
zhang@zhang:~$ docker run -p 9000:9000 -e "MINIO_ROOT_USER=zhangzhipeng" -e "MINIO_ROOT_PASSWORD=12345678" -v /home/zhang/data/minio:/data minio/minio server /data
Endpoint: http://172.17.0.3:9000  http://127.0.0.1:9000 
Browser Access:
   http://172.17.0.3:9000  http://127.0.0.1:9000
Object API (Amazon S3 compatible):
   Go:         https://docs.min.io/docs/golang-client-quickstart-guide
   Java:       https://docs.min.io/docs/java-client-quickstart-guide
   Python:     https://docs.min.io/docs/python-client-quickstart-guide
   JavaScript: https://docs.min.io/docs/javascript-client-quickstart-guide
   .NET:       https://docs.min.io/docs/dotnet-client-quickstart-guide
IAM initialization complete

此时在宿主机上通过localhost:9000即可访问minio服务。
在这里插入图片描述
2. 构建chartmuseum镜像,使用宿主机的minio服务作为存储。
Dockerfile:

FROM alpine:latest
# chartmuseum的二进制执行文件
COPY linux-amd64/chartmuseum /chartmuseum
# 容器启动脚本
COPY linux-amd64/chartmuseum.sh /chartmuseum.sh
RUN chmod +x /chartmuseum
RUN chmod +x /chartmuseum.sh
ENTRYPOINT ["sh"]
CMD ["/chartmuseum.sh"]

chartmuseum.sh:

#! /bin/sh
ip -4 route list match 0/0 | awk '{print $3 " host.docker.internal"}' >> /etc/hosts
cat /etc/hosts
/chartmuseum --debug --port=8080 \
  --storage=$STORAGE \
  --storage-amazon-bucket=$STORAGE_AMAZON_BUCKET \
  --storage-amazon-prefix=$STORAGE_AMAZON_PREFIX \
  --storage-amazon-region=$STORAGE_AMAZON_REGION \
  --storage-amazon-endpoint=$STORAGE_AMAZON_ENDPOINT

在启动脚本中,我们首先把宿主机的地址映射为host.docker.internal并注入到容器的/etc/hosts中,之后再启动服务。
docker-compose.yaml:

version: '2.0'
services:
    # build: ./
    image: idobry/chartmuseumui:latest
    environment:
      CHART_MUSESUM_URL: http://chartmuseum:8080
      # CHART_MUSESUM_URL: http://192.168.50.113:8080
    ports:
      - 3000:8080
  chartmuseum:
    # image: chartmuseum/chartmuseum:v0.7.1
    image: define_museum:0.1
    ports:
    - 8080:8080
    environment:
      PORT: 8080
      DEBUG: 1
      AWS_ACCESS_KEY_ID: "zhangzhipeng"
      AWS_SECRET_ACCESS_KEY: "12345678"
      STORAGE: "amazon"
      STORAGE_AMAZON_BUCKET: "charts"
      STORAGE_AMAZON_PREFIX: ""
      STORAGE_AMAZON_REGION: ""
      STORAGE_AMAZON_ENDPOINT: "http://host.docker.internal:9000"

在docker-compose中,把宿主机的minio地址写为http://host.docker.internal:9000传递给容器的STORAGE_AMAZON_ENDPOINT环境变量。
3. 查看启动日志

zhang@zhang:~/data/program/backend/chartmuseumUI$ docker-compose up
Recreating chartmuseumui_chartmuseum_1 ... done
Starting chartmuseumui_ui_1            ... done
Attaching to chartmuseumui_ui_1, chartmuseumui_chartmuseum_1
chartmuseum_1  | 127.0.0.1      localhost
chartmuseum_1  | ::1    localhost ip6-localhost ip6-loopback
chartmuseum_1  | fe00::0        ip6-localnet
chartmuseum_1  | ff00::0        ip6-mcastprefix
chartmuseum_1  | ff02::1        ip6-allnodes
chartmuseum_1  | ff02::2        ip6-allrouters
chartmuseum_1  | 172.19.0.3     98fdb4a47536
chartmuseum_1  | 172.19.0.1 host.docker.internal
chartmuseum_1  | 2021-04-15T05:25:57.293Z       DEBUG   index-cache.yaml loaded {"repo": ""}
chartmuseum_1  | 2021-04-15T05:25:57.293Z       INFO    Starting ChartMuseum    {"host": "0.0.0.0", "port": 8080}
chartmuseum_1  | 2021-04-15T05:25:57.293Z       DEBUG   Starting internal event listener
ui_1           | 2021/04/15 05:25:56.951 [I] [asm_amd64.s:1333]  http server Running on http://:8080

可以看到宿主机的地址在容器中是172.19.0.1,并并映射为host.docker.internal,并且容器中的chartmuseum服务可以通过该地址和宿主机上的minio服务正常通信。

1.太长不看版在容器的启动命令前执行ip -4 route list match 0/0 | awk '{print $3 " host.docker.internal"}' >> /etc/hosts在容器中访问host.docker.internal即可访问宿主机上的服务。2.示例本机上运行了minio作为对象存储:zhang@zhang:~$ docker run -p 9000:9000 -e "MINIO_ROOT_USER=zhangzhipeng" -e "MIN Docker Compose UI是Docker Compose的Web界面。 该项目的目的是在Docker Compose之上提供最小的HTTP API,同保持与Docker Compose CLI的完全互操作性。 该应用程序可以作为单个容器部署,没有依赖关系,也没有要安装的数据库。 撰写文件格式兼容性列表 撰写档案格式 Docker引擎 18.02.0+ 3.3-3.5 17.06.0+ 3.0 – 3.2 1.13.0+ 17.06.0+ 1.13.0+ 1.12.0+ 1.10.0+ 1.9.1+ 在终端中运行以下命令: docker run \ --name docker-compose-ui \ -p 5000:5000 \ -w /opt/docker-compose-projects/ \ -v /var/run/docker.sock:/var/run/docker.sock \ francescou/docker-compose-ui:1.13.0 您必须等待Doc
我们经常会在容器内访问宿主机的资源 比如 nginx容器反向代理其他容器或者宿主机的应用 如果nginx在容器内,方向代理宿主机的应用,直接使用127.0.0.1 或者localhost是有问题的,因为宿主机的网络和容器网络不通 在linux下使用docker0网络,把127.0.0.1改为docker0网络172.17.0.1 ifconfig 2.Docker v 20.10及更高版本 在Linux上可以在启动的候添加–add-host=host.docker.internal:ho
引出思考问题一: 在学习docker 服务的过程中想到一个问题,就是所有的docker 容器服务都部署在一台docker 宿主机上,若docker 容器服务足够多 这个docker 宿主机不会死掉么?? 引出思考问题二: docker 容器里面的服务能不能跨宿主机访问别一台宿主机docker 容器服务呢?? 问题一: 其实我自己也不知道 问题二: 请看实战操作二的内容 操作一: 安装docker 引擎,操作链接: 一.实验条件准备: 1. 准备两台l..
使用Docker部署应用Docker推荐的方式是将应用及其所依赖的服务(MySQL,Redis等)均使用Docker部署,并通过link或自定义网络相连接。但是,当应用所依赖的服务被安装在宿主机,我们需要让容器中的应用能够访问到部署在宿主机上的服务。本文将介绍实现这一目的的几种方案,并分析其优缺点。 首先我们需要了解一些关于Docker网络的基础知识。 Docker网络 Docker提供...
docker-compose是用于定义和运行多容器 Docker 应用程序的工具,通过docker-compose可以方便地协调多个容器的运行。 一般在使用docker-compose启动服务,被同一个docker-compose.yml定于的服务(容器)会运行在一个隔离环境中,也就是说在这个环境中的容器是不能直接访问(如果没有设置的话)当前docker-compose外部的其它容器的,那么如何设置才能使compose中的容器访问外部容器呢? 本文以能够使compose启动的容器可以访问docker
Podman撰写 带有后端的 docker-compose的实现。 该项目的主要目标是能够未经修改且无根地运行docker-compose.yml 。 该项目旨在为docker-compose提供docker-compose替换,并且在某些情况下非常有用,因为: 可以无根运行 仅取决于podman和Python3和 没有守护程序,没有设置。 开发人员可以使用它来使用单个熟悉的YAML文件运行单机容器化堆栈 对于类似生产的单机集装箱化环境,请考虑 对于真实的东西(多节点集群),请检查任何生产的OpenShift / Kubernetes发行版,例如 。 该项目仍在开发中。 从PyPI安装最新的稳定版本: pip3 install podman-compose 通过--user可以在没有root用户的情况下安装在普通用户家中。 或来自GitHub的最新开发版本: < dependency> < groupId>com.dkanejs.maven.plugins</ groupId> < artifactId>docker-compose-maven-plugin</ artifactId> < version>$VERSION</ version> </ dependency> Maven插件,用于通过Maven运行基本的docker-compose命令。 它可以用作Maven生命周期的一部分,也可以用作将do
docker的学习过程中,大家会接触各种各样的镜像,比如:ubuntu、centos、mysql、java、python等等,可以说种类是非常丰富。但是实际应用中,我们需要的全部都是多镜像组合使用的,比如:用nginx存储静态资源,用java提供服务,用mysql存储数据。这种情况在docker下就需要用容器编排来解决。 简单的docker-compose使用,可以分为两步: 1. 编写do...
docker-composeDocker 官方的一个用于定义和运行容器化应用的工具。它使用 YAML 文件来配置应用的服务、网络和卷等方面的设置。 当使用 docker-compose 部署 MySQL ,可能会遇到无法访问 MySQL 的问题。出现这种情况一般有以下几个可能的原因: 1. 网络配置问题:docker-compose 在默认情况下会创建一个默认的网络,并将所有定义的服务连接到该网络。如果服务的网络配置不正确,可能导致无法访问 MySQL。可以通过检查网络配置或创建自定义网络来解决此问题。 2. 端口映射问题:MySQL 默认使用 3306 端口进行通信,但是在容器内部的端口与宿主机上的端口之间可能存在映射问题。可以通过检查端口映射配置或使用容器的 IP 地址来解决此问题。 3. 认证问题:MySQL 服务通常需要进行身份验证才能访问。在 docker-compose 文件中,可以通过设置环境变量来指定 MySQL 的用户名和密码。如果未正确设置这些环境变量,可能导致无法访问 MySQL。可以检查环境变量配置或者在容器内部手动配置用户名和密码来解决此问题。 4. 容器启动顺序问题:如果在 docker-compose 文件中定义了多个服务,并且它们之间有依赖关系,那么容器启动的顺序可能会影响 MySQL 的访问。可以通过在容器之间添加依赖或者设置延迟启动来解决此问题。 总结起来,当 docker-compose 部署的 MySQL 无法访问,通常是由于网络配置、端口映射、认证配置或容器启动顺序等问题造成的。通过检查这些配置,并进行适当的调整或修复,通常可以解决无法访问 MySQL 的问题。