美文网首页程序员
第一本docker书-读书笔记 第五章

第一本docker书-读书笔记 第五章

作者: yellowone | 来源:发表于2020-12-08 08:46 被阅读0次

    这一章的主要内容都是在执行命令。我们也重点把命令整理出来,执行一遍,看看效果练练手。

    cd /data/docker_test/
    mkdir sample
    cd sample/
    touch Dockerfile
    vim Dockerfile
    
    

    dockerfile 里面的内容

    FROM ubuntu
    MAINTAINER huangzelin "huangzelin@example.com"
    ENV REFRESHER_AT 202-12-01
    RUN apt-get update
    RUN apt-get -y -q install nginx
    RUN mkdir -p /var/www/html
    ADD nginx/global.conf /etc/nginx/conf.d/
    ADD nginx/nginx.conf /etc/nginx/
    
    EXPOSE 80
    
    

    然后给nginx传入两份配置

    mkdir nginx && cd nginx
    vim global.conf
    vim nginx.conf
    
    

    global.conf

    server {
            listen          0.0.0.0:80;
            server_name     _;
    
            root            /var/www/html/website;
            index           index.html index.htm;
    
            access_log      /var/log/nginx/default_access.log;
            error_log       /var/log/nginx/default_error.log;
    }
    
    

    nginx.conf

    user www-data;
    worker_processes 4;
    pid /run/nginx.pid;
    daemon off;
    
    events {  }
    
    http {
      sendfile on;
      tcp_nopush on;
      tcp_nodelay on;
      keepalive_timeout 65;
      types_hash_max_size 2048;
      include /etc/nginx/mime.types;
      default_type application/octet-stream;
      access_log /var/log/nginx/access.log;
      error_log /var/log/nginx/error.log;
      gzip on;
      gzip_disable "msie6";
      include /etc/nginx/conf.d/*.conf;
    }
    
    

    构建镜像

    sudo docker build -t huangzelin/nginx .
    
    

    创建卷目录,并写入网页内容

    mkdir website && cd website
    vim index.html
    
    
    <head>
    
            <title>Test website</title>
    
    </head>
    
    <body>
    
            <h1>This is a yahaha website</h1>
    
    </body>
    
    

    运行docker并指定卷目录

    docker run -d -p 80 --name website -v $PWD/website:/var/www/html/website huangzelin/nginx nginx
    
    

    查看端口

    docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                   NAMES
    87a99d7b5681        huangzelin/nginx    "nginx"             13 minutes ago      Up 13 minutes       0.0.0.0:32768->80/tcp   website
    
    
    image-20201201082322255

    修改卷目录下面的代码。

    <head>
    
            <title>Test website</title>
    
    </head>
    
    <body>
    
            <h1>This is a yahaha website</h1>
    
    </body>
    
    
    image-20201201082538124

    对应内容也会马上生效。

    构建一个web应用程序

    创建一个webAPP目录

    mkdir sinatra && cd sinatra
    vim Dockerfile
    
    
    FROM ubuntu
    LABEL maintainer="huangzelin@example.com"
    ENV REFRESHED_AT 2014-06-01
    
    RUN apt-get -qq update && apt-get -qq install ruby ruby-dev build-essential redis-tools
    RUN gem sources --remove https:/rubygems.org
    RUN gem sources -a https://gems.ruby-china.com
    RUN gem install  sinatra json redis
    
    RUN mkdir -p /opt/webapp
    
    EXPOSE 4567
    
    CMD [ "/opt/webapp/bin/webapp" ]
    
    

    这里把gem转成国内的镜像源,不然太慢了。

    然后创建webapp目录。这下面是作者写的一个ruby程序。

    可以去这里拿

    给作者的程序增加可运行权限。

    chmod +x webapp/bin/webapp
    
    

    然后开始build镜像。

    docker build -t huangzelin/sinatra .
    
    

    启动

    sudo docker run -d -p 4567 --name webapp -v $PWD/webapp:/opt/webapp huangzelin/sinatra
    
    

    看一下他的映射端口:

    root@DESKTOP-3JK8RKR:/data/docker_test/sinatra# docker ps |grep  webapp
    c4da61b1d6fa        huangzelin/sinatra   "/opt/webapp/bin/web…"   7 minutes ago       Up 7 minutes        0.0.0.0:32768->4567/tcp   webapp
    
    
    image-20201202084206977

    是通的,作者这个小程序有个路由,是post到/json的。

      post '/json/?' do
        params.to_json
      end
    
    

    也确实是生效的。

    image-20201202084538252

    启动redis

    老规矩,新起一个redis目录写Dockerfile

    mkdir redis && cd redis
    vim Dockerfile
    
    
    FROM ubuntu
    LABEL maintainer="huangzelin@example.com"
    ENV REFRESHED_AT 2014-06-01
    
    RUN apt-get -qq update && apt-get -qq install redis-server redis-tools
    
    EXPOSE 6379
    
    ENTRYPOINT ["/usr/bin/redis-server" ]
    CMD []
    
    

    启动

    docker run -d -p 6379 --name redis huangzelin/redis
    
    

    安装一个redis-tools,看看能不能连上redis

    apt-get -y install redis-tools
    
    

    看看redis被映射到哪里了。

    docker ps |grep redis
    
    

    连接

    redis-cli -h 127.0.0.1 -p XXXXX
    
    

    除此此外,连接redis还可以通过docker的网卡去连接。

    ip a show docker0
    
    

    可以看到这个网卡的信息,容器要访问外网,首先一跳就需要跳到这个网卡上才能连接外网,但是通过iptable限制了只有我们填写了-p配置的端口才能被外网访问。

    所以我们也可以通过网卡来访问到对应的地址。

    root@DESKTOP-3JK8RKR:/data/docker_test/redis# docker inspect redis -f '{{ .NetworkSettings.IPAddress}}'
    172.18.0.2
    
    

    查看地址连接。

    redis-cli -h 172.18.0.2 -p 6379
    
    

    但是这两种连接方式,在重启容器之后,地址可能会变的。

    还有一种方式支持容器互联。

    我们把redis容器给删了,重新起一个。

    docker stop redis
    docker rm redis
    docker run -d --name redis huangzelin/redis
    
    

    这次我们没有重新起端口了。

    docker run -p 4567 --name webapp --link redis:db -t -i -v $PWD/webapp:/opt/webapp huangzelin/sinatra /
    bin/bash
    
    

    我们让之前的webapp新构建一个容器(记得docker里面的name不能相同)然后多了一个配置之前没见过,--link,标识了两个容器的父子连接。需要两个参数,一个事实容器名字,另一个是连接后容器的别名。这样只有使用--link标识连接到这个容器才能连接到这个端口,容器的端口不需要对本地宿主机公开。

    进入该容器之后,我们ping一下db

    apt-get install inetutils-ping
    ping db
    
    

    可以看到是ping得通的。

    而且在容器的env里面,还多了一些可以直接使用的连接信息。

    root@4dab1238532d:/# env
    DB_PORT_6379_TCP_ADDR=172.18.0.2
    DB_PORT_6379_TCP=tcp://172.18.0.2:6379
    DB_PORT=tcp://172.18.0.2:6379
    
    

    那么我们的程序代码里就能直接用这些环境变量去实现容器互联了。

    但是我们的redis版本是新版本,在没有指定绑定端口并且没有设置密码的情况下,会启动保护模式,我们启动时加入参数把保护模式去掉。

    docker stop redis
    docker rm redis
    docker run -d --name redis huangzelin/redis --protected-mode no
    
    

    新建webapp_redis,用来启动一个连接redis的应用。

    里面的内容直接在作者的示例代码里面拷贝。

    dockerbook-code/code/5/sinatra/webapp_redis下。

    然后

     docker build -t huangzelin/redis_app .
     docker run -p 4567 --name redis_app --link redis:db -t -v $PWD/webapp_redis:/opt/webapp huangzelin/redis_app
    
    

    再次用postman去发送同样的请求。或者curl

    curl -X POST \
      http://localhost:32768/json \
      -H 'cache-control: no-cache' \
      -H 'content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW' \
      -H 'postman-token: f04598b5-7f81-b75b-4b79-eceee00866eb' \
      -F name=Foo \
      -F status=Bar
    
    

    之后用之前安装过redis的容器去连容器中的redis,就会发现。

    docker run -p 4567 --link redis:db -t -i -v $PWD/webapp:/opt/webapp huangzelin/sinatra /bin/bash
    root@3ce955ae5f46:/# env |grep DB
    DB_PORT_6379_TCP_ADDR=172.18.0.2
    root@3ce955ae5f46:/# redis-cli -h 172.18.0.2 -p 6379
    172.18.0.2:6379> keys *
    1) "params"
    172.18.0.2:6379> get params
    "[{\"name\":\"Foo\",\"status\":\"Bar\"}]"
    172.18.0.2:6379>
    
    

    redis确实是将参数存储起来了。容器有了联动。

    相关文章

      网友评论

        本文标题:第一本docker书-读书笔记 第五章

        本文链接:https://www.haomeiwen.com/subject/jbqfgktx.html