最近在把伺服器上的應用盡量docker化,踩了不少坑……不過也正好學習docker
和docker-compose
的用法。此篇文章記錄docker常用命令、使用方法,用於備忘。
主要是dockerfile
和docker-compose.yml
兩個檔案,這倆的關係,簡單的講:
映象一般只生成一次,而容器則可以啟動多個。
用於生成docker映象的配置檔案,簡單講就是初始化映象用的,比如拷貝檔案到映象、執行命令、暴露埠、設定使用者等等。
生成映象的常用命令如下:
$ docker build -t name:tag path
docker build [options] path | url | -乙個通過
-t
指定映象名/版本
path
為dockerfile所在的目錄
dockerfile
大致長這個亞子:
from ubuntu
run useradd -m ctf
workdir /home/ctf
copy ./start.sh /start.sh
run chmod +x /start.sh
cmd ["/start.sh"]
user ctf
expose 9999
基本的書寫格式就是:指令+操作
使用指令不多,列張**好了:dockerfile
生成映象,就是對原始映象逐步執行dockerfile
中指令
指令操作(例子)
功能from
from ubuntu:16.04
指定初始映象
workdir
workdir /home/taqini
切換工作目錄
user
user taqini
切換預設使用者
argarg code_version=latest
定義變數
envenv dalao=imagin
定義環境變數
copy
copy test /opt/test/
拷貝檔案至映象
runadduser taqini
執行系統命令
expose
expose 80/tcp
曝露埠
cmdcmd ["start.sh"]
啟動時執行命令
enterpoint
entrypoint ["entrypoint.sh"]
指定啟動時的入口點
指定初始映象( base image
),寫法有三種
from [as ]
from [:] [as ]
from [@] [as ]
一般直接from image:tag
就行
相當於cd
,用於切換工作目錄,例如:
workdir /dir
最後乙個workdir
指定的路徑將作為docker啟動的預設路徑
切換到指定使用者,一般指定使用者名稱或是uid
:
user taqini
user 1001
預設使用者是root用於定義臨時變數,例如:
arg code_version=latest
from base:$
設定環境變數,有兩種格式:
env env =...
使用等於號可以同時設定多個環境變數從本地複製檔案到映象,格式為
copy 本地檔案 目標映象檔案
copy test relativedir/ # adds "test" to `workdir`/relativedir/
copy test /absolutedir/ # adds "test" to /absolutedir/
拷貝時可以使用相對路徑,前提是已經通過workdir
指定了工作目錄
copy的同時修改檔案所有者:
copy --chown=user:group files* /somedir/
run就是執行系統命令,有兩種格式:
shell格式相當於把run
後的command
依次作為/bin/sh -c
的引數(子命令)exec格式則是直接執行括號中的命令
exec 格式使用的是json
陣列,所以只能用雙引號,不能用單引號!
一般使用第一種,例子:
run apt-get update
執行命令的預設使用者是root第二種格式很麻煩,因為它不會呼叫shell,所以環境變數什麼的就不會起作用,比如:
run [ "echo", "$home" ]
上面的用法是錯的,正確的用法應該是:
run [ "sh", "-c", "echo $home" ]
很麻煩是叭 _(:з」∠)配置曝露的埠
expose [/...]
例如:
expose 80/tcp
曝露的埠用於在docker啟動時作埠對映,比如將docker的有三種寫法:80
埠對映到伺服器的8080
埠:docker run -p 80:80/tcp ...
cmd指定的命令/指令碼會在映象啟動時執行,是可執行容器預設的執行命令。
乙個dockerfile中只能有乙個cmd指令,如果存在多個,則只有最後乙個生效映象啟動後的入口點。
和cmd不同,entrypoint先執行。
比如entrypoint指定了乙個啟動指令碼:
entrypoint ["entrypoint.sh"]
在映象啟動後,只會執行這個指令碼的內容(即使dockerfile
中有cmd指令)。
但是cmd指令也是有用處的,比如這樣:
cmd ["2333"]
entrypoint ["echo"]
執行映象的結果是:
2333
也就是說,如果之前有cmd指令,cmd指令的運算元其實是用作entrypoint的引數的。
如果不指定entrypoint,cmd的運算元就會被全部用作entrypoint的引數感覺沒說明白……文章末尾有參考文章,講的十分清楚(´•灬•『)所以看起來的效果就是預設執行了cmd
給映象新增標籤(沒啥用)
label version="1.0"
label description="this text illustrates \
that label-values can span multiple lines."
和copy
差不多,但貌似只能在linux下用,不提了。
用於建立映象內的掛載點,例如:
volume ["/data"]
感覺沒啥用,一般操作是在docker-compose
裡直接設定掛載點的資訊
官方| docker documentation
csdn|【docker】cmd entrypoint 區別 終極解讀!
Dock命令總結
1,停止所有容器 docker stop docker ps a q 2,刪除所有容器 docker rm docker ps a q 3,檢視所有容器的id docker ps a q 其中docker ps 列出容器,a 顯示所有的容器,包括未執行的,q 靜默模式,只顯示容器編號 4,刪除本地乙...
docker學習 centos安裝docker
1.更新yum源 yum update2.安裝依賴 3.設定yum源 使用ustc,也可以使用阿里雲的 yum config manager add repo4.安裝docker yum install y docker ce通過docker v檢視,如果檢視到版本號,說明安裝成功 5.設定ustc...
在linux建立docker,執行docker容器
安裝 1.依次執行以下命令新增yum源。yum update yum install epel release y yum clean all yum list2.安裝並執行docker。yum install docker io y systemctl start docker3.檢查安裝結果.d...