今天给之前的信息收集平台写个Dockerfile,好久没写,踩了点坑记录一下。

架构是 vue+beego+mysql,vue打包后就不需要再开启服务。

docker常用命令

列表

1
2
3
docker ps
docker ps -a
docker images

打包、启动、进入

1
2
3
4
docker build -t go-moby:1 .
docker run -itd -p 8081:8081 go-moby:1
docker exec -it 838c bash
docker exec -it mysql-moby bash

日志

1
docker logs -f 838c

停止、删除操作

1
2
3
docker stop $(docker ps -q)
docker rm $(docker ps -aq) 1
docker rmi -f $(docker images -qa)

目录结构

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
➜  moby tree -L 3 
.
├── Dockerfile
├── docker-compose.yml
├── go-moby
│   ├── conf
│   │   └── app.conf
│   ├── dicts
│   │   ├── GeoLite2-ASN.mmdb
│   │   ├── finger.json
│   │   └── subNames.txt
│   ├── go-moby
│   ├── pkg
│   │   └── poc
│   ├── static
│   │   ├── css
│   │   ├── favicon.ico
│   │   ├── fonts
│   │   ├── img
│   │   └── js
│   ├── vendor
│   │   ├── github.com
│   │   ├── go.uber.org
│   │   ├── golang.org
│   │   ├── google.golang.org
│   │   ├── gopkg.in
│   │   └── modules.txt
│   └── views
│       └── index.html
└── mysql
    └── init
        └── moby.sql

mysql

简单启动,很方便的启动一个mysql

1
docker run -itd --name mysql-moby -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql

docker-compose 启动,更加自动化

docker-compose.yml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19

  db:
    image: "mysql"
    restart: always
    container_name: mysql-moby
    privileged: true
    ports:
      - "3306:3306"
    environment:
      # MYSQL_USER: moby
      # MYSQL_PASSWORD: moby
      MYSQL_DATABASE: moby
      MYSQL_ROOT_PASSWORD: xxxxxxxx

    volumes:
      # - data:/var/lib/mysql
      # - ./mysql/config/my.cnf:/etc/my.cnf
      - ./mysql/init:/docker-entrypoint-initdb.d/
    command: --default-authentication-plugin=mysql_native_password

- ./mysql/init:/docker-entrypoint-initdb.d/放初始化的sql文件

因为另一个web容器需要访问该容器,在初始化sql中需要设置允许其他IP连接数据库。

1
2
3
use mysql;
update user set host = '%' where user = 'root';  
flush privileges;

web 中配置数据库地址为container_name,解决容器内网IP变化的情况

web

beego 可以打包成二进制文件方便部署。

Dockerfile

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
FROM centos

COPY go-moby /root/go-moby/

RUN mkdir /root/.config \
	&& ls /root/ \
	&& cp /root/go-moby/dicts/finger.json /root/.config/finger.json

WORKDIR /root/go-moby/

EXPOSE 8081

注意要切换下WORKDIR

默认在/会出现

1
Handler crashed with error can't find templatefile in the path:views/index.html

docker-compose.yml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14

web:
    build: .
    container_name: goweb-moby
    image: centos
    ports:
      - "0.0.0.0:8081:8081"
    depends_on:
      - db
    # 延时,等待mysql启动完毕
    command: >
      /bin/bash -c '
      sleep 15 && /root/go-moby/go-moby;
      '      

1、配置 depends_on 为前面的 db。

2、beego 启动时会先初始化数据库连接,连接失败直接报错,而 docker-compose 启动的时候 mysql 比较慢,因此增加了延时确保初始化时能连上数据库。

3、每次修改web文件需要删除镜像重新生成。

启动

1
docker-compose up