安裝和運行Docker
Docker底層依賴Linux內(nèi)核技術(shù),因此在Window和MacOS上使用的Docker,是由Docker應(yīng)用程序虛擬了一個Linux虛擬機(輕量級),然后將Docker CLI安裝在宿主機上與之交互。
$ docker -v # 查看docker版本,檢查是否安裝成功
Docker version 18.03.1-ce, build 9ee9f40
獲取鏡像
鏡像是Docker容器的基礎(chǔ),想要啟動一個容器需要先創(chuàng)建/獲得它的鏡像。
- 鏡像:
- 可用于創(chuàng)建容器的只讀模版
- 基于分層文件系統(tǒng)構(gòu)建
- 每一層都在其上一層文件系統(tǒng)的基礎(chǔ)上增加或替換部分內(nèi)容
- 鏡像通常包含:
- 一個輕量級的操作系統(tǒng)發(fā)行版
- 相關(guān)依賴
- 單個應(yīng)用或服務(wù)
- 你可以在公有倉庫中找到鏡像(例如:Docker Hub)
- 你也可以打造自己的鏡像:Dockerfile
開始Docker之旅
我們主要使用一個busybox鏡像,它包含了一個基本的Linux操作系統(tǒng)和一些簡單的指令,能幫助我們快速掌握Docker的基礎(chǔ)用法。
Hello Docker
- 拉取鏡像:docker會向注冊過的倉庫(本地或是遠(yuǎn)程)拉取目標(biāo)鏡像
$ docker pull busybox
Using default tag: latest
latest: Pulling from library/busybox
8c5a7da1afbc: Pull complete
Digest: sha256:cb63aa0641a885f54de20f61d152187419e8f6b159ed11a251a09d115fdff9bd
Status: Downloaded newer image for busybox:latest
- 查看鏡像
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest e1ddd7948a1c 35 hours ago 1.16MB
- 啟動容器:并告知容器打印‘Hello Docker’
$ docker run busybox echo "Hello Docker"
Hello Docker
docker run [image] [command]:啟動一個容器并執(zhí)行指定命令
- 啟動交互式容器:打開容器內(nèi)的終端并進行交互
$ docker run -it busybox sh
/ # echo 'Hello Docker'
Hello Docker
- -t:在新容器內(nèi)指定一個偽終端或終端
- -i:允許你對容器內(nèi)的標(biāo)準(zhǔn)輸入(STDIN)進行交互
- 后臺啟動容器,發(fā)送指令給后臺容器
$ docker run -dit busybox
0395c8f9ac04626d96cbef7860af59c1e062490f4e0f311ed94b25e4b18b06b4
$ docker exec 0395c8f9ac04626d96cbef7860af59c1e062490f4e0f311ed94b25e4b18b06b4 echo "Hello Docker"
Hello Docker
$ docker exec -it 0395c8f9ac04626d96cbef7860af59c1e062490f4e0f311ed94b25e4b18b06b4 sh
/ # echo 'Hello Docker'
Hello Docker
docker exec [Container-ID/Name] [command]:向已啟動的容器發(fā)送指定命令
docker run --name [Container-Name] [image]:設(shè)置容器名稱,方便按容器名進行操作
- 查看容器
$ docker ps # 查看運行的容器
$ docker ps -a # 查看所有容器
$ docker images # 查看所有鏡像
$ docker start [Container ID/Name] # 啟動一個已關(guān)閉的容器
$ docker kill [Container ID/Name] # 關(guān)閉一個運行中的容器
$ docker logs [Container ID/Name] # 查看指定容器的log
$ docker rm $(docker ps -a -q) # 刪除所有容器
$ docker rmi $(docker images -q) # 刪除所有鏡像
$ docker rmi $(docker images -f "dangling=true" -q) # 刪除'懸空'的鏡像
- 其他應(yīng)用
Docker Hub中有非常多的鏡像,有Linux各種發(fā)行版的操作系統(tǒng),還有Http Server、數(shù)據(jù)庫等打包好的應(yīng)用。你可以很快的拉取一個MongoDB鏡像,然后在本機上運行容器并提供服務(wù),而不需要進行繁瑣的安裝和環(huán)境配置。
Dockerfile
雖然官方鏡像很多,但我們?nèi)韵M远x我們的容器來提供一些額外功能。例如,我希望啟動容器能自動打印Hello Docker。前面提到Docker的鏡像是通過分層結(jié)構(gòu)存儲的,我們需要在已有的鏡像上新增一層用來支持我們的改動 - Dockerfile。
Dockerfile 是用來描述鏡像構(gòu)建過程中的所有操作,包括基礎(chǔ)鏡像、拉取文件、執(zhí)行指令等。
FROM busybox # 指定鏡像基于哪個基礎(chǔ)鏡像
MAINTAINER author # 設(shè)置該鏡像的作者
ENV version=0.0.1 # 設(shè)置環(huán)境變量
USER ... # 鏡像正在運行時設(shè)置一個UID
WORKDIR ... # 指定RUN、CMD與ENTRYPOINT命令的工作目錄
VOLUME ... | [...,...] # 設(shè)置容器內(nèi)的匿名卷
RUN [...,...] # 在shell或者exec的環(huán)境下執(zhí)行的命令, RUN指令會在新創(chuàng)建的鏡像上添加新的層面, 接下來提交的結(jié)果用在Dockerfile的下一條指令中
ADD source destination # 復(fù)制文件指令
EXPOSE 80 # 指定容器在運行時監(jiān)聽的端口
ENTRYPOINT ["sh"] # 指定容器的啟動程序及參數(shù)
CMD ... # (唯一)容器啟動程序的參數(shù),可以被docker run [IMAGE] [COMMAND]替換
特別說明CMD:
CMD ["executable","param1","param2"]:運行一個可執(zhí)行的文件并提供參數(shù)
CMD ["param1","param2"]:為ENTRYPOINT指定參數(shù)
CMD command param1 param2:以”/bin/sh -c”的方法執(zhí)行的命令
修改鏡像
- 創(chuàng)建Dockerfile:需要完成這個功能,我們只需要在
busybox容器啟動時,默認(rèn)執(zhí)行打印動作即可。
FROM busybox
# 1.
# CMD ["echo","Hello World"] # 僅打印
# 2.
# CMD echo "Hello World" & sh # 打印后自動開啟sh
CMD ["sh","-c","echo 'Hello World' & sh"] # 同上,打印后自動開啟sh
- 生成鏡像
$ docker build -f Dockerfile-1 -t anddd7/busybox:latest .
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM busybox
---> e1ddd7948a1c
Step 2/2 : CMD ["sh","-c","echo 'Hello World' & sh"]
---> Running in 85c38bf6ae46
Removing intermediate container 85c38bf6ae46
---> 1ff726e635ac
Successfully built 1ff726e635ac
Successfully tagged anddd7/busybox:latest
- -f:Dockerfile文件(當(dāng)名稱不是默認(rèn)的Dockerfile時使用)
- -t:鏡像名稱+tag標(biāo)簽
可以看到,build過程中引用/生成了不同的層(包括busybox鏡像和中間層)。使用docker images和docker history進行查看。
- 啟動容器
$ docker run -it anddd7/busybox
Hello World
/ #
Dockerfile實踐
- 保持常見的指令像MAINTAINER以及從上至下更新Dockerfile命令;
- 當(dāng)構(gòu)建鏡像時使用可理解的標(biāo)簽,以便更好地管理鏡像;
- 避免在Dockerfile中映射公有端口;
- CMD與ENTRYPOINT命令請使用數(shù)組語法。
- ...