Docker中运行nginx并挂载本地目录到镜像中
本文以一个简单的docker运行nginx为例子介绍一下docker的基本用法。推荐一个不错的入门资料 Docker — 从入门到实践 本文也是主要参考了这个资料基本概念镜像Docker 把应用程序及其依赖,打包在 image 文件里面。只有通过这个文件,才能生成 Docker 容器。image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个...
本文以一个简单的docker运行nginx为例子介绍一下docker的基本用法。
推荐一个不错的入门资料 Docker — 从入门到实践 本文也是主要参考了这个资料
基本概念
- 镜像
Docker 把应用程序及其依赖,打包在 image 文件里面。只有通过这个文件,才能生成 Docker 容器。image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。
- 容器
image 文件生成的容器实例,本身也是一个文件,称为容器文件
- 仓库
仓库是集中存放镜像的地方。每个服务器上可以有多个仓库。
每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。
仓库又分为公有仓库(DockerHub、dockerpool)和私有仓库。
安装前可以用docker images 查看已下载的docker镜像,用docker ps 查看运行中的镜像。
下面的是我机器上执行的额结果。可以看到已经安装了redis和hello-world 镜像,并且现在没有任何镜像在运行。
wuzhangwei@ubuntu:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest a55fbf438dfd 4 days ago 95MB
hello-world latest fce289e99eb9 2 months ago 1.84kB
wuzhangwei@ubuntu:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
wuzhangwei@ubuntu:~$
开始去docker的公有仓库下载nginx镜像
可以用这条命令去查看公有仓库中都有哪些镜像 sudo docker search keywords
如下面执行的结果来看,排在第一个的镜像就是docker的官方镜像,剩下的都是个人用户上传的镜像。而且STARS数量越多说明越受欢迎,使用的人也越多。
wuzhangwei@ubuntu:~$ docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 11152 [OK]
jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 1574 [OK]
richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of… 697 [OK]
jrcs/letsencrypt-nginx-proxy-companion LetsEncrypt container to use with nginx as p… 494 [OK]
kitematic/hello-world-nginx A light-weight nginx container that demonstr… 124
webdevops/php-nginx Nginx with PHP-FPM 123 [OK]
zabbix/zabbix-web-nginx-mysql Zabbix frontend based on Nginx web-server wi… 92 [OK]
bitnami/nginx Bitnami nginx Docker Image 65 [OK]
linuxserver/nginx An Nginx container, brought to you by LinuxS… 57
1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5 ubuntu-16-nginx-php-phpmyadmin-mysql-5 50 [OK]
tobi312/rpi-nginx NGINX on Raspberry Pi / armhf 24 [OK]
nginx/nginx-ingress NGINX Ingress Controller for Kubernetes 17
schmunk42/nginx-redirect A very simple container to redirect HTTP tra… 13 [OK]
nginxdemos/hello NGINX webserver that serves a simple page co… 13 [OK]
wodby/drupal-nginx Nginx for Drupal container image 12 [OK]
blacklabelops/nginx Dockerized Nginx Reverse Proxy Server. 12 [OK]
centos/nginx-18-centos7 Platform for running nginx 1.8 or building n… 10
centos/nginx-112-centos7 Platform for running nginx 1.12 or building … 7
nginxinc/nginx-unprivileged Unprivileged NGINX Dockerfiles 4
1science/nginx Nginx Docker images that include Consul Temp… 4 [OK]
mailu/nginx Mailu nginx frontend 3 [OK]
travix/nginx NGinx reverse proxy 2 [OK]
toccoag/openshift-nginx Nginx reverse proxy for Nice running on same… 1 [OK]
ansibleplaybookbundle/nginx-apb An APB to deploy NGINX 0 [OK]
wodby/nginx Generic nginx 0 [OK]
wuzhangwei@ubuntu:~$
下载官方的nginx镜像
wuzhangwei@ubuntu:~$ docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
f7e2b70d04ae: Pull complete
08dd01e3f3ac: Pull complete
d9ef3a1eb792: Pull complete
Digest: sha256:98efe605f61725fd817ea69521b0eeb32bef007af0e3d0aeb6258c6e6fe7fc1a
Status: Downloaded newer image for nginx:latest
wuzhangwei@ubuntu:~$
检查本地镜像列表
wuzhangwei@ubuntu:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest a55fbf438dfd 4 days ago 95MB
nginx latest 881bd08c0b08 3 weeks ago 109MB
hello-world latest fce289e99eb9 2 months ago 1.84kB
wuzhangwei@ubuntu:~$
现在先不挂载本地目录到nginx镜像运行后的容器中,而是先简单运行nginx镜像
下面执行的命令 -p 8080:80 表示将宿主机的8080端口映射到nginx镜像运行后的80端口(nginx配置文件默认是80端口)
-d 表示以后台进程的方式启动。
docker ps 命令展示正在运行中的容器
wuzhangwei@ubuntu:~$ docker run -p 8080:80 -d nginx
af7636e620549e4a337f83a0393eff281037a0af4145dfe8ffb6e1433cfabb58
wuzhangwei@ubuntu:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
af7636e62054 nginx "nginx -g 'daemon of…" 20 seconds ago Up 19 seconds 0.0.0.0:8080->80/tcp fervent_hopper
wuzhangwei@ubuntu:~$
访问nginx首页
nginx已经运行起来了
但是存在的问题是:
1.日志哪儿去了?
2.修改了配置文件怎么办?
3.项目的文件放在哪儿
一般来说,解决的办法就是把文件放在宿主机,然后挂载到容器中,修改配置文件只需要docker exec -it containe_name bash进入到容器nginx -s reload重新加载一次配置文件即可。
我是直接拉取的docker hub的nginx镜像
在容器中相关位置分别是:
日志位置:/var/log/nginx/
配置文件位置:/etc/nginx/
项目位置:/usr/share/nginx/html
下面测试挂载本地目录到docker容器
在宿主机创建以下目录
/home/wuzhangwei/mynginx/nginx/conf
/home/wuzhangwei/mynginx/nginx/conf.d
/home/wuzhangwei/mynginx/nginx/html
/home/wuzhangwei/mynginx/nginx/log
配置文件
/home/wuzhangwei/mynginx/nginx/conf/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;
}
/home/wuzhangwei/mynginx/nginx/conf.d/default.conf
server {
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;
}
}
/home/wuzhangwei/mynginx/nginx/html/index.html
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>hello docker!</h1>
</body>
</html>
关闭nginx容器
wuzhangwei@ubuntu:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
af7636e62054 nginx "nginx -g 'daemon of…" 3 hours ago Up 3 hours 0.0.0.0:8080->80/tcp fervent_hopper
wuzhangwei@ubuntu:~$ docker stop af76
af76
wuzhangwei@ubuntu:~$
重新运行nginx镜像
docker run --name docker_nginx -d -p 8080:80
-v /home/wuzhangwei/mynginx/nginx/log:/var/log/nginx
-v /home/wuzhangwei/mynginx/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
-v /home/wuzhangwei/mynginx/nginx/conf.d:/etc/nginx/conf.d
-v /home/wuzhangwei/mynginx/nginx/html:/usr/share/nginx/html
nginx
启动成功
wuzhangwei@ubuntu:~$ docker run --name docker_nginx -d -p 8080:80 -v /home/wuzhangwei/mynginx/nginx/log:/var/log/nginx -v /home/wuzhangwei/mynginx/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /home/wuzhangwei/mynginx/nginx/conf.d:/etc/nginx/conf.d -v /home/wuzhangwei/mynginx/nginx/html:/usr/share/nginx/html nginx
28e295bef82633980d4d12af82b3304521b2ecc8de8357dc9f619df44cec9826
wuzhangwei@ubuntu:~$
访问nginx首页
可以发现,nginx首页展示的内容已经被改变了,展示的就是前面在宿主机上创建的index.html内容。而且修改宿主机的index.html或者nginx.conf、default.conf,就相当于你直接修改docker中的nginx容器中的文件一样。
验证方法很简单,直接进入nginx容器中查看index.html的文件是否和宿主机的内容一样。
wuzhangwei@ubuntu:~$ docker exec -it 28e29 bash
root@28e295bef826:/# cat /usr/share/nginx/html/index.html
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>hello docker!</h1>
</body>
</html>
root@28e295bef826:/#
验证结束
更多推荐
所有评论(0)