软硬件环境:
- 阿里云ECS
- Debian GNU/Linux 9.5 (stretch)Debian GNU/Linux 9.5 (stretch)
- Docker version 18.06.0-ce, build 0ffa825
- docker-compose version 1.21.0, build 5920eb0
- Nginx image: nginx:alpine
创建并运行Nginx容器
这里Docker的工作目录在$HOME/docker下,以下用$DOCKER变量指代。
在$HOME/docker目录下的docker-compose.yml文件中加入Nginx的配置
......
nginx:
image: "nginx:alpine"
container_name: "nginx"
volumes:
- "./volumes/nginx/conf/nginx.conf:/etc/nginx/nginx.conf"
- "./volumes/nginx/conf/conf.d:/etc/nginx/conf.d"
- "./volumes/nginx/log:/var/log/nginx"
- "./volumes/nginx/html:/usr/share/nginx/html"
ports:
- "80:80"
- "443:443"
restart: always
......
image指定镜像,首次运行时Docker容器会自动抓取container_name指定运行Nginx服务的Docker容器名称container_name指定运行Nginx服务的Docker容器名称volumes段列出要将哪些容器中的文件或目录映射到宿主机,用冒号隔开,左边是宿主机文件,右边是容器文件ports段列出要将哪些容器中的监听端口映射到宿主机端口,规则和volumes段一样restart: always指定容器随Docker服务启动
首次运行执行docker-compose up -d nginx命令,Docker将自动拉取镜像,创建容器并运行
$ docker-compose up -d nginx
Creating nginx ... done
现在Nginx服务已经运行,浏览器访问宿主机的ip或者域名,应该可以看到默认欢迎页。
映射Nginx配置文件和文档目录
现在Nginx服务已经运行,但是我们还需要进行配置和发布文档,这就需要将容器内的配置文件目录和文档目录映射到宿主机的目录,以便我们方便地修改。
删除上一步创建的容器
$ docker container stop nginx
$ docker rm -f nginx
nginx
创建宿主机目录
$ cd $DOCKER
$ sudo mkdir -p volumes/nginx/{conf,log,html}
运行一个临时的Nginx容器,我们需要从容器中复制一些配置文件
$ docker run --rm --name tmp-nginx-container -d nginx:alpine
17a1bb1386078904f243070ead845b2808356bed6f71e494b4ef353807078011
返回的一长串是临时容器的id。加上--rm参数让docker在容器退出后自动删除。下面开始复制文件:
// copy configuration files
$ sudo docker cp tmp-nginx-container:/etc/nginx/nginx.conf volumes/nginx/conf/
$ sudo docker cp tmp-nginx-container:/etc/nginx/conf.d volumes/nginx/conf
启动正式的Nginx容器
$ docker-compose up -d nginx
Creating nginx ... done
这时Nginx服务应该已经运行起来了。浏览器访问宿主机的ip或者域名,应该会返回一个403页面,因为这时映射的文档目录$DOCKER/volumes/nginx/html目录中还没有index.html文件。
现在$DOCKER/volumes/nginx目录的结构是这样的:
volumes/nginx/
|-- conf
| |-- conf.d <- 主配置文件会自动包含(include)conf.d目录下的配置
| | `-- default.conf
| `-- nginx.conf <- Nginx 主配置文件
|-- html <- 文档根目录
`-- log <- 日志输出目录
|-- access.log
`-- error.log
在下一部分将配置Let’s Encrypt免费SSL证书以提供HTTPS服务