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

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

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确实是将参数存储起来了。容器有了联动。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容