# 安裝Nginx on Docker

## 取得映像檔

輸入`docker images`查詢目前擁有的映像檔

```
root@vm:/home/jennifer# docker images
REPOSITORY                                    TAG                 IMAGE ID            CREATED             SIZE
python                                        3.5-alpine          d15e7a9f900e        3 weeks ago         68.1MB
cassandra                                     latest              604151722441        2 months ago        379MB
alpine                                        3.11                f70734b6a266        2 months ago        5.61MB
nginx                                         1.13.3-alpine       ba60b24dbad5        2 years ago         15.5MB
```

若沒有nginx映像檔，可上[DockerHub](https://hub.docker.com/_/nginx)查詢，選擇版本並`docker pull nginx:[tag]`拉映像檔到自己的機器上，Docker Hub上也會有使用範例

```
root@vm:/home/jennifer# docker pull nginx:1.18
1.18: Pulling from library/nginx
8559a31e96f4: Pull complete
9a38be3aab21: Pull complete
522e5edd83fa: Pull complete
2ccf5a90baa6: Pull complete
Digest: sha256:159aedcc6acb8147c524ec2d11f02112bc21f9e8eb33e328fb7c04b05fc44e1c
Status: Downloaded newer image for nginx:1.18
```

## 啟動容器

#### 情境一：使用Docker Bridge Network，並設定port mapping (host 8880 port <-> 容器 80port)

```
root@vm:/home/jennifer# docker run --name some-nginx -d -p 8880:80 nginx:1.18
```

輸入`http://host-ip:8880`，若有出現nginx畫面代表成功

![](/files/-MB35AsfSpuSx2Pck9mF)

####

#### 情境二：使用Docker Bridge Network，並設定port mapping，`-P`表示主機的port不指定，由電腦隨機取得

```
root@vm:/home/jennifer# docker run --name test-nginx -d -P nginx:1.18
87b059c8b554bd69796ff509a790b5f0684cf88a0ea2e22eb4ec767413fffacf

root@vm:/home/jennifer# docker ps
CONTAINER ID        IMAGE                            COMMAND                  CREATED             STATUS              PORTS                                                                                        NAMES
87b059c8b554        nginx:1.18                       "nginx -g 'daemon of…"   3 seconds ago       Up 2 seconds        0.0.0.0:32768->80/tcp                                                                        test-nginx

```

經`docker ps`查詢容器對應的主機port為32768輸入`http://host-ip:32768`，若有出現nginx畫面代表成功

![](/files/-MB74jRHR_1g5Ye0Ez2k)

#### 情境三：使用host網路，並volume設定檔及NFS資料夾

```
root@vm:/home/jennifer# docker volume create --driver local \
--opt type=nfs \
--opt o=nfsvers=3,addr=192.168.0.0,rw \
--opt device=:/nfstemp \
volume_nfs    #這個指令是用來建立docker data volume

root@vm:/home/jennifer# docker run -d --net=host --restart=always \
-v /var/docker_volume/nginx/default.conf:/etc/nginx/conf.d/default.conf \
-v volume_nfs:/tmp:ro nginx:1.18  #這個指令是用來建立nginx容器
```

## 調整nginx設定檔

我們用`docker exec -it b5e1 bash`進到nginx的容器來看看設定檔（b5e1是某個nginx容器的ID，完整的ID是b5e16239b697，可只輸入前幾碼），再查詢、顯示設定檔的內容

```
root@vm:/home/jennifer# docker exec -it b5e1 bash   # 進入容器並執行BASH


root@b5e16239b697:/etc/nginx# nginx -t   # 查詢nginx設定檔的位置
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

root@b5e16239b697:/etc/nginx# cat /etc/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;
}
```

主機的配置則是default.conf，在容器內執行`cat /etc/nginx/conf.d/default.conf`查看內容

```
server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;

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

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

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}
```

以下是一個完整的default.conf，描述nginx如何處理request

```
server {
    listen       80;
    server_name  192.168.0.100;

    location ~* ^/book_api/(.*)$ {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host;
        proxy_pass http://192.168.0.100:8801/$1$is_args$args;
        client_max_body_size 5M;
        rewrite "^/book_api/(.*)" /$1 break;
    }    

    location /fs/ {
        alias   /tmp/my_fs/;
        try_files $uri default.jpg =404;
    }
    
}
```

下面這段內容表示，當request的子目錄是book\_api的時候，例如 `http://host-ip/book_api/` 或 `http://host-ip/book_api/query?id=3` ，都將內容再導向至`http://192.168.0.100:8801`

另外`client_max_body_size 5M`表示允許上傳的檔案大小為5M

```
    location ~* ^/book_api/(.*)$ {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host;
        proxy_pass http://192.168.0.100:8801/$1$is_args$args;
        client_max_body_size 5M;
        rewrite "^/book_api/(.*)" /$1 break;
    }  
```

下面這段內容，表示當request的子目錄是fs的時候，例如 `http://localhost-ip/fs/a.png`，事實上是返回 `/tmp/my_fs/a.png` 給前端

```
    location /fs/ {
        alias   /tmp/my_fs/;
        try_files $uri default.jpg =404;
    }
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://cutejaneii.gitbook.io/docker/docker-installation/an-zhuang-nginx-on-docker.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
