我的Docker路(第一天)—Docker概念入门

一、Docker三个基本概念

操作系统分为内核和用户空间,对于Linux而言,内核启动后,会挂载root文件系统为其提供用户空间支持。而Docker镜像image,就相当于一个root文件系统。

1.1 镜像

Docker镜像(Image)类似于虚拟机镜像,可以将它理解为一个面向Docker引擎的只读模板,包含了文件系统。 例如:一个镜像可以只包含一个完整的ubuntu操作系统环境,也可以只安装一个Apache应用程序。

Docker镜像是一个特殊的文件系统,除了提供容器运行时所需要的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

镜像只是一个虚拟的概念,其实际提现并非由一个文件组成,而是由一组文件系统组成,或者说由多层文件系统联合组成。

镜像构建时,会一层层构建,前一层是厚一层的基础。每一层构建完就不再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层编辑为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。

分层存储的特征还使得镜像的服用、定制变得更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。

镜像可以用来创建docker容器。

docker提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。

1.2 容器

docker利用容器来运行应用。

容器是从镜像创建的运行实例。镜像和容器的关系,就像是面向对象程序设计中的类和实例一样。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。容器的实质是进程,耽于直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。因此容器可以拥有自己的root文件系统、自己的网络配置、自己的进程空间,甚至自己的用户ID空间。容器内的进程是运行在一个隔离的环境里面,使用起来就好像是在一个独立于宿主的系统下操作一样。

可以把容器看作是一个简易版的linux环境和运行在其中的应用程序。

镜像是只读的,容器可以在启动的时候创建一层可写层作为最上层。每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个微容器运行时读写而准备的存储层为容器存储层。

容器存储层的生命周期和容器一样,容器消亡时,容器存储层也随之向往。因此任何保存于容器存储层的信息都会随容器删除而丢失。

按照Docker最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用数据卷、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。

数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。

1.3 仓库

仓库是集中存放镜像文件的场所,有时候会把仓库和仓库注册服务器混为一谈,并不严格区分。实际上仓库注册服务器上往往存放着多个仓库,每个仓库又包含了多个镜像,每个镜像有不同的标签。

仓库分为公开仓库 和 私有仓库两种形式。

最大的公开仓库是Docker Hub,存放了数量庞大的镜像供用户下载。国内的公开仓库包括Docker Pool等。当然用户也可以在本地网络内创建一个私有仓库。

当用户创建了自己的镜像之后就可以使用push命令将它上传到公有或私有仓库,这样下一次在另外一台机器上使用这个镜像时候,只需要从仓库上pull下来就可以了。

镜像构建完成之后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务。Docker Registry就是这样的服务。

一个Docker Registry中可以包含多个仓库里每个仓库可以包含多个标签tag;每个标签对应一个镜像。

仓库名经常以两段式路径形式出现,比如jwilder/nginx-proxy,前者意味着Docker Registry多用户环境下的用户名,后者则对应的软件名。

二、安装

2.1 centos7

CentOS-Extras库中已带Docker,可以直接安装

sudo yum install docker

安装之后启动docker服务,并让它随系统启动自动加载

sudo service docker start
sudo chkconfig docker on

2.2 mac

Docker for Mac 要求系统最低为 macOS 10.10.3 Yosemite。如果系统不满足需求,可以安装 Docker Toolbox。

如果需要手动下载,请点击以下链接下载 Stable 或 Edge 版本的 Docker for Mac。

如同 macOS 其它软件一样,安装也非常简单,双击下载的 .dmg 文件,然后将那只叫 Moby 的鲸鱼图标拖拽到 Application 文件夹即可(其间需要输入用户密码)。

启动终端后,通过命令可以检查安装后的 Docker 版本。

$ docker --version
Docker version 17.10.0-ce, build f4ffd25
$ docker-compose --version
docker-compose version 1.17.0-rc1, build a0f95af
$ docker-machine --version
docker-machine version 0.13.0, build 9ba6da9

如果 docker version、docker info 都正常的话,可以尝试运行一个 Nginx 服务器:

$ docker run -d -p 80:80 --name webserver nginx

服务运行后,可以访问 http://localhost,如果看到了 "Welcome to nginx!",就说明 Docker for Mac 安装成功了。

要停止 Nginx 服务器并删除执行下面的命令:

$ docker stop webserver
$ docker rm webserver

三、 Docker使用

# 运行交互式的容器
$ docker run -i -t ubuntu:15.10 /bin/bash
# -t:在新容器内指定一个伪终端或终端。
# -i:允许你对容器内的标准输入 (STDIN) 进行交互。

# 启动容器(后台模式)
$ docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"

# 确认容器有在运行,可以通过 docker ps 来查看
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
789ba15cde1f        ubuntu:15.10        "/bin/sh -c 'while..."   5 seconds ago       Up 4 seconds                            boring_poincare

# 使用 docker stop 命令来停止容器
$ docker stop 789ba15cde1f
# 或者
$ docker stop boring_poincare

3.1 Docker容器使用

 # 载入镜像
$ docker pull training/webapp 

# -d:让容器在后台运行。
# -P:将容器内部使用的网络端口映射到我们使用的主机上。
$ docker run -d -P training/webapp python app.py

# 查看当前运行容器
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
44ccfb275de0        training/webapp     "python app.py"     4 seconds ago       Up 2 seconds        0.0.0.0:32768->5000/tcp   unruffled_goldwasser


# 通过-p参数来设置不一样的端口
# 容器内部的 5000 端口映射到我们本地主机的 5000 端口上。

$ docker run -d -p 5000:5000 training/webapp python app.py

# 使用 docker port 可以查看指定 (ID或者名字)容器的某个确定端口映射到宿主机的端口号。
$ docker port e7cc183227f6

# 查看web应用程序日志
# -f:让 docker logs 像使用 tail -f 一样来输出容器内部的标准输出。
$ docker logs -f e7cc183227f6

# 使用docker top 查看容器内部运行的进程
$ docker top e7cc183227f6         
PID                 USER                TIME                COMMAND
2652                root                0:00                python app.py

# 使用 docker inspect 来查看Docker的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。
$ docker inspect e7cc183227f6           

[
    {
        "Id": "e7cc183227f654b75531e144309ccf3e8096e8d499b26a9877d7de9d22692e7f",
        "Created": "2018-09-10T13:15:02.1369748Z",
        "Path": "python",
        "Args": [
            "app.py"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 2652,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2018-09-10T13:15:02.8070606Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },

# 停止web容器
$ docker stop e7cc183227f6   

# 重启web容器
$ docker start e7cc183227f6   

# 使用 docker rm 命令来删除不需要的容器
$ docker rm e7cc183227f6

3.2 Docker镜像使用

Docker运行容器钱需要本地存在对应的镜像,如果镜像不存在本地,Docker会从镜像仓库中下载(默认是Docker Hub公共注册服务器中的仓库)。

3.2.1 获取镜像

$ docker pull ubuntu:12.04
#相当于
$ docker pull registry.hub.docker.com/ubuntu:12.04
#官方仓库注册服务器下载较慢,可以从其他仓库下载
$ docker pull dl.dockerpool.com:5000/ubuntu:12.04

使用该镜像,例如创建一个容器,让其中运行bash应用:

$ docker run -t -i ubuntu:12.04 /bin/bash

3.2.2 列出本地镜像

$ docker images

在列出信息中,可以看到几个字断信息: REPOSITORY:来自于哪个仓库,比如ubuntu TAG:镜像的标记,比如:12.04 IMAGE_ID:它的ID号(唯一) CREATED:创建时间 SIZE:镜像大小

如果不指定具体的标记,则默认使用latest标记信息。

3.2.3 创建镜像

创建镜像有很多方法,用户可以从Docker Hub获取已有镜像并更新,也可以利用本地文件系统创建一个。

3.2.3.1 修改已有镜像
# 查看当前镜像
$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

# 获取镜像
$ sudo docker pull training/sinatra
Using default tag: latest
Trying to pull repository docker.io/training/sinatra ...
latest: Pulling from docker.io/training/sinatra
a3ed95caeb02: Already exists
6e71c809542e: Already exists
d196a7609355: Already exists
08f6dff5acea: Already exists
ce65532003d0: Already exists
54bcaa4d1a10: Already exists
8572ad96f6e1: Already exists
Digest: sha256:03fc0cd265cbc28723e4efd446f9f2f37b4790cf9cc12f1b9203c79fb86b6772
Status: Downloaded newer image for docker.io/training/sinatra:latest

$ sudo docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
docker.io/training/sinatra   latest              49d952a36c58        4 years ago         447 MB

#使用已经下载的镜像启动容器
$ sudo docker run  -t -i training/sinatra /bin/bash
root@98ed7430c815:/# gem install json
Fetching: json-2.1.0.gem (100%)
Building native extensions.  This could take a while...
Successfully installed json-2.1.0
1 gem installed
Installing ri documentation for json-2.1.0...
Installing RDoc documentation for json-2.1.0...

#退出容器
root@98ed7430c815:/# exit
exit

# 提交修改信息commit
$ sudo docker commit -m "add json gem" -a "kenwu" 98ed7430c815 kenwu/sinatra:v1
sha256:3592ac191f87ae65f6cbf2b6b74de2c40422edb34371853a8a87446acece46d6

#查看镜像
$ sudo docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
kenwu/sinatra                v1                  3592ac191f87        8 seconds ago       453 MB
docker.io/training/sinatra   latest              49d952a36c58        4 years ago         447 MB

#使用新的镜像,运行容器
$ sudo docker run -t -i kenwu/sinatra:v1
root@467e5528061f:/#

-m 指定提交的说明信息;-a可以指定更新的用户信息了孩子后是用来创建镜像容器的ID,最后指定目标镜像的仓库名和tag信息。创建成功后会返回这个镜像的ID信息。

CentOS/RHEL 的用户需要注意的事项

在 Ubuntu/Debian 上有 UnionFS 可以使用,如 aufs 或者 overlay2,而 CentOS 和 RHEL 的内核中没有相关驱动。因此对于这类系统,一般使用 devicemapper 驱动利用 LVM 的一些机制来模拟分层存储。这样的做法除了性能比较差外,稳定性一般也不好,而且配置相对复杂。Docker 安装在 CentOS/RHEL 上后,会默认选择 devicemapper,但是为了简化配置,其 devicemapper 是跑在一个稀疏文件模拟的块设备上,也被称为 loop-lvm。这样的选择是因为不需要额外配置就可以运行 Docker,这是自动配置唯一能做到的事情。但是 loop-lvm 的做法非常不好,其稳定性、性能更差,无论是日志还是 docker info 中都会看到警告信息。官方文档有明确的文章讲解了如何配置块设备给 devicemapper 驱动做存储层的做法,这类做法也被称为配置 direct-lvm。

除了前面说到的问题外,devicemapper + loop-lvm 还有一个缺陷,因为它是稀疏文件,所以它会不断增长。用户在使用过程中会注意到 /var/lib/docker/devicemapper/devicemapper/data 不断增长,而且无法控制。很多人会希望删除镜像或者可以解决这个问题,结果发现效果并不明显。原因就是这个稀疏文件的空间释放后基本不进行垃圾回收的问题。因此往往会出现即使删除了文件内容,空间却无法回收,随着使用这个稀疏文件一直在不断增长。

所以对于 CentOS/RHEL 的用户来说,在没有办法使用 UnionFS 的情况下,一定要配置 direct-lvm 给 devicemapper,无论是为了性能、稳定性还是空间利用率。

或许有人注意到了 CentOS 7 中存在被 backports 回来的 overlay 驱动,不过 CentOS 里的这个驱动达不到生产环境使用的稳定程度,所以不推荐使用。

3.2.3.2 利用commit理解镜像构成

docker commit 命令除了学习之外,还有一些特殊的应用场合,比如被入侵后保存现场等。但是,不要使用 docker commit 定制镜像,定制镜像应该使用 Dockerfile 来完成。

镜像是容器的基础,每次执行 docker run 的时候都会指定哪个镜像作为容器运行的基础。

现在让我们以定制一个 Web 服务器为例子,来讲解镜像是如何构建的。

$ docker run --name webserver -d -p 80:80 nginx

这条命令会用 nginx 镜像启动一个容器,命名为 webserver,并且映射了 80 端口,这样我们可以用浏览器去访问这个 nginx 服务器。

现在,假设我们非常不喜欢这个欢迎页面,我们希望改成欢迎 Docker 的文字,我们可以使用 docker exec 命令进入容器,修改其内容。

$ docker exec -it webserver bash                                                                                  kenwu@kenwus-
    root@4255c35fa486:/# echo '<h1>Hello, Docker!</h1>/' > /usr/share/nginx/html/index.html
    root@4255c35fa486:/# exit
    exit

我们以交互式终端方式进入 webserver 容器,并执行了 bash 命令,也就是获得一个可操作的 Shell。

然后,我们用 Hello, Docker! 覆盖了 /usr/share/nginx/html/index.html 的内容。

现在我们再刷新浏览器的话,会发现内容被改变了.

我们修改了容器的文件,也就是改动了容器的存储层。我们可以通过 docker diff 命令看到具体的改动。

$ docker diff webserver                                                                                           kenwu@kenwus-MBP
C /root
A /root/.bash_history
C /run
A /run/nginx.pid
C /usr
C /usr/share
C /usr/share/nginx
C /usr/share/nginx/html
C /usr/share/nginx/html/index.html
C /var
C /var/cache
C /var/cache/nginx
A /var/cache/nginx/client_temp
A /var/cache/nginx/fastcgi_temp
A /var/cache/nginx/proxy_temp
A /var/cache/nginx/scgi_temp
A /var/cache/nginx/uwsgi_temp

现在我们定制好了变化,我们希望能将其保存下来形成镜像。

要知道,当我们运行一个容器的时候(如果不使用卷的话),我们做的任何文件修改都会被记录于容器存储层里。而 Docker 提供了一个 docker commit 命令,可以将容器的存储层保存下来成为镜像。换句话说,就是在原有镜像的基础上,再叠加上容器的存储层,并构成新的镜像。以后我们运行这个新镜像的时候,就会拥有原有容器最后的文件变化。

$ docker commit -m "修改了默认网页" -a "kenwu" 4255c35fa486 nginx:v1                                              kenwu@kenwus-MBP
sha256:9791aeda21f8536a3b72947b0aa41fb522b5fb76d995b6996c871b91bafc8228
------------------------------------------------------------
$ docker image ls                                                                                                 kenwu@kenwus-MBP
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               v1                  9791aeda21f8        3 seconds ago       109MB
nginx               latest              06144b287844        13 hours ago        109MB

我们还可以用 docker history 具体查看镜像内的历史记录,如果比较 nginx:latest 的历史记录,我们会发现新增了我们刚刚提交的这一层。

使用Docker commit 意味着所有对镜像的操作都是黑箱操作,生成的镜像也被称为黑箱镜像,换句话说,就是除了制作镜像的人知道执行过什么命令、怎么生成的镜像,别人根本无从所知。而且,即使是这个制作镜像的人,过一段时间后也无法记清具体怎么操作的。

任何修改的结果仅仅是在当前层进行标记、添加、修改,而不会改动上一层。如果使用docker commit制作镜像,以及后期修改的话,每一次修改都会让镜像更加臃肿一次,所删除的上一层东西并不会丢失,会一直如影随形的跟着这个镜像,即使根本无法访问到。这会让镜像更加臃肿。

3.2.3.3 利用Dockerfile来定制镜像

Dockerfile 是一个文本文件,其内包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

在一个空白目录中,建立一个文本文件,并命名为 Dockerfile:

# 创建文件夹
$ mkdir mynginx
$ cd mynginx

# 创建dockerfile
$ touch Dockerfile

$ vim Dockerfile

    FROM centos:7
    MAINTAINER  Kenwu "code4fs@gmail.com"

    RUN /bin/echo 'root:123456' |chpasswd
    RUN useradd kenwu
    RUN /bin/echo 'kenwu:123456' |chpasswd
    RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
    EXPOSE 22
    EXPOSE 80
    CMD /usr/sbin/sshd -D

# 构建镜像文件
# -t :指定要创建的目标镜像名
# . :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径
$ docker build -t kenwu/centos:7 .                                                             Sending build context to Docker daemon  2.048kB
    Step 1/9 : FROM centos:7
    7: Pulling from library/centos
    256b176beaff: Pull complete 
    Digest: sha256:6f6d986d425aeabdc3a02cb61c02abb2e78e57357e92417d6d58332856024faf
    Status: Downloaded newer image for centos:7
     ---> 5182e96772bf
    Step 2/9 : MAINTAINER  Kenwu "code4fs@gmail.com"
     ---> Running in f87d45e8f4e4
    Removing intermediate container f87d45e8f4e4
     ---> eefc2c2d7282
    Step 3/9 : RUN /bin/echo 'root:123456' |chpasswd
     ---> Running in 9fdf04571914
    Removing intermediate container 9fdf04571914
     ---> b72db03a41d6
    Step 4/9 : RUN useradd kenwu
     ---> Running in c6d9bb0373ea
    Removing intermediate container c6d9bb0373ea
     ---> 54736b6d7e1f
    Step 5/9 : RUN /bin/echo 'kenwu:123456' |chpasswd
     ---> Running in 3a1ad8374651
    Removing intermediate container 3a1ad8374651
     ---> 3fedd3d03549
    Step 6/9 : RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
     ---> Running in 27e6cb3db677
    Removing intermediate container 27e6cb3db677
     ---> f8a275d9e0f7
    Step 7/9 : EXPOSE 22
     ---> Running in 79e5da86756a
    Removing intermediate container 79e5da86756a
     ---> c6fd80ab51fc
    Step 8/9 : EXPOSE 80
     ---> Running in bf9c147316a4
    Removing intermediate container bf9c147316a4
     ---> a313cb41129b
    Step 9/9 : CMD /usr/sbin/sshd -D
     ---> Running in 960596ea2bfc
    Removing intermediate container 960596ea2bfc
     ---> a1e4e1b8ba9a
    Successfully built a1e4e1b8ba9a
    Successfully tagged kenwu/centos:7

# 查看镜像文件
$ docker images                                                                                
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    kenwu/centos        7                   a1e4e1b8ba9a        2 minutes ago       200MB

# 使用新的镜像来创建容器
$ docker run -it kenwu/centos:7 /bin/bash                                                      
[root@f378c5829546 /]# ls
anaconda-post.log  bin  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

# 设置镜像标签
$ docker tag a1e4e1b8ba9a kenwu/centos:dev                                                     
------------------------------------------------------------
$ docker images                                                                                
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
kenwu/centos        7                   a1e4e1b8ba9a        5 minutes ago       200MB
kenwu/centos        dev                 a1e4e1b8ba9a        5 minutes ago       200MB

3.3 Docker容器链接

# 运行一个python应用的容器
# -P :是容器内部端口随机映射到主机的高端口。
# -p : 是容器内部端口绑定到指定的主机端口。
$ docker run -d -P training/webapp python app.py

$ docker run -d -p 5000:5000 training/webapp python app.py

# 指定容器绑定的网络地址,比如绑定127.0.0.1
$ docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py


# 默认都是绑定 tcp 端口,如果要绑定 UDP 端口,可以在端口后面加上 /udp。
$ docker run -d -p 127.0.0.1:5003:5000/udp training/webapp python app.py 

# docker port 命令可以让我们快捷地查看端口的绑定情况。
$ docker port c91ad793e8ab  

# 容器命名
$  docker run -d -P --name kenwuwebapp training/webapp python app.py

四、Docker实例

4.1 Docker安装Nginx

# 拉取官方镜像
$ docker pull nginx

# 创建目录
$ ~/Desktop/studyproject/EveryDay » tree                                                                        

|____.DS_Store
|____nginx
| |____ssl
| |____logs
| |____data
| | |____index.html
| |____conf
| | |____nginx.conf
| | |____conf.d
| | | |____default.conf

# 运行容器
# -p 80:80:映射端口80,用于http请求;
# --name EveryDayngix:将容器命名为EveryDayngix
# -v $PWD/data:/usr/share/nginx/html:将主机中当前目录下的data挂载到容器的/usr/share/nginx/html;nginx的默认首页html的存放目录映射到host盘的目录, /home/evan/workspace/wxserver/nginx/data
# -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf:将主机中当前目录下的nginx.conf挂载到容器的/etc/nginx/nginx.conf;nginx的配置文件映射到host盘的文件,/home/evan/workspace/wxserver/nginx/config/nginx.conf
# -v $PWD/logs:/var/log/nginx/:将主机中当前目录下的logs挂载到容器的/var/log/nginx/

$ docker run -p 80:80 -p 443:443 --name EveryDaynginx -v $PWD/data:/usr/share/nginx/html -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf/:rw -v $PWD/conf/conf.d/default.conf:/etc/nginx/conf.d/default.conf:rw -v $PWD/logs:/var/log/nginx/:rw -v $PWD/ssl:/ssl/:rw -d nginx

nginx/data/index.html文件创建编写

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Test for docker nginx!
    </title>
</head>
<body>
    <h1>Test for Docker!!!!!!</h1>
</body>
</html>

nginx.conf编写

#运行nginx的用户
user  nginx;
#启动进程设置成和CPU数量相等
worker_processes  1;

#全局错误日志及PID文件的位置
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

#工作模式及连接数上限
events {
        #单个后台work进程最大并发数设置为1024
    worker_connections  1024;
}


http {
        #设定mime类型
    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压缩
    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

default.conf编写

server {
    listen    80;       #侦听80端口,如果强制所有的访问都必须是HTTPs的,这行需要注销掉
    server_name  www.code4fs.com;             #域名

    #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;

    #重定向错误页面到 /50x.html
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

查看当前首页:http://127.0.0.1:80

进入容器中

$ docker ps                                                 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
0fbae4f63ded        nginx               "nginx -g 'daemon of…"   14 minutes ago      Up 11 minutes       0.0.0.0:80->80/tcp   EveryDaynginx

$ docker exec -it 0fbae4f63ded /bin/bash
$ ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  ssl  sys  tmp  usr  var

后续咱们再不断增加Mysql、python 等开发环境


评论(1 ) 点赞(34)

  • 丰申 回复
    这是第一次发表回复,主要第一天来看Docker!

  • 暂未登录,请登录之后发表评论。 QQ