Docker 部署项目笔记(持续更新)

不用过多的介绍 Docker,最简单的理解方式就是单实例运行方案,其官网地址是 http://docker.com

为什么用 Docker 部署项目

用 Node.JS 来解释下,做 Node.JS 项目的会用到很多第三方的包,通常做法是通过执行命令 npm install package_name 直接在服务器上安装,但这样做是有一定的风险,主要是因为第三方包的不可控。Node.JS 就发生过比较著名的 left-pad 事件,所以通过 Docker 这类工具来部署尤其重要。

这是一篇系列的笔记,我会持续更新里面的内容。需要注意的是,我在是 macOS Catalina 上进行的操作,其它系统大同小异。

安装 Docker

Docker 的安装无需说明,官网有相关的文档,请看这里 选择对应的系统版本安装即可,我使用的是 macOS,所以下载对应的客户端即可,我是通过 brew cask install docker 安装的。而 linux 下的安装方式也比较简单

curl -sSL https://get.docker.com/ | sh
service docker start

安装完成后,运行 docker,可以通过 docker version 查看当前安装的 docker 版本情况。我写了一个一键安装 Docker 和 Docker Compose 的脚本,可以从这里下载。

Node.JS 项目

项目任务

步骤

部署 nginx

docker run -d -p 80:80 --name myNginx -v $PWD/nginx.conf:/etc/nginx/nginx.conf:ro -v $PWD/conf.d:/etc/nginx/conf.d nginx

几点注意点:

  1. 需要提前在本地创建 nginx.conf 文件,如果不创建该文件,上面的命令会自动创建一个 nginx.conf 的文件夹

  2. 创建容器后,nginx.conf 文件是空白,所以 nginx 这个容器是没有运行的,需要在 nginx.conf 写入相关内容

    user  nginx;
    worker_processes  1;
    
    error_log  /var/log/nginx/error.log warn;
    pid        /var/run/nginx.pid;
    
    
    events {
        worker_connections  1024;
    }
    
    
    http {
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;
    
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
    
        access_log  /var/log/nginx/access.log  main;
    
        sendfile        on;
        #tcp_nopush     on;
       
        keepalive_timeout  65;
    
        #gzip  on;
    
        include /etc/nginx/conf.d/*.conf;
    }
    

    这是初始内容,也可以很省事的从容器里复制过来,执行命令 docker cp 容器 ID:/etc/nginx/nginx.conf nginx.conf 即可。

  3. conf.d 这个文件夹里创建相关的配置文件,比如 default.conf。写自己相关的配置文件。

部署 mysql/mariadb

直接命令行部署

docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=password -d mysql

也可以通过 docker-compose.yml 来定义一个,然后通过 docker-compose up -d mariadb 启动。

mariadb:
    image: mariadb:10.4
    container_name: mariadb
    ports:
       - 3306:3306
    environment:
      - MYSQL_ROOT_PASSWORD=111111
      - MYSQL_DATABASE=databasename
      - MYSQL_USER=databaseuser
      - MYSQL_PASSWORD=111111
    volumes:
      - ~/Docker/mysql/db:/var/lib/mysql

当然也需要进行一些初始化的内容,进入到该容器中

docker exec -it mysql bash

登录账号

mysql -u root -p

创建一个数据库

CREATE DATABASE IF NOT EXISTS DB_NAME DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

创建一个用户并赋予权限

CREATE USER 'db_username'@'%' IDENTIFIED WITH mysql_native_password BY 'db_password';
grant select,delete,update,insert on db.* to db_username@'localhost' identified by 'db_username';

部署 MongoDB

执行命令

docker run -itd --name mongo -p 27017:27017 mongo --auth

其中 --auth 表示需要验证账号密码,这就需要创建账号密码

docker exec -it mongo mongo admin

进入容器后,执行下面的语句,创建一个账户,并赋予其密码 123456

db.createUser({ user:'admin',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'}]});

创建完成后,可以通过 db.auth('admin', '123456') 检查是否能够连接。

部署 Redis

先在 Redis 的官方下载一个稳定版本的配置文件,即 redis.conf

wget http://download.redis.io/redis-stable/redis.conf

打开该文件,将 daemonize 后面改成 no,将该文件保存在某一个文件夹中,比如,~/Docker/redis/redis.conf

通过命令即可创建一个 redis 的容器

docker run -d --name redisdemo -p 6379:6379 -v ~/Docker/redis/redis.conf:/etc/redis/redis.conf --privileged=true redis redis-server /etc/redis/redis.conf

还可通过命令 docker-compose up -d 将该容器拉起,docker-compose.yml 内容如下

version: '3'
services:
    redis:
      image: redis:latest
      container_name: redisdemo
      privileged: true
      ports:
        - "6379:6379"
      volumes:
        - ~/Docker/redis/redis.conf:/etc/redis/redis.conf 
      command: redis-server /etc/redis/redis.conf 

完成。

帮助

有时候 Docker 会出现无法停止删除容器的情况,可以先执行命令

sudo systemctl restart docker.socket docker.service

然后就可以操作了。

© 2008 - 2021 · TOURCODER.COM ·