這一章的主要內(nèi)容都是在執(zhí)行命令撒踪。我們也重點(diǎn)把命令整理出來(lái),執(zhí)行一遍大渤,看看效果練練手制妄。
cd /data/docker_test/
mkdir sample
cd sample/
touch Dockerfile
vim Dockerfile
dockerfile 里面的內(nèi)容
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;
}
構(gòu)建鏡像
sudo docker build -t huangzelin/nginx .
創(chuàng)建卷目錄,并寫(xiě)入網(wǎng)頁(yè)內(nèi)容
mkdir website && cd website
vim index.html
<head>
<title>Test website</title>
</head>
<body>
<h1>This is a yahaha website</h1>
</body>
運(yùn)行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
修改卷目錄下面的代碼泵三。
<head>
<title>Test website</title>
</head>
<body>
<h1>This is a yahaha website</h1>
</body>
對(duì)應(yīng)內(nèi)容也會(huì)馬上生效忍捡。
構(gòu)建一個(gè)web應(yīng)用程序
創(chuàng)建一個(gè)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轉(zhuǎn)成國(guó)內(nèi)的鏡像源,不然太慢了切黔。
然后創(chuàng)建webapp目錄砸脊。這下面是作者寫(xiě)的一個(gè)ruby程序。
可以去這里拿
給作者的程序增加可運(yùn)行權(quán)限纬霞。
chmod +x webapp/bin/webapp
然后開(kāi)始build鏡像凌埂。
docker build -t huangzelin/sinatra .
啟動(dòng)
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
是通的,作者這個(gè)小程序有個(gè)路由诗芜,是post到/json的瞳抓。
post '/json/?' do
params.to_json
end
也確實(shí)是生效的。
啟動(dòng)redis
老規(guī)矩伏恐,新起一個(gè)redis目錄寫(xiě)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 []
啟動(dòng)
docker run -d -p 6379 --name redis huangzelin/redis
安裝一個(gè)redis-tools孩哑,看看能不能連上redis
apt-get -y install redis-tools
看看redis被映射到哪里了。
docker ps |grep redis
連接
redis-cli -h 127.0.0.1 -p XXXXX
除此此外翠桦,連接redis還可以通過(guò)docker的網(wǎng)卡去連接横蜒。
ip a show docker0
可以看到這個(gè)網(wǎng)卡的信息胳蛮,容器要訪問(wèn)外網(wǎng),首先一跳就需要跳到這個(gè)網(wǎng)卡上才能連接外網(wǎng)丛晌,但是通過(guò)iptable限制了只有我們填寫(xiě)了-p配置的端口才能被外網(wǎng)訪問(wèn)仅炊。
所以我們也可以通過(guò)網(wǎng)卡來(lái)訪問(wèn)到對(duì)應(yīng)的地址。
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
但是這兩種連接方式抚垄,在重啟容器之后,地址可能會(huì)變的谋逻。
還有一種方式支持容器互聯(lián)呆馁。
我們把redis容器給刪了,重新起一個(gè)毁兆。
docker stop redis
docker rm redis
docker run -d --name redis huangzelin/redis
這次我們沒(méi)有重新起端口了浙滤。
docker run -p 4567 --name webapp --link redis:db -t -i -v $PWD/webapp:/opt/webapp huangzelin/sinatra /
bin/bash
我們讓之前的webapp新構(gòu)建一個(gè)容器(記得docker里面的name不能相同)然后多了一個(gè)配置之前沒(méi)見(jiàn)過(guò),--link荧恍,標(biāo)識(shí)了兩個(gè)容器的父子連接瓷叫。需要兩個(gè)參數(shù)屯吊,一個(gè)事實(shí)容器名字送巡,另一個(gè)是連接后容器的別名。這樣只有使用--link標(biāo)識(shí)連接到這個(gè)容器才能連接到這個(gè)端口盒卸,容器的端口不需要對(duì)本地宿主機(jī)公開(kāi)骗爆。
進(jìn)入該容器之后,我們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
那么我們的程序代碼里就能直接用這些環(huán)境變量去實(shí)現(xiàn)容器互聯(lián)了犀呼。
但是我們的redis版本是新版本,在沒(méi)有指定綁定端口并且沒(méi)有設(shè)置密碼的情況下薇组,會(huì)啟動(dòng)保護(hù)模式外臂,我們啟動(dòng)時(shí)加入?yún)?shù)把保護(hù)模式去掉。
docker stop redis
docker rm redis
docker run -d --name redis huangzelin/redis --protected-mode no
新建webapp_redis律胀,用來(lái)啟動(dòng)一個(gè)連接redis的應(yīng)用宋光。
里面的內(nèi)容直接在作者的示例代碼里面拷貝。
在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去發(fā)送同樣的請(qǐng)求罪佳。或者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
之后用之前安裝過(guò)redis的容器去連容器中的redis黑低,就會(huì)發(fā)現(xiàn)赘艳。
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確實(shí)是將參數(shù)存儲(chǔ)起來(lái)了。容器有了聯(lián)動(dòng)。