前言
不知道大家有沒有遇到這種場景,部署在docker環境的專案,需要透過域名訪問外部一些資源,但因為沒有配置dns解析,因此需要透過配置hosts來進行訪問。本文就來聊聊可以透過哪些方式可以在docker容器中配置hosts
配置的方法
方法一:啟動容器的時候加上“--add-host”
示例:
docker run --add-host='www.lyb-geek.com:127.0.0.1' --add-host='www.lyb-geek.cn:192.168.3.1' --name hello-docker -it 192.168.0.1:5002/lybgeek/hello-docker:1.0
方法二:如果是透過docker-compose啟動容器,可以配置extra_hosts屬性
示例
version: '3.7'
services:
hello-docker:
restart: always
image: 192.168.0.1:5002/lybgeek/hello-docker:1.0
extra_hosts:
- "www.lyb-geek.com:127.0.0.1"
- "www.lyb-geek.cn:192.168.3.1"
container_name: hello-docker
network_mode: bridge
ports:
- "80:80"
environment:
- ENV=dev
3、方法三:如果是透過k8s來管理容器,則在可以在建立pod的yaml檔案透過hostAliases新增域名IP對映
示例:
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: dev
name: hello-docker-deployment
labels:
app: hello-docker
spec:
replicas: 3
selector:
matchLabels:
app: hello-docker
template:
metadata:
labels:
app: hello-docker
spec:
hostAliases:
- hostnames:
- www.lyb-geek.com
ip: 127.0.0.1
- hostnames:
- www.lyb-geek.cn
ip: 192.168.3.1
imagePullSecrets:
- name: default-secret
containers:
- name: hello-docker
image: 192.168.0.1:5002/lybgeek/hello-docker:1.0
imagePullPolicy: Always
ports:
- containerPort: 80
env:
- name: ENV
value: "dev"
核心配置
spec:
hostAliases:
- hostnames:
- www.lyb-geek.com
ip: 127.0.0.1
- hostnames:
- www.lyb-geek.cn
ip: 192.168.3.1
配置內容的解釋如下圖
總結
不知道大家有沒有好奇為什麼沒介紹透過dockerfile的方式,因為dockerfile的方式,我試過在dockerfile檔案中配置
RUN echo 'www.lyb-geek.com:127.0.0.1' >> /etc/hosts
不過沒生效。也試過將hosts的檔案放在專案目錄下
透過配置如下內容
COPY hosts /etc/hosts
RUN echo 'www.lyb-geek.com:127.0.0.1' >> /etc/hosts
不過沒鳥用。可能配法不對,也有可能是因為被k8s影響到了。不過如果容器是透過k8s來管理,推薦直接透過
配置hostAliases這種方式。其實還有一種方式,就是進入容器內部,直接改hosts檔案,就跟我們操作宿主機一樣。不過這種方式不推薦就是,因為容器一重啟或者銷燬,配置就丟了