使用 Docker 部署 nginx

获取 nginx 镜像

(1)查看本地是否有 nginx 镜像

webpiece@1205 ~ % docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

(2)如果没有,则搜索镜像                           // 建议去 Docker Hub 搜索,因为可以看到帮助文档

webpiece@1205 ~ % docker search nginx
NAME                                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
nginx                                             Official build of Nginx.                        17147     [OK]  
...

(3)拉取镜像到本地

webpiece@1205 ~ % docker pull nginx 
Using default tag: latest
latest: Pulling from library/nginx
927a35006d93: Pull complete 
fc3910c70f9c: Pull complete 
e11bfbf9fd54: Pull complete 
fbb8b547daa2: Pull complete 
0f1992aeebd8: Pull complete 
f929dacee378: Pull complete 
Digest: sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
webpiece@1205 ~ % docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
nginx        latest    eeb9db34b331   6 months ago   134MB

方式 1:创建并运行 nginx 容器

// 创建 nginx 容器
// -d        后台运行
// --name    给容器命名,方便创建多个容器
// -p        宿主机端口:容器端口
[root@centos7 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
nginx        latest    eeb9db34b331   6 months ago   134MB
[root@centos7 ~]# docker run -d --name="nginx" -p 9001:80 nginx
72b6ff8884a22699b203f3ec7ca801d7484548cf646b7b9fec6919aa49a75609
[root@centos7 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                   NAMES
72b6ff8884a2   nginx     "/docker-entrypoint.…"   7 seconds ago   Up 6 seconds   0.0.0.0:9001->80/tcp, :::9001->80/tcp   nginx
[root@centos7 ~]# curl localhost:9001
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>

# 进入 nginx 容器,查看配置信息

// 进入容器
[root@centos7 ~]# docker exec -it 72b6ff8884a2 /bin/bash
root@72b6ff8884a2:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx

// nginx 配置文件,位于:/etc/nginx
root@72b6ff8884a2:/# cd /etc/nginx
root@72b6ff8884a2:/etc/nginx# ls
conf.d	fastcgi_params	mime.types  modules  nginx.conf  scgi_params  uwsgi_params

// ngnix的 HTML 文件,位于:/usr/share/nginx/html
root@72b6ff8884a2:/etc/nginx# cd /usr/share/nginx/html
root@72b6ff8884a2:/usr/share/nginx/html# ls
50x.html  index.html

// nginx 的日志文件,位于:/var/log/nginx
root@72b6ff8884a2:/usr/share/nginx/html# cd /var/log/nginx
root@72b6ff8884a2:/var/log/nginx# ls
access.log  error.log
root@72b6ff8884a2:/var/log/nginx# exit
exit

# 公网测试


方式 2:承上 - 以挂载到方式创建,并运行 nginx 容器

(1)创建挂载目录

[root@centos7 ~]# mkdir -p /usr/local/docker/nginx/{conf,html,log}
[root@centos7 ~]# cd /usr/local/docker/nginx
[root@centos7 nginx]# ls
conf  html  log

(2)将容器中的相关文件复制到挂载目录中

[root@centos7 nginx]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                   NAMES
72b6ff8884a2   nginx     "/docker-entrypoint.…"   7 minutes ago   Up 7 minutes   0.0.0.0:9001->80/tcp, :::9001->80/tcp   nginx

// 将 nginx 配置文件拷贝到挂载目录
[root@centos7 nginx]# docker cp nginx:/etc/nginx/nginx.conf /usr/local/docker/nginx/
[root@centos7 nginx]# docker cp nginx:/etc/nginx/conf.d /usr/local/docker/nginx/conf

(3)删除原 nginx 容器,以挂载方式启动

// 停止,并删除原容器
[root@centos7 nginx]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                                   NAMES
72b6ff8884a2   nginx     "/docker-entrypoint.…"   10 minutes ago   Up 10 minutes   0.0.0.0:9001->80/tcp, :::9001->80/tcp   nginx
[root@centos7 nginx]# docker stop 72b6ff8884a2
72b6ff8884a2
[root@centos7 nginx]# docker rm 72b6ff8884a2
72b6ff8884a2
[root@centos7 nginx]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

// 以挂载到方式启动容器
[root@centos7 nginx]# docker run -d -p 9001:80 --name="nginx" -v /usr/local/docker/nginx/nginx.conf:/etc/nginx/nginx.conf -v /usr/local/docker/nginx/conf/conf.d:/etc/nginx/conf.d -v /usr/local/docker/nginx/log:/var/log/nginx -v /usr/local/docker/nginx/html:/usr/share/nginx/html --privileged=true nginx
90c9b15496b9ecaa423c7dc48662b9432f8517110a21c87f72b9128a232b1a86

// 测试:403 是因为 nginx 的 html 目录下没有内容,写点html页面就好了
[root@centos7 nginx]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                                   NAMES
90c9b15496b9   nginx     "/docker-entrypoint.…"   57 seconds ago   Up 56 seconds   0.0.0.0:9001->80/tcp, :::9001->80/tcp   nginx
[root@centos7 nginx]# curl localhost:9001
<html>
<head><title>403 Forbidden</title></head>

 

 

 

 

 

 

 


[3] 运行测试

webpiece@1205 ~ % docker run -d --name nginx01 -p 3304:80 nginx
// 参数说明:
// -d        后台运行
// --name    给容器命名
// -p 宿主机端口:容器内部端口

13c341805e0baf1b77b92263c975514de8e7317b2be49bc0f9df8d4c66e6bbbb
webpiece@1205 ~ % docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                  NAMES
13c341805e0b   nginx     "/docker-entrypoint.…"   5 seconds ago   Up 4 seconds   0.0.0.0:3304->80/tcp   nginx01
webpiece@1205 ~ % curl localhost:3304
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...

// 进入容器
webpiece@1205 ~ % docker exec -it 13c341805e0b /bin/bash
root@13c341805e0b:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@13c341805e0b:/# cd /etc/nginx      
root@13c341805e0b:/etc/nginx# ls
conf.d	fastcgi_params	mime.types  modules  nginx.conf  scgi_params  uwsgi_params

[4] 公网访问

// 说明:端口转发


推荐部署:挂载

[1] 搜索、拉取镜像

webpiece@1205 local % docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

// 拉取镜像
webpiece@1205 local % docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
927a35006d93: Pull complete 
fc3910c70f9c: Pull complete 
e11bfbf9fd54: Pull complete 
fbb8b547daa2: Pull complete 
0f1992aeebd8: Pull complete 
f929dacee378: Pull complete 
Digest: sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

[2] 创建挂载目录

// 创建 nginx 挂载目录
webpiece@1205 local % sudo mkdir -p /usr/local/docker/nginx/conf
webpiece@1205 local % sudo mkdir -p /usr/local/docker/nginx/log
webpiece@1205 local % sudo mkdir -p /usr/local/docker/nginx/html

webpiece@1205 local % cd ./docker/nginx
webpiece@1205 nginx % ls
conf	html	log

[3] 创建一个 nginx 容器,将其配置文件拷贝到( 宿主机 )挂载目录中

// 创建一个 nginx 容器
webpiece@1205 local % docker run -d --name="nginx" -p 9001:80 nginx
7bd8f76097cb93965f47b80187c1c84018a4d6fbe8b4095ee52dac06e55c0e4c
webpiece@1205 local % docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                  NAMES
7bd8f76097cb   nginx     "/docker-entrypoint.…"   6 seconds ago   Up 6 seconds   0.0.0.0:9001->80/tcp   nginx

// 将 nginx 容器( 7bd8f76097cb )的配置文件拷贝到挂载目录
webpiece@1205 local % sudo docker cp nginx:/etc/nginx/nginx.conf /usr/local/docker/nginx/conf/nginx.conf
webpiece@1205 local % sudo docker cp nginx:/etc/nginx/conf.d /usr/local/docker/nginx/conf/conf.d

[4] 删除 nginx 容器( 7bd8f76097cb ),然后,使用挂载方式重新创建并运行 nginx 容器

// 停止并删除nginx容器( 7bd8f76097cb )
webpiece@1205 local % docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                  NAMES
7bd8f76097cb   nginx     "/docker-entrypoint.…"   3 minutes ago   Up 3 minutes   0.0.0.0:9001->80/tcp   nginx
webpiece@1205 local % docker stop 7bd8f76097cb
7bd8f76097cb
webpiece@1205 local % docker rm 7bd8f76097cb
7bd8f76097cb

// 以挂载到方式重新创建并运行nginx容器
webpiece@1205 local % docker run -d -p 9001:80 --name nginx -v /usr/local/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /usr/local/docker/nginx/conf/conf.d:/etc/nginx/conf.d -v /usr/local/docker/nginx/log:/var/log/nginx -v /usr/local/docker/nginx/html:/usr/share/nginx/html nginx

// 说明:如果nginx.conf挂载目录下没有nginx.conf文件的话可能会出现以下报错
   docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error mounting "/usr/local/docker/nginx/conf/nginx.conf" to rootfs at "/etc/nginx/nginx.conf": mount /usr/local/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf (via /proc/self/fd/14), flags: 0x5000: not a directory: unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type.

[5] 公网测试( 是否开放端口 )

// 查看9001端口是否开放
[root@centos7 html]# firewall-cmd --query-port=9001/tcp
no
[root@centos7 html]# firewall-cmd --add-port=9001/tcp --permanent
success
[root@centos7 html]# firewall-cmd --reload
success