# 制作两个容器的镜像
通过以下Dockerfile创建一个镜像
cd /chz/install/docker
vim Dockerfile
<<<< 内容如下:
FROM centos
RUN sed -i -e "s|mirrorlist=|#mirrorlist=|g" /etc/yum.repos.d/CentOS-*
RUN sed -i -e "s|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g" /etc/yum.repos.d/CentOS-*
RUN yum install -y epel-release
RUN yum install -y net-tools telnet wget vim nginx
RUN echo "alias ll='ls -al'" >> /etc/profile
RUN mkdir -p /install/java
RUN cd /install/java && wget https://download.java.net/java/GA/jdk22.0.1/c7ec1332f7bb44aeba2eb341ae18aca4/8/GPL/openjdk-22.0.1_linux-x64_bin.tar.gz
RUN cd /install/java && tar zxvf openjdk-22.0.1_linux-x64_bin.tar.gz
RUN echo 'export JAVA_HOME=/install/java/jdk-22.0.1' >> /etc/profile
RUN echo 'export PATH=$JAVA_HOME/bin:$PATH' >> /etc/profile
ENTRYPOINT ["nginx", "-g", "daemon off;"]
>>>>
创建镜像,注意这个镜像的【nginx】端口默认是【80】
docker build -t my-centos-nginx-80 .
上传镜像
docker tag my-centos-nginx-80 192.168.44.228:5000/my-centos-nginx-80
docker push 192.168.44.228:5000/my-centos-nginx-80
下面制作一个【nginx】端口为【8080】的镜像
先通过【192.168.44.228:5000/my-centos-nginx-80】镜像启动一个容器
docker run -p80:80 --rm --name=my-centos-nginx-80 192.168.44.228:5000/my-centos-nginx-80
注意上面的【–rm】参数很重要,没有这个参数可能会影响到后面pod的创建
连接上这个容器
docker exec -it my-centos-nginx-80 bash
修改容器里面的nginx的配置文件,将默认修改为【8080】
vim /etc/nginx/nginx.conf
<<<< 修改以下两行,将端口从【80】修改为【8080】
listen 8080 default_server;
listen [::]:8080 default_server;
>>>>
不要关闭【80】端口的那个【docker run】进程,新开一个窗口,执行以下命令将该容器提交成一个新的镜像:
docker commit my-centos-nginx-80 my-centos-nginx-8080
上传镜像
docker tag my-centos-nginx-8080 192.168.44.228:5000/my-centos-nginx-8080
docker push 192.168.44.228:5000/my-centos-nginx-8080
# 部署k8s的deployment
生成deployment的yaml文件
cd /chz/install/k8s/oneDeployTwoPod
vim deploy.yaml
<<<< 内容如下
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-centos-deploy
spec:
replicas: 1
selector:
matchLabels:
app: my-centos
template:
metadata:
labels:
app: my-centos
spec:
containers:
- name: my-centos-nginx-80
image: 192.168.44.228:5000/my-centos-nginx-80 # 80端口的镜像
ports:
- containerPort: 80
hostPort: 80
volumeMounts:
- name: my-centos-logs
mountPath: /chz_logs
- name: my-centos-nginx-8080
image: 192.168.44.228:5000/my-centos-nginx-8080 # 8080端口的镜像
ports:
- containerPort: 8080
hostPort: 8080
volumeMounts:
- name: my-centos-logs
mountPath: /chz_logs
volumes:
- name: my-centos-logs
emptyDir: {}
>>>>
部署deployment
kubectl apply -f deploy.yaml
查看这个pod的容器是否正常
执行【kubectl get pod】
执行【docker ps | grep -i my-centos-nginx】
有点奇怪,镜像显示都是【192.168.44.228:5000/my-centos-nginx-8080】,但后面的测试会显示两个容器是正常的,先不管它。
# 测试这两个容器
连接【my-centos-nginx-80】
docker exec -it cb398b2f85cf bash
执行
netstat -lnp
可以看到【8080】那个进程也在这里。可以用【curl http://localhost:80】和【curl http://localhost:8080】去测试他们,可以发现同一个pod下的多个容器网络是相通的。
进入目录【/】创建一个文件【80.log】
cd /
echo 1 >> 80.log
进入目录【/chz_logs】创建一个文件【80.log】
cd /chz_logs
echo 1 >> 80.log
下面进入【my-centos-nginx-8080】看能不能看到这两个文件:
cd /
ls -al
在【/】目录下没有【my-centos-nginx-80】容器里面创建的【/80.log】文件
cd /chz_logs
ls -al
在【/chz_logs】目录下可以看到【my-centos-nginx-80】容器里面创建的【/chz_logs/80.log】文件。
这是因为【/】目录是两个容器各自内部的目录,而【/chz_logs】目录两个容器都是通过【my-centos-logs】volume mount过来的(注意看yaml文件)
# 总结
当一个pod里面创建多个容器里面,多个容器的网络是相通的,但是存储是各自独立的。
但是通过将多个容器mount到同一个volume的方式可以让多个容器访问到同一个物理目录的文件。
我们可以利用这一点,让一个pod里面其中一个容器是主任务容器,产生日志文件到mount的目录里面。另一个容器是一个filebeat容器扫描主任务容器产生日志文件的目录(mount同一个volume),这样就可以采集pod里面的日志到elk里面了。