一、鏡像制作的方法
1、本地導入導出鏡像
導出命令
這里默認是把文件導出到當前運行shell的位置,后面跟的是導出路徑和文件名
docker save (imageId) > (fileName).tar
導入命令
后面跟的是導出文件的位置
docker load < (fileName).tar
2、docker commit 命令創建鏡像副本
下載一個centos鏡像
docker pull 鏡像名
例如:
docker pull centos
使用docker commit 來提交容器副本 -m 提交時的描述文字
dock commit -m 容器 鏡像名
例如:
docker commit -m centosid centos
或
docker commit -m 'add centos images' centosid centos
#提交當前容器到鏡像: docker commit <容器ID> <NAME:VERSION>
制作好的鏡像可以上傳官網(需要注冊賬號)
docker login
docker tag 鏡像id Dockerhub用戶名/倉庫名/鏡像名 #打標簽
docker push Dockerhub用戶名/倉庫名/鏡像名 #推送
二、docker file方法制作鏡像
1、什么是docker file
用來全自動構建鏡像文件,命名為Dockerfile
2、Dockerfile 文件編寫指令及語法
vi Dockerfile #編輯Dockerfile文件指令
FROM
MAINTAINER
RUN
CMD
EXPOSE
ENV
ADD
COPY
ENTRYPOINT
VOLUME
USER
WORKDIR
ONBUILD
3、語法
1、FROM <image>
例子:FROM centos
FROM指定構建鏡像的基礎源鏡像,如果本地沒有指定的鏡像,則會自動從Docker的公共庫pull鏡像下來。
FROM必須是Dockerfile中非注釋行的第一個指令,即一個Dockerfile從FROM語句開始
FROM可以在一個DOCKERfile中出現多次,如果有需求在一個Dockerfile中創建多個鏡像
2、MAINTAINER <name>
例子:MAINTAINER zxg zhutoyearn@163.com
指定創建鏡像的用戶
3、RUN <"executable","parm1","param2">
兩種使用方式:
RUN
RUN "executable", "param1", "param2"
例子:RUN yum install wget -y
每條RUN指令將在當前鏡像基礎上執行指定命令,並提交為新的鏡像,后續的RUN都在之前RUN提交后的鏡像為基礎,鏡像是分層的,可以通過一個鏡像的任何一個歷史提交點來創建,類似源碼的 版本控制 。
exec 方式會被解析為一個 JSON 數組,所以必須使用雙引號而不是單引號。exec 方式不會調用一個命令 shell,所以也就不會繼承相應的變量,如:
RUN [ "echo", "$HOME" ] #錯誤,這個個方法不會輸出HOME變量,下面為正確方式
RUN [ "sh", "-c", "echo", "$HOME" ]
RUN 產生的緩存在下一次構建的適合是不會失效的,會被重用,可以使用--no-cache選擇,即docker build-no-cache,如此便不會緩存
4、CMD <"executable",>
三種使用方式:
CMD "executable","param1","param2"
CMD "param1","param2"
CMD command param1 param2 (shell form)
例子:CMD["nginx"]
CMD指定在 Dockerfile 中只能使用一次,如果有多個,則只有最后一個會生效。
CMD的目的是為了在啟動容器時提供一個默認的命令執行選項。如果用戶啟動容器時指定了運行的命令,則會覆蓋掉CMD指定的命令。
CMD會在啟動容器的時候執行,build 時不執行,而RUN只是在構建鏡像的時候執行,后續鏡像構建完成之后,啟動容器就與RUN無關了,這個初學者容易弄混這個概念,這里簡單注解一下。
5、EXPOSE <port>[<port>...]
告訴docker服務端容器對外映射的本地端口,需要在docker run的使用使用-p或者-P選項生效
例子:EXPOSE 80
6、ENV
ENV <key> <value>
ENV <key>=<value>。。。
指定一個環節變量,會被后續RUN指令使用,並在容器運行時保留
例子:ENV myname zxg
ENV myhome beijing
ENV myname="zxg" myhome=beijing
7、ADD
ADD <src>...<dest>
ADD復制本地主機文件、目錄或者遠程文件URLS從並且添加到容器指定路徑中
支持通過Go的正則模式匹配,具體規則可參見Go filepath.Match
例子:ADD hom* /mydir/ #adds all files starting with ”hom“
ADD hom?.txt /mydir/ #?is replaced with any single character
ADD index.html /usr/share/nginx/html/index.html
注意如下:
路徑必須是絕對路徑,如果 不存在,會自動創建對應目錄
路徑必須是 Dockerfile 所在路徑的相對路徑
如果是一個目錄,只會復制目錄下的內容,而目錄本身則不會被復制
8、COPY
COPY <src>...<dest>
COPY復制新文件或者目錄並且添加到容器指定路徑中,用法和ADD相同,唯一區別時不能指定遠程文件URLS。
9、ENTRYPOINT
ENTRYPOINT "executable","param1","param2"
ENTRYPOINT command param1 param2(shell form)
配置容器啟動后執行的命令,並且不可被 docker run 提供的參數覆蓋,而CMD是可以被覆蓋的。如果需要覆蓋,則可以使用docker run --entrypoint選項。
每個 Dockerfile 中只能有一個ENTRYPOINT,當指定多個時,只有最后一個生效。
Exec form ENTRYPOINT 例子
通過ENTRYPOINT使用 exec form 方式設置穩定的默認命令和選項,而使用CMD添加默認之外經常被改動的選項。
FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"]
通過 Dockerfile 使用ENTRYPOINT展示前台運行 Apache 服務
FROM debian:stable
RUN apt-get update && apt-get install -y --force-yes apache2
EXPOSE 80 443
VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"]
ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]
Shell form ENTRYPOINT 例子
這種方式會在/bin/sh -c中執行,會忽略任何CMD或者docker run命令行選項,為了確保docker stop能夠停止長時間運行ENTRYPOINT的容器,確保執行的時候使用exec選項。
FROM ubuntu
ENTRYPOINT exec top -b
如果在ENTRYPOINT忘記使用exec選項,則可以使用CMD補上:
FROM ubuntu
ENTRYPOINT top -b
CMD --ignored-param1 # --ignored-param2 ... --ignored-param3 ... 依此類推
10、VOLUME
VOLUME ["/data"]
創建一個可以從本地主機或其他容器掛載的掛載點,后續具體介紹
11、USER
USER daemon
指定運行容器時的用戶名或UID,后續RUN、CMD、ENTERPOINT也會使用指定用戶
12、WORKDIR
WORKDIR /path/to/workdir
為后續的RUN、CMD、ENTRYPOINT指令配置工作目錄。可以使用多個WORKDIR指令,后續命令如果參數是相對路徑,則會基於之前命令指定的路徑
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
最終路徑是/a/b/c
WORKDIR指令可以在ENV設置變量之后調用環境變量:
ENV DIRPATH /path
WORKDIR $DIRPATH/$DIRNAME
最終路徑則為 /path/$DIRNAME
13、ONBUILD
ONBUILD [INSTRUCTION]
配置當所創建的鏡像作為其他新創建鏡像的基礎鏡像時,所執行的操作指令
例如:Dockerfile 使用如下的內容創建了鏡像image-A:
[...]
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dri /app/src
[...]
4、使用build命令制作鏡像
打包鏡像 docker build 路徑 -it 鏡像名:版本號
例如:
sudo docker build . -t centos-lhq:1.0
三、Docker常用命令
#1.查看鏡像
sudo docker images
#2.啟動鏡像
sudo docker run -it -p 端口:8000(映射端口) 鏡像id /bin/bash
例如:
sudo docker run -it -p 8000:8000 751a8f9dda48 /bin/bash
#3.查看容器
sudo docker ps -all
#4.進入容器
sudo docker exec -it 容器id /bin/bash
#5.停止容器
docker stop <容器ID>
#6.將外部文件拷貝到docker容器中
例如:
#將主機/www/runoob目錄拷貝到容器96f7f14e99ab的/www目錄下。
sudo docker cp /www/runoob 96f7f14e99ab:/www/
#7.擴展
#導入sql文件
mysql -uroot -p密碼 #進入mysql
use database; #使用數據庫
使用source 命令
例如:
source /root/StaticAnalyzer_so_and_sdk.sql; 導入sql文件