Dockerfile

Dockerfile

dockerfile主要組成部分

1.建立一個全部項目的目錄html

2.建立項目名稱java

3.編輯dockerfile文件(必須是dockerfile,默認識別的)
FROM :初始來自於哪一個基礎系統鏡像 如: FROM centos:6.9
RUN: 須要運行的命令,能夠有多個run 如: RUN yum install openssh-server -y
CMD:初始構建的命令,須要【 】括起來 如: CMD ["/bin/bash"]mysql

FROM  這個鏡像的媽媽是誰?(指定基礎鏡像)
 
MAINTAINER 告訴別人,誰負責養它?(指定維護者信息,能夠沒有)
 
LABLE      描述,標籤
 
RUN 你想讓它幹啥(在命令前面加上RUN便可)
 
ADD 給它點創業資金(會自動解壓tar)  製做docker基礎的系統鏡像
 
WORKDIR 我是cd,今天剛化了妝(設置當前工做目錄)
 
VOLUME 持久化,給它一個存放行李的地方(設置卷,掛載主機目錄),很重要,將目錄後面新增的文件(好比說用戶上傳的文件等)保持下來。設置好了以後,啓動容器後,會隨機生成一個數據卷
 
EXPOSE 它要打開的門是啥(指定對外的端口)(-P 隨機端口),默認指定,好比 EXPOSE 80 22 意思是隨機跳轉80 和22,每次隨機指定的時候,都會爲這2個指定,docker ps --no-trunc 查看所有內容
 
CMD 奔跑吧,兄弟!(指定容器啓動後的要乾的事情)(容易被替換)
 
dockerfile其餘指令: 
 
COPY 複製文件(不會解壓)rootfs.tar.gz
 
ENV  環境變量,在docker run --ENV 「NAME=123」 --ENV 「NAME1=1234」 外部受權變量NAME,能夠簡寫成-e
 
在dockerfile裏面也能夠傳參,可是優先級低。 
ENV NAME1=1234 將參數傳進去
 
ENTRYPOINT  容器啓動後執行的命令(沒法被替換,啓容器的時候指定的命令,會被當成參數),寫一個腳本就不會被影響。/bin/bash 1.sh

持久化的應用linux

VOLUME 持久化,給它一個存放行李的地方(設置卷,掛載主機目錄),很重要,將目錄後面新增的文件(好比說用戶上傳的文件等)保持下來。設置好了以後,啓動容器後,會隨機生成一個卷
使用docker inspect 容器名|grep -i volume |grep -i source,能夠看到目錄文件
 
docker inspect 8302ee4bc9a9|grep -i volume #能夠根據查看到的目錄改動數據卷,能夠直接改動數據
改動以後能夠直接查看到網站內容的變化
 
當容器損壞後,從新啓動一個容器
docker run -d -p 80:80 --volumes-from xiaoniao2(損壞的容器名) xiaoniao:v2
 
[root@oldboy _data]# docker run -d -p 82:80 --volumes-from 8302ee4bc9a9 xiaoniao:v7

原理

1.將dockerfile發送給docker服務端nginx

2.加載FROM指定的鏡像web

3.執行RUN的命令,啓動一個臨時的容器,運行RUN指定的命令,因此每一個RUN都是啓動一個臨時容器,而後提交,刪除多餘的,再建立再提交,造成一個最終鏡像.sql

這個時候每次啓動一個容器,都會初始化hosts文件,因此無法作hosts劫持。docker

這個時候加入 --network=host,意思爲使用宿主機網絡,若是宿主機有hosts劫持,那麼速度就快樂centos

4.CMD 指定執行的初始命令緩存

製做dockerfile的流程

1.手動製做一個鏡像,文檔一步一步整理好,方便dockfile調用

這個步驟和手動製做鏡像同樣
  1. 根據文檔來編寫dockfile

舉個栗子:

FROM centos:6.9  #指定基礎目錄
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
RUN yum install nginx unzip -y
WORKDIR /usr/share/nginx/html   #工做目錄設定在/usr/share/nginx/html,不能使用cd,命令,這和RUN的原理有關
 
ADD xiaoniao .     #把xiaoniao文件夾下的文件,覆蓋到當前目錄下(上條命令的workdir中,不會拷貝目錄自己)
 
#ADD xiaoniao /usr/share/nginx/html 和上面2條命令是同樣的,注意:xiaoniao文件夾要放在項目目錄下,還能夠自動解壓tar包到目錄下,自動覆蓋
 
EXPOSE 80 22  #若是沒有指定端口映射,自動給這個兩個分配
ENV NAME=123  #設置環境變量,固然能夠在命令行-e 指定  
 
CMD ["nginx","-g","daemon off;"]

3.使用dockerfile命令來建立鏡像

[root@oldboy nginx]# docker image build --network=host -t centos_nginx:v2 /root/dockerfile/nginx
 
# 後面路徑要指定到docker當前的目錄,系統會自動識別,-t爲指定鏡像姓名
# --network=host

4.測試鏡像

[root@oldboy nginx]# docker run -d -p 80:80 centos_nginx:v2
1.查看CMD命令有沒有寫錯,能不能夯住
要點:分開的命令須要使用「 」,空格替換成, 之前的‘’ 總體命令,換成「 」
 
#須要將sysctl內核轉發打開

docker鏡像的分層(dockerfile的書寫規範)

鏡像分層的好處:複用,節省磁盤空間,相同的內容只需加載一份到內存。 修改dockerfile以後,再次構建速度快
 
dockerfile 優化:
 
1:儘量選擇體積小linux,alpine
 
2:儘量合併RUN指令,清理無用的文件(yum緩存,源碼包)
 
3:修改dockerfile,把變化的內容儘量放在dockerfile結尾
 
4: 使用.dockerignore,減小沒必要要的文件ADD . /html
#啓動運行鏡像(最好定義名稱,爲下面的主機引用提供方便)
docker run -d -p 80:80 nginx
#啓動第2個鏡像,link到第一個鏡像,得到了第一個容器的ip地址(指向爲web01)
docker run -it --link quirky_brown:web01 qstack/centos-ssh /bin/bash
#直接ping web01,能夠獲取到第一個容器的ip
ping 
 
應用實列:
 
#1.獲取鏡像包(作出的鏡像)
 
docker-mysql-5.7.tar.gz  
zabbix-java-gateway.tar.gz  
zabbix-server-mysql.tar.gz  
zabbix-web-nginx-mysql.tar.gz
 
#2.執行命令
docker run --name mysql-server -t \
      -e MYSQL_DATABASE="zabbix" \
      -e MYSQL_USER="zabbix" \
      -e MYSQL_PASSWORD="zabbix_pwd" \
      -e MYSQL_ROOT_PASSWORD="root_pwd" \
      -d mysql:5.7 \
      --character-set-server=utf8 --collation-server=utf8_bin
 
docker run --name zabbix-java-gateway -t \
      -d zabbix/zabbix-java-gateway:latest
 
docker run --name zabbix-server-mysql -t \
      -e DB_SERVER_HOST="mysql-server" \
      -e MYSQL_DATABASE="zabbix" \
      -e MYSQL_USER="zabbix" \
      -e MYSQL_PASSWORD="zabbix_pwd" \
      -e MYSQL_ROOT_PASSWORD="root_pwd" \
      -e ZBX_JAVAGATEWAY="zabbix-java-gateway" \
      --link mysql-server:mysql \
      --link zabbix-java-gateway:zabbix-java-gateway \
      -p 10051:10051 \
      -d zabbix/zabbix-server-mysql:latest
 
docker run --name zabbix-web-nginx-mysql -t \
      -e DB_SERVER_HOST="mysql-server" \
      -e MYSQL_DATABASE="zabbix" \
      -e MYSQL_USER="zabbix" \
      -e MYSQL_PASSWORD="zabbix_pwd" \
      -e MYSQL_ROOT_PASSWORD="root_pwd" \
      --link mysql-server:mysql \
      --link zabbix-server-mysql:zabbix-server \
      -p 80:80 \
      -d zabbix/zabbix-web-nginx-mysql:latest

docker的私有倉庫

當有幾百臺宿主機,須要到官方的倉庫docker hub上拉取,那麼每臺機器都須要使用帶寬拉。
那麼當有一臺單獨拉好以後,將它創建成私有倉庫,其餘的宿主機都到這上面來拉取,節省帶寬。

首先從官方上面將鏡像拉下來

docker pull registry (或者本地下載了,直接load )

倉庫服務封裝成了鏡像

docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry registry #將/opt/myregistry 做爲倉庫
 
--restart=always docker服務啓動,容器本身啓動

爲本地registry倉庫加上basic認證(密碼)

爲了倉庫的安全性,可使用basic認證的方式

#安裝basic,加密

yum install httpd-tools -y 


#建立密碼目錄

mkdir /opt/registry-var/auth/ -p

#將帳號密碼加密後放入指定密碼文件

htpasswd -Bbn girl 123456 >> /opt/registry-var/auth/htpasswd

 
#運行registry倉庫,以帶密碼的方式

docker run -d -p 5000:5000 --restart=always -v /opt/registry-var/auth/:/auth/ -v /opt/myregistry:/var/lib/registry -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" registry 

 
#設置好了之後,每次上傳或者下載須要先登陸

 
docker login 10.0.0.11:5000 (會提示輸出帳號和密碼,若是不帶後面的ip,是登陸官網)
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息