本文以一个简单的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:/# 

验证结束

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐