(二) Docker基本操作

安裝和運行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

  1. 拉取鏡像: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
  1. 查看鏡像
$ docker images
REPOSITORY                                  TAG                 IMAGE ID            CREATED             SIZE
busybox                                     latest              e1ddd7948a1c        35 hours ago        1.16MB
  1. 啟動容器:并告知容器打印‘Hello Docker’
$ docker run busybox echo "Hello Docker"
Hello Docker

docker run [image] [command]:啟動一個容器并執(zhí)行指定命令

  1. 啟動交互式容器:打開容器內(nèi)的終端并進行交互
$ docker run -it busybox sh
/ # echo 'Hello Docker'
Hello Docker
  • -t:在新容器內(nèi)指定一個偽終端或終端
  • -i:允許你對容器內(nèi)的標(biāo)準(zhǔn)輸入(STDIN)進行交互
  1. 后臺啟動容器,發(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è)置容器名稱,方便按容器名進行操作

  1. 查看容器
$ 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) # 刪除'懸空'的鏡像
  1. 其他應(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í)行的命令

修改鏡像

  1. 創(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
  1. 生成鏡像
$ 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 imagesdocker history進行查看。
  1. 啟動容器
$ docker run -it anddd7/busybox
Hello World
/ #

Dockerfile實踐

  • 保持常見的指令像MAINTAINER以及從上至下更新Dockerfile命令;
  • 當(dāng)構(gòu)建鏡像時使用可理解的標(biāo)簽,以便更好地管理鏡像;
  • 避免在Dockerfile中映射公有端口;
  • CMD與ENTRYPOINT命令請使用數(shù)組語法。
  • ...
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容