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 指定執行的初始命令緩存
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內核轉發打開
鏡像分層的好處:複用,節省磁盤空間,相同的內容只需加載一份到內存。 修改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 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服務啓動,容器本身啓動
爲了倉庫的安全性,可使用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,是登陸官網)