自己Docker部署的过程以及遇到的问题
- Docker配置
- 安装Docker
- 配置镜像加速(可忽略)
- Linux下部署
- 本地编写代码以及DockerFile文件
- 拉取所需要的镜像
- 将文件上传至服务器
- 编译执行
- 创建关联容器(mysql,redis等)
- 运行容器
- 常见错误
- 链接数据库失败
- 运行时报错
- 启动服务却访问超时
- 端口被占用
Docker配置
安装Docker
官方文档 安装
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io
启动
systemctl start docker
配置镜像加速(可忽略)
三个国内源:
阿里(收费)
网易(免费)
中国科学技术大学源(免费)
进入编辑模式
vi /etc/docker/daemon.json
粘贴以下代码并保存退出
{
"registry-mirrors":["http://hubmirror.c.163.com","https://docker.mirrors.ustc.educn"]
}
重新加载配置并重启Docker
sudo systemctl daemon-reload
systemctl restart docker
Linux下部署
本地编写代码以及DockerFile文件
Dockerfile
#拉取哪个镜像
FROM golang:alpine AS builder
# 为我们的镜像设置必要的环境变量
ENV GO111MODULE=on \
CGO_ENABLED=0 \
GOOS=linux \
GOPROXY=https://goproxy.cn,direct \
GOARCH=amd64
# 移动到工作目录:/build
WORKDIR /build
# 复制项目中的 go.mod 和 go.sum文件并下载依赖信息
COPY go.mod .
COPY go.sum .
RUN go mod download
# 将代码复制到容器中
COPY . .
# 将我们的代码编译成二进制可执行文件 bubble
RUN go build -o bulebell_app .
###################
# 接下来创建一个小镜像
###################
FROM scratch
COPY ./templates /templates
COPY ./static /static
COPY ./conf /conf
# 从builder镜像中把/dist/app 拷贝到当前目录
COPY --from=builder /build/bulebell_app /
# 需要运行的命令
ENTRYPOINT ["/bulebell_app", "conf/config.yaml"]
拉取所需要的镜像
准备可能用到的镜像,比如Mysql,Redis
docker pull mysql
docker pull redis
将文件上传至服务器
可通过编译器长传至服务器(goland)或者(xshell)等
编译执行
在项目目录下,执行下面的命令创建镜像,并指定镜像名称
docker build . -t bulebell_app
创建关联容器(mysql,redis等)
docker run --name mysql3306 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -v /Users/yao/docker/mysql:/var/lib/mysql -d mysql
docker run --name redis6379 -p 6379:6379 -v /Users/yao/docker/redis:/var/lib/redis -d redis
运行容器
docker run --link=mysql3306:mysql3306 --link=redis6379:redis6379 -p 8080:8080 bulebell_app
常见错误
链接数据库失败
检查是否可以用Navicat软件连接上数据库:
如果可以:那么检查项目中config配置以及Dockerfile文件中的(端口,用户,密码)是否和容器一致。
如果不可以:检查数据库容器是否在运行,启动容器即可
运行时报错
重启Docker
docker: Error response from daemon:......
启动服务却访问超时
检查安全组是否有这个端口
防火墙没有允许这个端口的访问
# 防火墙设置
systemctl status firewalld 查看firewalld状态 (防火墙)
systemctl start firewalld 开启防火墙
systemctl stop firewalld 关闭防火墙
# 端口设置
sudo firewall-cmd --list-all 查看防火墙中允许访问的端口
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent 使其开启8080端口
sudo firewall-cmd --reload 重启防火墙
端口被占用
netstat -tln 查找所有端口信息
netstat -tln | grep 8080 仅查找8080端口的占用信息
lsof -i :8080 查看端口属于哪个程序?端口被哪个进程占用
kill -9 进程id 杀掉占用端口的进程
.