Docker Componse 项目实践

一、搭建私有仓库

  • 支持 HTTPS
  • 支持账号登录

首先安装Docker (CentOS7)

# 卸载旧版本
$ yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

$ yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2
$ yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
$ yum install docker-ce docker-ce-cli containerd.io

# 启动服务
$ systemctl start docker

# 设置开机自启动
$ systemctl enable docker

安装 docker-compose

$ curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose
$ ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
$ docker-compose --version
  1. 创建映射目录
$ mkdir -p /docker/registry
$ cd /docker/registry
  1. 拷入域名证书

可以去申请免费HTTPS证书 Let's Encrypt

$ mkdir /docker/registry/certs
$ cp mydomain.key mydomain.pem /docker/registry/certs
  1. 创建仓库账号

修改指令中的用户名testuser和密码testpassword

$ mkdir /docker/registry/auth
$ docker run \
  --entrypoint htpasswd \
  registry:2 -Bbn testuser testpassword > /docker/registry/auth/htpasswd
  1. 启动容器
  • 配置 docker-compose.yml
registry:
  restart: always
  image: registry:2
  ports:
    - 5000:5000
  environment:
    REGISTRY_HTTP_TLS_CERTIFICATE: /certs/mydomain.pem
    REGISTRY_HTTP_TLS_KEY: /certs/mydomain.key
    REGISTRY_AUTH: htpasswd
    REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
    REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
  volumes:
    - /docker/registry/data:/var/lib/registry
    - /docker/registry/certs:/certs
    - /docker/registry/auth:/auth
  • 启动
$ docker-compose up -d

二、本地推送版本

  1. 编译译成 Linux 可执行文件
$ CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo .
  1. 配置 Dockerfile
FROM scratch

ENV APPHOME /app
WORKDIR $APPHOME
COPY demo-api data.json upload.json $APPHOME/
EXPOSE 7770

CMD ["./demo-api", "/data/config.json"]
  1. 编译成镜像
$ docker build -t demo-api .
  1. 推送镜像到远程
$ docker login mydomain.com:5000
$ docker tag demo-api mydomain.com:5000/demo-api
$ docker push mydomain.com:5000/demo-api
  1. 打包前端
    前端是 Vue cli 3 创建的的工程,这里用 nginx 打包成服务镜像
  • 创建 nginx.conf 文件
server {
    listen       80;
    server_name  _;

    root /usr/share/nginx/html;
    location / {
        try_files $uri $uri/ /index.html;
    }

    location /api/ {
        rewrite ^/api/(.*)$ /$1 break;
        proxy_pass   http://demo-api:7770;
    }
}
  • 创建 Dockerfile 文件 (使用了精简的*-alpine版本)
FROM nginx:1.15.9-alpine

COPY dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]
  • 编译过程同demo-api

三、远程部署版本

  1. 拉取镜像
$ docker login mydomain.com:5000
$ docker pull mydomain.com:5000/demo-api
$ docker pull mydomain.com:5000/demo-html
  1. 创建数据挂载目录
$ mkdir -p /docker/demo
$ cd /docker/demo
  1. 创建项目配置文件
$ vim demo-api/config.json
  1. 配置 docker-compose.yml
  • redis容器务必配置--appendonly yes否则数据不会落到挂载目录上,重建容器数据会丢失
version: "3"
services:
  demo-html:
    image: mydomain.com:5000/demo-html
    ports:
      - "8070:80"
    volumes:
      - ./demo-html/nginx.conf:/etc/nginx/conf.d/default.conf
    environment:
      - VIRTUAL_HOST=ticket.mydomain.com
    networks:
      - demo

  demo-api:
    image: mydomain.com:5000/demo-api
    restart: always
    ports:
      - "7770:7770"
    volumes:
      - ./demo-api:/data
    environment:
      - VIRTUAL_HOST=ticket-api.mydomain.com
    depends_on:
      - mariadb
      - redis
    networks:
      - demo
    command: ./demo-api /data/config.json

  mariadb:
    image: mariadb:10.3
    restart: always
    volumes:
      - ./mysql:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: demo
      MYSQL_USER: demo
      MYSQL_PASSWORD: demo
    networks:
      demo:
        aliases:
          - mariadb
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_bin

  redis:
    image: redis:5.0
    restart: always
    volumes:
      - ./redis:/data
    networks:
      demo:
        aliases:
          - redis
    command: redis-server --appendonly yes --requirepass release

networks: demo:

注意:docker容器默认是UTC时间,如果需要指定为与主机一致,可以通过额外挂载时间配置文件来实现

volumes:
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
  1. 启动组合
$ docker-compose up -d
  1. 宿主机器配置 Nginx 域名反向代理
# 已省略SSL配置部分

# 前端HTML
server {
    listen       443 ssl;
    server_name  ticket.mydomain.com;

    location / {
        proxy_pass http://127.0.0.1:8070;
    }
}

# 后端API
server {
    listen       443 ssl;
    server_name  ticket-api.mydomain.com;

    location / {
        proxy_pass   http://127.0.0.1:7770;
    }

    allow all;
}

四、后续更新

  1. 本地打新版本
$ CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo .
$ docker build -t demo-api .
$ docker tag demo-api mydomain.com:5000/demo-api
$ docker push mydomain.com:5000/demo-api
  1. 远程拉取并更新(差量)
$ docker login mydomain.com:5000
$ docker-compose pull
$ docker-compose up -d

  1. 项目中创建 Makefile,集成命令简化操作
all: image tag

# 生成镜像
image:
    # 1. 编译成Linux可执行文件
    CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo .

    # 2. 删除Docker悬挂的镜像
    docker image prune -f

    # 3. 编译Docker镜像
    docker build -t demo-api .

    # 4. 删除可执行文件
    rm demo-api

# 发版并推送
tag:
    # 1. 登录到私有仓库
    docker login -u=ma --password-stdin < ./Password mydomain.com:5000

    # 2. 发版
    docker tag demo-api:latest mydomain.com:5000/demo-api

    # 3. 推送到远程仓库
    docker push mydomain.com:5000/demo-api:latest
$ make image
$ make tag
$ make
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容