docker 应用

docker 2021-05-07 790

五、docker 应用

5.1、docker 部署 Mysql

# 1、拉取 mysql 镜像
docker pull mysql:5.7

# 2、创建 mysql 本地存储目录
mkdir /Users/fuwenwei/Documents/800-docker/mysql/conf
mkdir /Users/fuwenwei/Documents/800-docker/mysql/data
mkdir /Users/fuwenwei/Documents/800-docker/mysql/logs

# 运行 mysql 容器,映射端口为 3308
docker run \
-p 3308:3306 \
--name mysql \
-v /Users/fuwenwei/Documents/800-docker/mysql/conf:/etc/mysql/conf.d \
-v /Users/fuwenwei/Documents/800-docker/mysql/data:/var/lib/mysql \
-v /Users/fuwenwei/Documents/800-docker/mysql/logs:/var/log/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7

# 使用下面的方法启动 docker
docker run -d -p 3308:3306 --name mysql -v /Users/fuwenwei/Documents/800-docker/mysql/conf:/etc/mysql/conf.d -v /Users/fuwenwei/Documents/800-docker/mysql/data:/var/lib/mysql -v /Users/fuwenwei/Documents/800-docker/mysql/logs:/var/log/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0.26

# byd
docker run -d -p 8012:3306 --name mysql -v /root/config/mysql/conf:/etc/mysql/conf.d -v /root/config/mysql/data:/var/lib/mysql -v /root/config/mysql/logs:/var/log/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0

5.2、docker 部署 fastapi 项目

5.2.1、使用 python 镜像运行 fastapi 项目

使用 python 镜像运行容器,在容器中手动安装依赖,再运行系统

# 运行 python docker 镜像
docker run -dit -p 9000:9000 --name fastapi-admin python

# 拷贝文件到容器内部,安装依赖进行启动
docker cp fastapi-project 容器ID:/home
cd /home
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
uvicorn app.main:app --reload --host 0.0.0.0 --port 9000

# 使用 tmux 运行可以保持项目一直运行在容器中,退出容器后也保持运行中

5.2.2、使用 Dockerfile 构建自定义镜像运行项目

1、先写 Dockerfile 文件:

FROM python

WORKDIR /home/fastapi # 指定工作空间

COPY . .

RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

EXPOSE 9000 # 端口配置

CMD ["uvicorn", "app.main:app", "--reload", "--host", "0.0.0.0", "--port", "9000"]

2、构建 fastapi 应用镜像并运行:

# 构建镜像
docker build -t fastapi-admin .

# 运行镜像
docker run -d -p 9001:9000 --name fastapi-admin fastapi-admin

5.2.3、 Nginx 配置代理

将接口进行反向代理,并且使用域名进行 https 访问。

先根据域名申请一个证书,保存在 cert目录下,作为 nginx 配置使用,在使用 nginx 镜像构建时将 证书文件也 copy 到镜像内。

server {
    # listen 80; # 侦听80端口,如果强制所有的访问都必须是HTTPs的,这行需要注销掉
    listen 443 ssl; # 侦听443端口,用于SSL
    server_name dms.fuwenwei.com;  # 自己的域名

    # 注意文件位置,是从/etc/nginx/下开始算起的
    ssl_certificate cert/server.crt; # ssl 证书
    ssl_certificate_key cert/server.key; # ssl 证书
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;

    client_max_body_size 1024m;

    #charset koi8-r;
    access_log  /var/log/nginx/host.access.log  main;
    error_log  /var/log/nginx/error.log  error;

    location / {
        proxy_set_header HOST $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        # add_header Content-Security-Policy upgrade-insecure-requests;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://xx.xx.xx.xx:9000; # 配置代理地址
    }
}

Dockerfile 文件

FROM nginx
COPY nginx/cert/ /etc/nginx/cert/
COPY nginx/default.conf /etc/nginx/conf.d/default.conf

5.2.4、 问题

报错:

docker: Error response from daemon: driver failed programming external connectivity on endpoint fastapi-admin (4602589002a0f13e18a5e3386366a4a0e45a8648d4350499a31eea20324a3d1a):  (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 9000 -j DNAT --to-destination 172.17.0.2:9000 ! -i docker0: iptables: No chain/target/match by that name.
 (exit status 1)).

解决办法:

# 重启 docker 服务后再启动容器
systemctl restart docker

5.3、docker 部署 vue 项目

5.3.1、http 访问

1、编译项目文件

npm run build

2、使用 nginx 镜像构建 vue 应用镜像

docker pull nginx

3、创建 nginx 配置文件

在项目根目录下创建 nginx 文件夹,该文件夹下新建文件 default.conf

server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;
    access_log  /var/log/nginx/host.access.log  main;
    error_log  /var/log/nginx/error.log  error;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

该配置文件定义了首页的指向为 /usr/share/nginx/html/index.html, 所以我们可以一会把构建出来的 index.html 文件和相关的静态资源放到 /usr/share/nginx/html 目录下。

4、创建 Dockerfile 文件

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

5、基于该 Dockerfile 构建 vue 应用镜像

# 注意不要少了最后的 “.” 
# -t 是给镜像命名 . 是基于当前目录的 Dockerfile 来构建镜像
docker build -t vue-project-name . 

6、启动 vue 应用容器

docker run -d \
-p 9527:80 \
--name vue-project-name \
vue-project-name

docker run -d -p 9527:80 --name=vue-project-name vue-project-name

7、访问 vue 应用

打开浏览器,访问 项目地址就可以

5.3.2、https 访问

通过 https 访问主要是配置 nginx 服务器,需要一个域名证书,先根据域名申请一个证书,保存在 cert目录下,作为 nginx 配置使用,在使用 nginx 镜像构建时将 证书文件也 copy 到镜像内。

1、Dockerfile 文件

FROM nginx
COPY dist/ /usr/share/nginx/html/
COPY nginx/cert/ /etc/nginx/cert/
COPY nginx/default.conf /etc/nginx/conf.d/default.conf

2、Nginx配置文件:default.conf

server {
    # listen 80; #侦听80端口,如果强制所有的访问都必须是HTTPs的,这行需要注销掉
    listen 443 ssl; #侦听443端口,用于SSL
    server_name byd.xadata.net;  # 自己的域名

    # 注意文件位置,是从/etc/nginx/下开始算起的
    ssl_certificate cert/server.crt; # 证书路径
    ssl_certificate_key cert/server.key; # 证书路径
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;

    client_max_body_size 1024m;

    #charset koi8-r;
    access_log  /var/log/nginx/host.access.log  main;
    error_log  /var/log/nginx/error.log  error;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}

3、部署项目

docker build -t vue-project-name . 
docker run -d -p 9527:443 --name=vue-project-name vue-project-name

5.4、docker 部署 Nginx

运行 docker

docker run -d -p 8000:80 --name nginxtest nginx \
-v ~/nginx/www:/home \
-v ~/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v ~/nginx/logs:/var/log/nginx \

docker run -d -p 8000:80 --name nginxtest -v ~/nginx/www:/root -v ~/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v ~/nginx/logs:/var/log/nginx nginx:latest

Nginx 镜像的配置文件很简单,

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;
}

Nginx 镜像内部的配置文件路径为:/etc/nginx/nginx.conf,建议配置文件单独放在 /etc/nginx/conf.d 目录下,这样修改都比较方便。

1、不需要 SSL 的情况

server {
    listen 80;  # 监听80端口
    server_name example.com www.example.com;  # 自己的域名

    location / {
        proxy_set_header HOST $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        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:8090;  # 需要代理的地址:端口
    }
}

2、需要 SSL 的情况

  • 如果不需要访问 http 的时候强制重定向为 https
# 非强制重定向https
server {
    listen 80; #侦听80端口,如果强制所有的访问都必须是HTTPs的,这行需要注销掉
    listen 443 ssl; #侦听443端口,用于SSL
    server_name example.cn www.example.cn;  # 自己的域名
    # 注意文件位置,是从/etc/nginx/下开始算起的
    ssl_certificate cert/server.crt; # 证书路径
    ssl_certificate_key cert/server.key; # 证书路径
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;

    client_max_body_size 1024m;

    location / {
        proxy_set_header HOST $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://xxx.xx.xx.xx:8090;
    }
}
#以下属性中,以ssl开头的属性表示与证书配置有关。
server {
    listen 443 ssl;
    server_name yourdomain.com; 

    ssl_certificate cert/www.fuwenwei.com.pem; 
    ssl_certificate_key cert/www.fuwenwei.com.key; 
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    #表示使用的加密套件的类型。
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #表示使用的TLS协议的类型。
    ssl_prefer_server_ciphers on;

    location / {
        proxy_set_header HOST $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://xxx.xx.xx.xx:8090;
    }
}
server {
    listen 80;
    server_name yourdomain.com; #需要将yourdomain.com替换成证书绑定的域名。
    rewrite ^(.*)$ https://$host$1; #将所有HTTP请求通过rewrite指令重定向到HTTPS。
}
  • 如果需要访问 http 的时候强制重定向为 https
# 强制重定向
server {
    listen 443 ssl;
    server_name example.com www.example.com;  # 自己的域名
    # 注意文件位置,是从/etc/nginx/下开始算起的
    ssl_certificate cert/server.crt; # 证书路径
    ssl_certificate_key cert/server.key; # 证书路径
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;

    client_max_body_size 1024m;

    location / {
        proxy_set_header HOST $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_pass http://xx.xx.xx.xx:9090;
    }
}
server {
     listen 80; # 监听80端口
     server_name example.com www.example.com;  # 绑定证书的域名
     # 把http的域名请求转成https
     return 301 https://$host$request_uri; 
}

5.5、docker 部署 PostgreSql

# 1、拉取 postgresql 镜像
docker pull postgres

# 2、创建 postgresql 本地存储目录
mkdir /Users/fuwenwei/Documents/800-docker/postgresql/data

# 运行 postgresql 容器,映射端口为 5432
docker run \
-p 5432:5432 \
--name postgresql \
-v /Users/fuwenwei/Documents/800-docker/postgresql/data:/var/lib/postgresql/data \
-e POSTGRES_PASSWORD=123456 \
-d postgres

# 使用下面的方法启动 docker
docker run -d -p 5432:5432 --name postgresql -v /Users/fuwenwei/Documents/800-docker/postgresql/data:/var/lib/postgresql/data -e POSTGRES_PASSWORD=123456 postgres


关注微信公众号『极客技术之路

第一时间了解最新动态
关注博主不迷路~

极客技术之路:站内收集的部分资源来源于网络,若侵犯了您的合法权益,请联系我们删除!
分享到:
赞(0)

文章评论

0点赞 0评论 收藏 QQ分享 微博分享

极客技术之路

极客技术之路