使用Docker部署Vue、Go项目,Ubuntu18.04
不经意看到Docker这个大鲸鱼:

突然好奇它怎么用的,这些技术像动物世界一样。
我在这篇文章记录了自己在Windows、Ubuntu18.04下的Docker安装和使用的过程,顺带记录了Vue项目的Docker部署、Go语言web项目的Docker部署、Nginx反向代理配置,还有Mysql、Redis等部署操作。
安装Docker
Windows
- 专业版、企业版
Docker安装需要windows专业版pro或者 企业版并且需要某个版本以上,具体哪个版本看官网说明, 这个一键安装的方式,我就不说了,因为上个月硬盘挂掉,系统到现在还是盗版的win10,版本还是比较旧的。
- 家庭版
windows家庭版home 不能直接安装,需要安装Docker ToolBox,照着官方文档下载安装即可,文档单词量不大,很容易懂的,而且只需要下载,然后点下一步就完了。
其中确认系统是否启用虚拟化,是在任务管理器的性能栏里看:

工具箱好像是使用Oracle VM VirtualBox虚拟机软件来跑Docker的,高版本windows的Docker是用Hypervisor。
把Docker ToolBox装好后,运行Docker Quickstart Terminal就行了(需要管理员运行),等它把需要的东西装完,它的快捷方式应该在桌面上,当出现以下画面时,表示已经准备完成,可以使用了:

使用的是Linux的命令,会看到它的ip。
- windows下linux命令行推荐:
putty
wscp
win10 wsl
一个可以在线使用Docker的网站,也可以不用装Docker
http://play-with-docker.com/
Nginx-alpine
一个最小Nginx运行镜像
- 配置端口映射并运行
docker run -p 2019:80 nginx:alpine
- 直接运行
docker run nginx:alpine
- 查看运行结果
http://docker Ip:2019
#安装方式的不同,有的也可以在本地http://localhost:2019
- bash可交互方式运行
docker run -it nginx:alpine sh
#linux命令
ls -als
pwd
exit
nginx主页root所在目录
/usr/share/nginx/html
镜像构建与上传
构建Vue项目的Docker镜像
- cd到Vue项目的文件夹
npm run build
会生成一个dist文件夹
把dist文件夹放入docker文件夹(自定,存放Dockerfile的文件夹)
- 打开命令行时,默认是在你安装时选择的Docker ToolBox的安装目录,比如我装在d盘
pwd
#/d/Docker Toolbox
-
在这个目录建一个
Docker文件夹,然后把dist文件夹拷贝到里面 -
在
Docker文件夹下新建一个名为DockerFile的文件,内容如下:
FROM nginx:alpine
COPY ./nginx.conf /etc/nginx/conf.d/default.conf
COPY ./dist /usr/share/nginx/html
- 再新建
nginx.conf的文件,内容为:
server {
listen 80;
set $wwww_data /usr/share/nginx/html;
location / {
root $wwww_data;
index index.html;
}
}
- 构建Docker镜像,镜像名只能小写,
docker build会执行Dockerfile文件,-t会给镜像起个名字
#先cd到刚刚建的Docker文件夹
docker build -t shvideo-vue:v0.0.1 ./
- 运行镜像
#映射端口,然后运行
docker run -p 2020:80 shvideo:v0.0.1
#直接运行
docker run shvideo:v0.0.1
运行结果
http://docker Ip:2020
#安装方式的不同,有的也可以在本地http://localhost:2020
实用命令
查看运行的容器
docker ps
docker ps -a
停止容器
docker stop 容器ID或容器名
参数 -t:关闭容器的限时,如果超时未能关闭则用kill强制关闭,默认值10s,这个时间用于容器的自己保存状态
docker stop -t=60 容器ID或容器名
docker kill 容器ID或容器名 :直接关闭容器
上传Vue项目的Docker镜像
- 把镜像上传到云空间,以便公网访问
我这里用的阿里云的容器镜像服务,去阿里云找一下就有了,注册就能用。
地域:香港
命名空间 shirtinycn
仓库名称 shvideo-vue
代码源:本地仓库
在访问凭证栏设置固定密码
- Docker Hub/阿里容器登录
docker login --username=shirtiny registry.cn-hongkong.aliyuncs.com
然后输你的密码
- 重新构建镜像,这次是会存到云空间的
#还是要cd到刚刚那个docker文件夹 看看这个./
docker build -t registry.cn-hongkong.aliyuncs.com/shirtinycn/shvideo-vue:v1.0.0 ./
- 推到云空间
docker push registry.cn-hongkong.aliyuncs.com/shirtinycn/shvideo-vue:v1.0.0
GO项目的Docker镜像
- cd 到go项目中,新建Dockerfile、Nginx.conf
编辑Dockerfile为:
From golang:1.12 as build
#把当前所有目录都放入指定文件夹,包括项目shVideoGo
ADD ./ /usr/local/GoProject/shVideoGo
#工作目录,指定所有的run都在此目录执行
WORKDIR /usr/local/GoProject/shVideoGo
#环境变量,这里最好写内网ip
ENV REDIS_ADDR="1.2.3.4:6379"
#ENV REDIS_PW=""
ENV REDIS_DB="0"
ENV MysqlDSN="root:123456@tcp(1.2.3.42)/mydb?charset=utf8&parseTime=True&loc=Local"
ENV GIN_MODE="release"
ENV PORT=3000
#Go的代理
ENV GOPROXY="https://goproxy.io"
#编译成可以在linux运行的版本(Golang交叉编译) - o 会指定build后的名字
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o shvideogo
#第二段构建
FROM alpine:3.7
#阿里的镜像
RUN echo "http://mirrors.aliyun.com/alpine/v3.7/main/" > /etc/apk/repositories && \
apk update && \
apk add ca-certificates && \
echo "hosts: files dns" > /etc/nsswitch.conf && \
mkdir -p /www/conf
WORKDIR /www
#从第一段构建中拷贝编译好的可执行文件
COPY --from=build /usr/local/GoProject/shVideoGo/shvideogo /usr/bin/shvideogo
ADD ./conf /www/conf
#给它可执行权限,/usr/bin是linux默认放环境变量的地方
RUN chmod +x /usr/bin/shvideogo
#运行
ENTRYPOINT ["shvideogo"]
- docker容器的所在位置
docker info | greo Docker
#更新一下包依赖
go mod tidy
构建镜像
docker build --no-cache -t registry.cn-hongkong.aliyuncs.com/shirtinycn/shvideo-go:v6.0.0 ./
- 把镜像推到云空间
推到云空间,会自动创建名为shvideo-go的仓库
docker push registry.cn-hongkong.aliyuncs.com/shirtinycn/shvideo-go:v6.0.0
- 其他方式
实在不行,自己编译一个linux的go程序,放到服务器上,emm能用,233。
本地编译,可以看:GO交叉编译
docker windows用起来很不方便,可以选择用远程工具连接(因为是虚拟机上的)
ip启动时会有,默认用户名是docker,密码是tcuser
Ubuntu服务器上Docker的安装
使用ubuntu 18.04 据说和Docker有莫名的亲密度
- 日常第一步:
#获取更新
sudo apt-get update
- 安装Docker,谷歌搜
ubuntu 18.04 install Docker有个DigitalOcean网站的步骤比较好,能保证Docker版本
sudo sudo apt install apt-transport-https ca-certificates curl software-properties-common
#认证Docker证书
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
sudo apt update
apt-cache policy docker-ce
如果遇到 Connection reset by peer 错误,表明 curl 命令在尝试从 download.docker.com 下载文件时,网络连接被中断。这通常是由于网络不稳定或您所在区域与目标服务器之间的连接问题(例如防火墙限制)引起的。由于文件未能成功下载,gpg 程序也因此报错。 Warning: apt-key is deprecated. apt-key 命令已被弃用,官方推荐使用更安全的方式管理密钥 为了解决这个问题,可以改用国内的镜像源,并采用当前推荐的密钥管理方法。请尝试以下步骤:
# 1. 创建用于存放密钥的目录
sudo install -m 0755 -d /etc/apt/keyrings
# 2. 使用镜像源下载 Docker 的 GPG 密钥, 这里我们使用阿里云的镜像
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# 3. 设置 Docker 的软件源(同样使用镜像)此命令会创建一个新的软件源列表文件,并指定使用刚才下载的密钥进行签名验证。
# 此命令会创建一个新的软件源列表文件,并指定使用刚才下载的密钥进行签名验证。
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 更新apt 软件包列表
sudo apt-get update
- 安装
sudo apt install docker-ce
- 检查运行状态
sudo systemctl status docker
- 启动docker
service docker start
- 启动Docker管理进程
docker start compassionate_valhard
portainer.io管理工具
portainer.io是一个特权容器,可以管理其他的Docker容器,不过需要授权。
安装
国内下载比较慢,服务器在国内的话,请使用国内镜像源:
- 新建文件或编辑 /etc/docker/daemon.json
vi /etc/docker/daemon.json
- 写入内容:
{
"registry-mirrors": [
"https://docker.m.daocloud.io"
]
}
- 重启Docker
sudo systemctl restart docker
- 运行portainer.io
#挂载卷,用于保存portainer.io的配置数据
docker volume create portainer_data
#授权并运行
docker run -d -p 9000:9000 --name portainer --restart always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
- 访问服务器的9000端口即可,记得防火墙开放,我的是阿里云的服务器:

#所有ip均可访问此端口9000/9000
0.0.0.0/0
#指定ip:1.2.3.4可访问此端口9000/9000
1.2.3.4/32
portainer.io的使用
运行vue项目
- 创建管理用户后,连接本地Docker,那个local,点进去:

- 先如图所示创建登录你镜像空间的信息:

registry.cn-hongkong.aliyuncs.com
shirtiny
- 然后进入Stacks,然后新建stack:

version: '2'
services:
nginx_shvideo_vue:
image: registry.cn-hongkong.aliyuncs.com/shirtinycn/shvideo-vue:v1.0.0
restart: always
ports:
- 8000:80
如图配置了一个Nginx,是yaml格式,点deploy即可。
现在就已经可以直接访问vue项目了,在8000端口,记得开放端口。
运行Go后台项目
version: '2'
services:
api:
image: registry.cn-hongkong.aliyuncs.com/shirtinycn/shvideo-go:v6.0.0
restart: always
environment:
#golang MYSQL_DSN
MYSQL_DSN: 'root:123456@tcp(1.2.3.4)/mydb?charset=utf8&parseTime=True&loc=Local'
#容器有自己的环境,容器的localhost不是主机的localhost,这里填内网ip地址,阿里会给个私网ip,理论上应该用内网ip。。可我有时候要换成公网ip才能用
REDIS_ADDR: '1.2.3.4:6379'
#REDIS_PW: 没设密码
REDIS_DB: '0'
SESSION_SECRET: '224895477'
GIN_MODE: 'release'
LOG_LEVEL: 'debug'
ports:
- 3000:3000
宿主机Nginx反向代理
- 我们需要对这些项目的Nginx进行请求的分发,所以我们主机还需要一个Nginx做反向代理
#主机安装Nginx
sudo apt install nginx
#修改nginx的配置文件
#cd /etc/nginx/sites-enabled,这个目录有一个默认配置文件
vi /etc/nginx/sites-enabled/shvideo.conf
#检查文件上下文格式是否写错
sudo nginx -t
#重启nginx
sudo service nginx restart
- Nginx配置文件shvideo.conf内容为:
server {
listen 80;
server_name video.shirtiny.cn;
#server_name 1.2.3.4;
#vue项目位置,video.shirtiny.cn/,会映射到本地8000端口
location / {
proxy_set_header x-Real-IP $remote_addr;
proxy_set_header x-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8000;
}
#后台api,video.shirtiny.cn/api路径,映射到本地3000端口
location /api {
proxy_set_header x-Real-IP $remote_addr;
proxy_set_header x-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:3000;
}
}
server {
listen 80;
server_name mysql.shirtiny.cn;
#server_name 1.2.3.4;
#mysql位置,mysql.shirtiny.cn根路径/,会映射到本地3306端口
location / {
proxy_set_header x-Real-IP $remote_addr;
proxy_set_header x-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:3306;
}
}
server {
listen 80;
server_name docker.shirtiny.cn;
#server_name 1.2.3.4;
#docker管理工具位置,docker.shirtiny.cn根路径/,会映射到本地端口
location / {
proxy_set_header x-Real-IP $remote_addr;
proxy_set_header x-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:9000;
}
}
server {
listen 80;
server_name redis.shirtiny.cn;
#server_name 1.2.3.4;
#docker管理工具位置,redis.shirtiny.cn根路径/,会映射到本地端口
location / {
proxy_set_header x-Real-IP $remote_addr;
proxy_set_header x-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:6379;
}
}
mysql
到Volumes选项,开一个Docker的卷,映射到主机文件目录,用于存储数据库数据,就叫mysql_data好了
version: '2'
services:
docker_mysql:
image: mysql:5.6
restart: always
environment:
MYSQL_ROOT_PASSWORD: 123456
volumes:
- mysql_data:/var/lib/mysql/data
ports:
- 3306:3306
volumes:
mysql_data:
external: true
redis
依然是开个Docker的卷,名为redis_data
version: '2'
services:
docker_redis:
image: redis
restart: always
volumes:
- redis_data:/data
ports:
- 6379:6379
volumes:
redis_data:
external: true
elasticSearch
需要2G内存
基础
version: '2'
services:
docker_Es:
image: elasticsearch:7.4.2
restart: always
ports:
- 9200:9200
networks:
- somenetwork
environment:
- discovery.type=single-node
推荐
#需要2g内存
docker network create somenetwork
docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.4.2
#测试
Get http://ip:9200/
#增 使用post可以省略id,系统自动生成
#格式类似http://ip:9200/database/table/id http://ip:9200/index/type/id 带上json数据 es版本7以后去除了type的概念,不在支持一个index内多个type
Put http://ip:9200/shsipder/user/2
#删除
Delete http://ip:9200/shsipder/user/2
#修改 覆盖式
Put http://ip:9200/shsipder/user/2
#全查 显示pretty=yrue 每页大小size=100
Get http://ip:9200/shsipder/user/_search
#条件 age:(<30)
Get http://ip:9200/shsipder/user/_search?q=shirtiny
#查看表结构
Get http://ip:9200/shsipder/_mapping
最后
服务器停机,像阿里那种释放cpu、内存、保留硬盘,重启后IP可能会更改、有时需要手动启动docker,mysql等服务会随着Docker启动,只是portainer需要再次手动启动,管理进程也不会自动启动,手动启动的命令如下:
#docker容器管理工具
docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
#docker管理进程
docker start compassionate_valhard
# 国内安装nvm (nodejs18需要ubuntu20以上) https://stackoverflow.com/questions/72921215/getting-glibc-2-28-not-found
bash -c "$(curl -fsSL https://gitee.com/RubyMetric/nvm-cn/raw/main/install.sh)"
想开机自启的话,写个脚本,配置一下,即可。
题外话:
nmap可进行端口扫描等,在ubuntu安装很简单:
sudo apt-get install nmap