CentOS 7 Docker安装部署Go Web
Docker 是一种容器技术,它部署简单,能很好的进行服务隔离,生成镜像,Push到镜像仓库,其他机器一键拉取部署。
Docker分为社区版CE和企业版EE,社区版是免费提供给个人和小型团队使用,企业版会提供额外的收费服务。
CentOS 7使用Yum安装Docker,部署Go Web网站。本Go Web网站是我的个人愽客([http://snaill.net/](http://snaill.net/)),使用Gin+Gorm+Mysql+Nginx开发,本次只将Web愽客程序部署在Docker中,Mysql、Nginx暂时还部署在宿主机上。
**一、安装Docker**
1、Docker要求CentOS系统内核版本高于3.10,通过 uname –r 命令查看内核版本
![Image](/sitedata/image/dokcker_8_1.png)
2、使用 sudo yum update 命令更新yum包到最新
```
sudo yum update
```
3、如果安装过旧版本的话,卸载旧版本
```
sudo yum remove docker docker-common docker-selinux docker-engine
```
4、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
```
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
```
5、设置yum源信息
```
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
```
国内可使用阿里云,docker官方速度慢
```
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
```
6、可查看所有docker版本,并选择特定版本安装
```
yum list docker-ce --showduplicates | sort -r
```
![Image](/sitedata/image/dokcker_8_2.png)
7、安装Docker
```
sudo yum install docker-ce
```
如果想安装其他版本,在后面加上版本号,如:sudo yum install docker-ce-3:19.03.8
8、启动Docker
```
systemctl start docker
```
启动 start,停止 stop,重启 restart
设置开机启动
```
systemctl enable docker
```
查看Docker版本 docker version
![Image](/sitedata/image/dokcker_8_3.png)
到止Docker安装完成
**二、部署Go Web**
1、交叉编译Web项目
由于开发环境是windows,所以进行交叉编译linux版Web项目,vs code终端PowerShell命令
```
$env:GOOS="linux" -- 设置运行系统
go build -- 编译
```
2、由于Mysql装在宿主机上,Web需要访问,修改DB连接IP为172.17.0.1
![Image](/sitedata/image/dokcker_8_4.png)
由于mysql默认只能本机登录,通过以下命令,设置允许远程登录
```
mysql>GRANT ALL PRIVILEGES ON *.* TO 'your username'@'172.17.0.2' IDENTIFIED BY 'your password' WITH GRANT OPTION;
```
your username 和 your password 改成 mysql 数据库的用户名和密码
安装Docker后,172.17.0.2为Docker的默认IP
进入Docker:docker exec -it CONTAINER_ID sh
查看ip:ifconfig
![Image](/sitedata/image/dokcker_8_5.png)
宿主机的默认IP为172.17.0.1
![Image](/sitedata/image/dokcker_8_6.png)
3、编写Dockerfile文件,在项目根目录下新建名为Dockerfile的文件,内容如下,推荐第二种方式
3.1、项目文件全部打包到镜像里
```
FROM alpine
WORKDIR /wblog
COPY wblog /wblog/
COPY conf/ /wblog/conf/
COPY sitedata/ /wblog/sitedata/
COPY static/ /wblog/static/
COPY views/ /wblog/views/
RUN apk add -U tzdata
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo 'Asia/Shanghai' >/etc/timezone
EXPOSE 8090
ENTRYPOINT ["./wblog"]
```
3.2、配置等静态文件不打包到镜像里,运行时再映射到宿主机目录,修改配置而无需重新打包
```
FROM alpine
WORKDIR /wblog
COPY wblog /wblog/
RUN apk add -U tzdata
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo 'Asia/Shanghai' >/etc/timezone
EXPOSE 8090
ENTRYPOINT ["./wblog"]
```
4、上传编译好的Web项目文件到 CentOS 机器上
![Image](/sitedata/image/dokcker_8_7.png)
5、根据 Dockerfile 打包 Docker 镜像
在 CentOS 上进入到项目根目录下,执行 docker build 打包镜像,命令最后的 . 指以当前目录下的 Dockerfile 文件打包镜像
```
docker build -t wblog:v1.0 .
```
6、打包完成后,输入 docker images 查看镜像
![Image](/sitedata/image/dokcker_8_8.png)
7、Docker 启动镜像,运行项目,两种方式对应3中的两种方式,推荐第二种方式
7.1、项目文件全在镜像中,运行 Docker 镜像
```
docker run -d -p 8090:8090 --name wblog wblog:v1.0
```
7.2、配置等静态文件映射到宿主机本地,运行 Docker 镜像,-v docker目录:宿主机目录
```
docker run -v /data/www/wblog_docker/conf:/wblog/conf -v /data/www/wblog_docker/sitedata:/wblog/sitedata -v /data/www/wblog_docker/static:/wblog/static -v /data/www/wblog_docker/views:/wblog/views -v /data/www/wblog_docker/log:/wblog/log -d -p 8090:8090 --name wblog wblog:v1.0
```
8、查看Docker运行情况 docker ps
![Image](/sitedata/image/dokcker_8_9.png)
STATUS 为Up xxx 状态运行,PORTS 为 0.0.0.0:8090->8090/tcp 宿主机端口映射Docke端口成功,镜像容器运行成功。
个人博客就是部署在Docker中的,用Nginx代理,将snaill.net转发到8090端口
![Image](/sitedata/image/dokcker_8_10.png)
**docker 常用命令**
打包镜像:docker build -t wblog:v1.0 .
运行Docker镜像:docker run -d -p 8090:8090 --name wblog wblog:v1.0
静态文件映射到宿主机本地,运行Docker镜像:
docker run -v /data/www/wblog_docker/conf:/wblog/conf -v /data/www/wblog_docker/sitedata:/wblog/sitedata -v /data/www/wblog_docker/static:/wblog/static -v /data/www/wblog_docker/views:/wblog/views -v /data/www/wblog_docker/log:/wblog/log -d -p 8090:8090 --name wblog wblog:v1.0
查看运行镜像容器:docker ps -a
启动/停止/重启镜像容器:docker start/stop/restart
删掉镜像容器:docker rm ,删除前需先停止镜像容器
删掉镜像:docker rmi ,删除前需先删除镜像容器
查看镜像容器元信息:docker inspect
进入镜像容器:docker exec -it CONTAINER_ID sh
**go编译**
windows编译成linux版,vs code终端PowerShell命令
go env -- 查看环境变量
$env:GOOS="linux"
go build
$env:GOOS="windows"
**启动**
nohup ./wblog &
本人愽客([https://www.snaill.net](https://www.snaill.net))由wblog([https://github.com/wangsongyan/wblog](https://github.com/wangsongyan/wblog)) 修改而来,在此表示感谢!