1. 程式人生 > 其它 >Docker 筆記(5)

Docker 筆記(5)

Docker 筆記(5)

dockerfile 構建

USER / WORKDIR 指令

cd /data/
mkdir dockerfile
cd dockerfile/
vi Dockerfile # 命令全大寫,引數小寫
FROM 7ing/nginx:curl  # 源映象
USER nginx # 主程序使用者名稱
WORKDIR /usr/share/nginx/html # 工作目錄
# . 指的構建本目錄下的
[root@localhost docker]# docker build . -t 7ing/nginx:workdir
Sending build context to Docker daemon 2.048 kB
Step 1/3 : FROM 7ing/nginx:curl
 ---> b3e0205e14f5
Step 2/3 : USER nginx
 ---> Running in f978a2c43200
 ---> b766fa7efdf6
Removing intermediate container f978a2c43200
Step 3/3 : WORKDIR /usr/share/nginx/html
 ---> d3cc110734f6
Removing intermediate container c2cdbb20531d
Successfully built d3cc110734f6
[root@localhost docker]# docker run --rm -ti --name nginx123 7ing/nginx:workdir /bin/bash
nginx@d9687da6f719:/usr/share/nginx/html$ whoami
nginx
nginx@d9687da6f719:/usr/share/nginx/html$ pwd
/usr/share/nginx/html
nginx@d9687da6f719:/usr/share/nginx/html$ 

ADD / EXPOSE 指令

[root@localhost docker]# vim Dockerfile
FROM 7ing/nginx:curl
ADD index.html /usr/share/nginx/html/index.html # 將本目錄下的html檔案拷貝到容器的某個地方
EXPOSE 80
[root@localhost docker]# docker build . -t 7ing/nginx:expose
[root@localhost docker]# docker run --rm -it --name nginx234 -P 7ing/nginx:expose /bin/bash # -P 是隨機分配一個埠
root@77146d9c9362:/# whoami
root # 預設使用者root
root@77146d9c9362:/# pwd
/ # 預設目錄是根
root@77146d9c9362:/# nginx -g "daemon off";
[root@localhost html]# netstat -luntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name              
tcp6       0      0 :::32768                :::*                    LISTEN      14604/docker-proxy-

RUN / ENV 指令

[root@localhost docker]# vim Dockerfile
FROM centos:7
ENV ver 9.11.4  # 設定環境變數
RUN yum install bind-$VER -y # 在構建映象的時候,執行可執行命令
[root@localhost docker]# docker build . -t 7ing/nginx:env
[root@localhost docker]# docker run -it --rm 7ing/nginx:env /bin/bash
cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
printenv
VER=9.11.4

CMD / ENTRYPOINT 指令

[root@localhost docker]# vim Dockerfile
FROM centos:7
RUN yum install httpd -y
CMD ["httpd","-D","FOREGROUND"]
[root@localhost docker]# docker build . -t 7ing/nginx:httpd
[root@localhost docker]# docker run -it --rm 7ing/nginx:env /bin/bash
# 進入網頁192.168.111.134:83 可以看到Apache啟動頁面

[root@localhost docker]# vim Dockerfile
FROM centos:7
ADD entrypoint.sh /entrypoint.sh
RUN yum install epel-release -q -y && yum install nginx -y
ENTRYPOINT /entrypoint/sh
[root@localhost docker]# vim entrypoint.sh
#!/bin/bash
/sbin/nginx -g "daemon off;"
# 一定要給執行許可權
[root@localhost docker]# chmod +x entrypoint.sh
[root@localhost docker]# docker build . -t 7ing/nginx:entry
[root@localhost docker]# docker run --rm -p 84:80 7ing/nginx:entry
[root@localhost html]# docker exec -ti heuristic_nightingale /bin/bash
[root@8b4aca3bb2f2 /]# cat /entrypoint.sh 
#!/bin/bash
/sbin/nginx -g "daemon off;"
[root@8b4aca3bb2f2 /]# ls -l /entrypoint.sh 
-rwxr-xr-x. 1 root root 41 Jul 21 07:42 /entrypoint.sh

​ 在執行時可以指定新的命令來替代映象設定中的這個預設命令,比如,ubuntu 映象預設的 CMD/bin/bash,如果我們直接 docker run -it ubuntu 的話,會直接進入 bash。我們也可以在執行時指定執行別的命令,如 docker run -it ubuntu cat /etc/os-release。這就是用 cat /etc/os-release 命令替換了預設的 /bin/bash 命令了,輸出了系統版本資訊。

ENTRYPOINT 的目的和 CMD 一樣,都是在指定容器啟動程式及引數。ENTRYPOINT 在執行時也可以替代,不過比 CMD 要略顯繁瑣,需要通過 docker run 的引數 --entrypoint 來指定。

當指定了 ENTRYPOINT 後,CMD 的含義就發生了改變,不再是直接的執行其命令,而是將 CMD 的內容作為引數傳給 ENTRYPOINT 指令

綜合實驗

[root@localhost docker]# vim Dockerfile
FROM 7ing/nginx:curl
USER root
ENV WWW /usr/share/nginx/html
ENV CONF /etc/nginx/conf.d
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\
	echo ' Asia/Shanghai' >/etc/timezone
WORKDIR $WWW
ADD index.html $WWW/index.html
ADD demo.od.com.conf $CONF/demo.od.com.conf
EXPOSE 80
CMD["nginx" ,"-g" , "daemon off;"]
[root@localhost docker]# vim demo.od.com.conf
server {
	listen 80;
	server_name demo.od.com;
	
	root /usr/share/nginx/html;
}
[root@localhost docker]# docker build . -t 7ing/nginx:baidu
[root@localhost docker]# docker run --rm -p 80:80 7ing/nginx:baidu
# 開啟執行,輸入drivers,開啟/etc/hosts,新增
192.168.111.134 demo.od.com
# 開啟demo.od.com 即可

Docker的網路模型

NAT

None

Host

聯合網路

docker run -ti --rm --name lhwl2 --net=container:原容器ID 7ing/nginx:curl啟動容器 /bin/bash

​ 共享網路名稱空間