[每周一更]-(第41期):深入探索docker的部署方式docker-compose

在这里插入图片描述

  • dockerfile: 构建镜像;
  • docker run: 启动容器;
  • docker-compose: 启动服务;

介绍下我们今天的主角:docker-compose

采用docker-compose方式,运行一系列镜像

docker-compose是编排容器
参考:Linux 中 安装 docker-compose

以部署Go的示例展示

  • 参考:https://juejin.cn/post/7128165664610598943
  • 参考:https://juejin.cn/post/7200679596122783805

1、先创建一个文件夹,里边创建Dockerfile,录入内容:

FROM golang:1.18-alpine
WORKDIR /app
COPY go.mod ./
RUN go mod download
COPY . .
RUN go build -o main .
EXPOSE 8083
CMD ["./main"]

2、当前目录创建:docker-compose.yml,录入内容

version: '3.9'

services:
  web:
     build: .
     ports:
         - "8083:8083"

3、当年目录,创建main.go,录入内容

package main

import (
    "fmt"
    "net/http"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hello, World!")
    })

    http.ListenAndServe(":8083", nil)
}

4、运行示例

启动并后台执行:docker-compose -d up --build

关停:docker-compose down

问题描述: docker镜像启动成果之后,通过curl不能访问:

curl -XGET http://127.0.0.1:8083
curl: (56) Recv failure: Connection reset by peer

1、进入容器内访问
docker exec -it 665e832c40a3 sh
2、请求-正常返回
wget -q -O -  http://127.0.0.1:8083 或者 curl http://127.0.0.1:8083
3、出容器看端口映射
docker port  665e832c40a3
4、换条路,经过docker-compose up -d 不能访问 go示例,改为打包成镜像,直接run
5、打包镜像
docker build . -t main:0.0.1
6、运行容器
docker run -d -p 8083:8083 main:0.0.1
7、访问目标路径
http://120.76.245.243:8083/ ,成功了!
8、说明是docker-compose.yml的配置问题;排查问题
- docker network ls 查看network模式及名称
- docker network inspect bridge(默认),查看默认的docker桥接网络模式下的容器,我为了测试通过docker run开启了8083端口,docker-compose 开启了8081端口;
发现 docker桥接模式下只有8083端口,8081的额外创建了新的网络模式:gotest_default,8081的容器在这个网桥下边;
- 检查容器的ip和网桥下容器的ip是否一致;docker inspect <container_name_or_id> - docker network inspect 网络模式名
- vim /etc/sysctl.conf;net.ipv4.ip_forward=1 ,ip转发开启
- docker port <container_name_or_id>,查端口映射
9、解决方案
- (1)检查容器的网络配置:docker inspect <container_name_or_id> | grep -i network
    - 如果 NetworkMode 属性的值不是 bridge,则说明容器使用了非默认的网络。
    - 如果需要将容器迁移到默认的 bridge 网络,可以使用 docker network connect 命令将容器连接到默认网络。 - 经测试外网可以访问
        docker network connect bridge <container_name_or_id>
- (2)在docker-compose.yml配置:network_mode: "host",将使用主机的网络模式,这意味着它将共享主机的IP地址
    > 注意:使用host模式可能会带来安全风险,因为容器服务完全暴露在主机上,因此建议仅在必要时使用。
- (3)在docker-compose.yml配置:network_mode: "bridge",直接配置默认网桥(等同于 docker network connect 的作用)

采用docker run 方式,运行一个镜像

官方参考地址:https://docs.docker.com/engine/reference/commandline/run/

docker镜像采用dockerfile定义环境流程,然后执行镜像名称作为容器运行(dockerfile的作用是从无到有的构建镜像。)

类比公司项目:showdoc
安装文档:https://www.showdoc.com.cn/help/65610

showdoc 内部的dockerfile文件
FROM  webdevops/php-nginx:7.4-alpine

COPY ./ /var/www/html/
RUN mkdir -p /showdoc_data/html
RUN cp -R /var/www/html/ /showdoc_data/
RUN rm -rf /app && ln -s /var/www/html /app
RUN echo "<?php echo file_get_contents('index.html'); ?>" > /var/www/html/web/index.php

RUN echo "upload_max_filesize=5000M;" >> /opt/docker/etc/php/php.ini
RUN echo "post_max_size=5000M;" >> /opt/docker/etc/php/php.ini
RUN echo "client_max_body_size 5000m;" > /opt/docker/etc/nginx/vhost.common.d/10-general.conf

RUN apk update
RUN apk add --update nodejs npm
RUN mv /showdoc_data/html/mock/ /showdoc_data/mock
RUN (cd /showdoc_data/mock/ && npm install )

# 写环境变量
ENV SHOWDOC_DOCKER_VERSION 2.4

CMD if [ ! -f "/var/www/html/index.php" ]; then \cp -fr /showdoc_data/html/ /var/www/ ;fi \
;chmod 777 -R /var/www/ \
;(sleep 3 && cd /showdoc_data/html/server && php index.php /api/update/dockerUpdateCode && chmod 777 -R /var/www/ ) \
;(sleep 30 && cd /showdoc_data/mock/ && npm run start) \
& supervisord
showdoc 的run流程
# 原版官方镜像安装命令(中国大陆用户不建议直接使用原版镜像,可以用后面的加速镜像)
docker pull star7th/showdoc

# 中国大陆镜像安装命令(安装后记得执行docker tag命令以进行重命名)
docker pull registry.cn-shenzhen.aliyuncs.com/star7th/showdoc
docker tag registry.cn-shenzhen.aliyuncs.com/star7th/showdoc:latest star7th/showdoc:latest

##后续命令无论使用官方镜像还是加速镜像都需要执行

#新建存放showdoc数据的目录
mkdir -p /showdoc_data/html
chmod  -R 777 /showdoc_data
# 如果你是想把数据挂载到其他目录,比如说/data1,那么,可以在/data1目录下新建一个showdoc_data/目录,
# 然后在根目录的新建一个软链接/showdoc_data到/data1/showdoc_data
# 这样既能保持跟官方教程推荐的路径一致,又能达到自定义存储的目的.

#启动showdoc容器
docker run -d --name showdoc --user=root --privileged=true -p 4999:80 \
-v /showdoc_data/html:/var/www/html/ star7th/showdoc

猜你喜欢

转载自blog.csdn.net/hmx224_2014/article/details/135237175