使用 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


