Docker Hello World
Docker 允許在容器內運行應用程序,使用docker run命令來在容器內運行一個應用程序
輸出Hello World
?runoob@runoob:~$ docker run ubuntu:15.10 /bin/echo "Hello world"Hello world
docker:Docker的二進制執行文件
run:與前邊的docker組合來運行一個容器
ubuntu:15.10 指定要運行的鏡像,Docker 首先從本地主機上查找鏡像是否存在,如果不存在,Docker 就會從鏡像倉庫 Docker Hub 下載公共鏡像。
/bin/echo "Hello world": 在啟動的容器里執行的命令
運行交互式容器
可以通過docker的兩個參數-i,-t,讓docker運行的容器實現"對話"的能力
?runoob@runoob:~$ docker run -i -t ubuntu:15.10 /bin/bashroot@0123ce188bd8:/#
-
-t
:在新容器內指定一個偽終端或終端 -
-i
:允許對容器內的標準輸入進行交互
啟動容器(后臺模式)
以進程方式運行的容器
? C:\Users\liuch> docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"cf4a5520318cc5dd7a8b54cb3a4186c3fb166c317622958060c05cb69e9388d8 #容器ID
docker ps
確認容器狀態
-
容器 ID:容器的唯一標識符。
-
鏡像名稱:容器基于的鏡像。
-
啟動命令:容器啟動時執行的命令。
-
創建時間:容器的創建時間。
-
狀態:容器的運行狀態(如
Up 2 hours
表示已運行 2 小時)。 -
端口映射:容器端口與宿主機端口的綁定關系。
-
容器名稱:容器的自定義名稱(若未指定,Docker 會隨機生成)。
docker logs [容器ID/名稱]
查看容器內的標準輸出
停止容器
docker stop [容器ID/名稱]
Docker 容器使用
容器使用
獲取鏡像
?docker pull ubuntu
啟動容器
?docker run -it ubuntu /bin/bash
-
/bin/bash:放在鏡像后的是命令,這里我們希望有個交互式Shell,因此用的是/bin/bash
退出終端:exit
啟動已停止的容器
查看所有的容器命令如下:
?$ docker ps -a
使用docker start啟動一個已停止的容器:
?docker start <容器 ID>
后臺運行
在大部分的場景下,我們希望docker的服務是在后臺運行的,我們可以通過-d
指定容器的運行模式。
?docker run -itd --name ubuntu-test ubuntu /bin/bash
-d
:以分離模式(Detached Mode)運行容器。
停止一個容器
?docker stop <容器ID>
停止的容器可以通過docker restart重啟
?docker restart <容器ID>
進入容器
在使用-d
參數時啟動容器時,容器會運行在后臺,這時如果要進入容器,可以通過以下命令進入:
-
docker attach <容器ID>:允許你與容器的標準輸入(stdin)、輸出(stdout)和標準錯誤(stderr)進行交互,如果從這個容器退出(exit),會導致容器的停止
-
docker exec :推薦大家使用docker exec命令,因為此命令會退出容器終端,但不會導致容器的停止
exec
?docker exec -it <容器ID> /bin/bash
注意:如果從這個容器退出,容器不會停止,推薦使用這個
docker exec --help
查看命令幫助
導出和導入容器
導出容器
?docker export <容器ID> > ubuntu.tar
導入容器
?# 這個在本機windows11下不知道為什么運行不起來cat ubuntu.tar | docker import - test/ubuntu:v1?docker import http://example.com/exampleimage.tgz example/imagerepo?docker import xxx.tar base_mes:1.1# 其中xxx.tar為目標文件,base_mes:1.1是目標鏡像名:tag
-
的含義
-
-
是 Unix/Linux 命令行中的通用占位符,通常表示:-
標準輸入(stdin):當作為輸入參數時(如
docker import -
)。 -
標準輸出(stdout):當作為輸出參數時(如
tar -cvf - files/ > backup.tar
)。
-
-
在此命令中,
-
明確告訴 Docker 從管道接收數據(即cat ubuntu.tar
的輸出內容)。
刪除容器
刪除容器使用docker rm命令:
docker rm -f <容器ID>
清除所有處于終止狀態的容器:
?docker container prune
Docker鏡像使用
管理和使用本地Docker主機鏡像
創建鏡像
列出鏡像
?docker images
各個選項說明:
-
REPOSITORY:表示鏡像的倉庫源
-
TAG:鏡像的標簽
-
IMAGE ID:鏡像ID
-
CREATED:鏡像創建時間
-
SIZE:鏡像大小
同一鏡像源有多個TAG,代表這個倉庫源的不同個版本,如ubuntu倉庫源里,有15.10、14.04等多個不同的版本,我們使用REPOSITORY:TAG來定義不同的鏡像
如果不指定一個鏡像的版本標簽,例如只使用ubuntu,docker將默認使用ubuntu:lastest鏡像
獲取一個新的鏡像
當我們在本地主機上使用一個不存在的鏡像時Docker就會自動下載這個鏡像。如果我們想預先下載這個鏡像,我們可以使用docker pull命令來下載它
?docker pull ubuntu:13.10
查找鏡像
?docker search <鏡像>
NAME:鏡像倉庫源的名稱
DESCRIPTION:鏡像的描述
OFFICIAL:是否docker官方發布
stars:類似Github里邊的star
AUTOMATED:自動構建
拖取鏡像
?docker pull <鏡像>
刪除鏡像
?docker rmi hello-world
創建鏡像
當我們從docker鏡像倉庫中下載的鏡像不能滿足我們的需求是,我們可以通過以下兩種方式對鏡像進行更改。
-
從已經創建的容器中更新鏡像,并且提交這個鏡像
-
使用Dockerfile指令來創建一個新的鏡像
更新鏡像
eg:比如更新ubuntu系統
?apt-get updateapt-get upgrade -y
提交副本
?docker commit -m="has update" -a='dabidai' <容器ID> 指定要創建的目標容器名
-
-m
:提交的描述信息 -
-a
:指定鏡像作者
構建鏡像
使用命令docker build
,從零開始來創建一個新的鏡像。為此,需要創建一個Dockerfile文件,其中包含一組指令來告訴Docker如何構建我們的鏡像
?FROM ? centos:7 #使用6.7會報錯LABEL maintainer="Liuch <liuch@sudops.com>"?RUN ? ? /bin/echo 'root:123456' | chpasswdRUN ? ? useradd dabidaiRUN ? ? /bin/echo 'dabidai:123456' | chpasswdRUN ? ? /bin/echo -e "LANG=\"en_US.UTF-8\"" > /etc/default/localEXPOSE 22EXPOSE 80CMD ? ? /usr/sbin/sshd -D?
每一個指令都會在鏡像上創建一個新的層,每一個指令的前綴都必須是大寫的
FROM:指定使用哪個鏡像源
RUN:高速docker在鏡像內執行命令
使用docker build命令來構建一個鏡像
? docker build -t dabidai/centos:7 "D:\dockerLearn\"
-
-t
:指定要創建的目標鏡像名 -
"D:\dockerLearn\"
:Dockerfile文件所在目錄,可以指定Dockerfile的絕對路徑
注意:最后一個指定Dockerfile的位置時,使用的是Dockerfile所在的路徑,不包括Dockerfile這個文件
設置鏡像標簽
?docker tag <容器ID> <鏡像源名>:<標簽名>
eg:
?docker tag 97d7b96cc00a dabidai/centos:dev
Docker容器連接
容器中可以運行一些網絡應用,要讓外部也可以訪問這些應用,可以通過-P
或-p
參數來指定端口映射
網絡端口映射
使用deepseek生成一個簡易FlaskApp
?docker run -d -P app python app.pydocker run -d -p 5000:5000 app python app.py
-
-P(大寫)
:是容器內部端口隨機映射到主機的端口,可使用docker ps查看綁定端口 -
-p(小寫)
:是容器內部端口綁定到指定的主機端口
可以指定容器綁定的網絡地址,比如綁定127.0.0.1
?docker run -d -p 127.0.0.1:5001:5000 app python app.py
上述綁定的都是TCP端口,如果要綁定UDP端口,可在端口后加上/udp
?docker run -d -p 127.0.0.1:5000:5000/udp app python app.py
docker port命令可以讓我們快捷查看端口的綁定情況
?docker port <容器ID/names> 5000
Docker容器互聯
端口映射并不是唯一把docker連接到另一個容器的方法。
docker有一個連接系統允許將多個容器連接在一起,共享連接信息
docker連接會創建一個父子關系,其中父容器可以看到子容器的信息。
容器命名
當我們創建一個容器的時候,docker會自動對它進行命名。另外,我們也可以使用--name
標識來命名容器,例如:
?docker run -d -P --name rename_app app python app.py
新建網絡
創建一個新的Docker網絡
?docker network create -d bridge test-net
參數:
-d
:參數指定Docker網絡類型,有bridge、overlay
連接容器
運行一個容器并連接到新建的test-net網絡:
?docker run -itd --name test1 --network test-net ubuntu /bin/bash
同理,再運行一個容器并加入到test-net網絡:
?docker run -itd --name test2 --network test-net ubuntu /bin/bash
如果多個容器之間需要互相連接,推薦使用Docker Compose,后邊會介紹
配置DNS
我們可以在宿主機的/etc/docker/daemon.json文件中增加以下內容來設置全部的容器的DNS:
?{"dns" : ["114.114.114.114","8.8.8.8"]}
設置后,啟動容器的DNS會自動配置為114.114.114.114和8.8.8.8
配置完,需要重啟docker才能生效。
查看容器的DNS是否生效可以使用以下命令,它會輸出容器的DNS信息:
?$ docker run -it --rm ?ubuntu ?cat etc/resolv.conf
手動指定容器的配置
如果只想在指定的容器設置DNS,則可以使用以下命令:
?$ docker run -it --rm -h host_ubuntu ?--dns=114.114.114.114 --dns-search=test.com ubuntu
參數說明:
--rm
:容器退出時自動清理容器內部的文件系統
-h HOSTNAME 或者 --hostname=HOSTNAME
:設定容器的主機名,它會被寫入到容器內的/etc/hostname和/etc/hosts
--dns=IP_ADDRESS
:添加DNS服務器到容器的/etc/resolv.conf中,讓容器用這個服務器來解析所有不再/etc/hosts中的主機名
--dns-search=DOMAIN
:設定容器的搜索域,當設定搜索域為.example.com時,在搜索一個名為host的主機時,DNS不僅搜索host,還會搜索host.example.com
Docker倉庫管理
倉庫是集中存放鏡像的地方。
Docker Hub
目前Docker官方維護了一個公共倉庫Docker Hub
大部分需求都可以通過在Docker Hub中直接下載鏡像來實現
注冊
在DockerHub官網免費注冊一個 Docker 賬號。
登錄
登錄和退出需要輸入用戶名和密碼,登陸成功后,我們就可以從docker hub上拉去自己賬號下的全部鏡像。
?docker login
退出
?docker logout
拉取鏡像
可以通過docker search命令來查找官方倉庫中的鏡像,并利用docker pull命令來將它下載到本地。
?docker search ubuntu
使用docker pull將官方ubuntu鏡像下載到本地
?docker pull ubuntu
推送鏡像
用戶登錄后,可以通過docker push命令將自己的鏡像推送到Docker Hub。
?docker tag ubuntu:18.04 username/ubuntu:18.04docker push username/ubuntu:18.04
查看
?docker search username/ubuntu
Dockerfile
什么是Dockerfile?
Dockerfile是一個文本文件,包含了構建Docker鏡像的所有指令。
Dockerfile是一個用來構建鏡像的文本文件,文件內容包含了一條條構建鏡像所需的指令和說明。
通過定義一系列命令和參數,Dockerfile指導Docker構建一個自定義的鏡像。
使用Dockerfile定制鏡像
定制一個nginx鏡像
(構建好的鏡像內會有一個(/user/share/nginx/html/index.html)
-
在一個空目錄下,新建一個名為Dockerfile文件,并在文件內添加以下內容:
-
?FROM nginxRUN echo '這是一個本地構建的nginx鏡像' > /usr/share/nginx/html/index.html
FROM和RUN指令作用
FROM:定制的鏡像都是基于FROM的鏡像,這里的nginx就是定制需要的基礎鏡像。后續的操作都是基于nginx。
RUN:用于執行后面跟著的命令行命令。有兩種格式:
shell格式:
?RUN <命令行命令># <命令行命令>等同于在終端操作的shell命令。
exec格式:
?RUN ["可執行文件", "參數1", "參數2"]# 例如:# RUN ["./test.php", "dev", "offline"]等價于RUN ./test.php dev offline
注意:Dockerfile的指令每執行一次都會在docker上新建一層。所以過多無意義的層,會造成鏡像膨脹過大。例如:
?FROM centosRUN yum -y install wgetRUN wget -O redis.tar.gz "http://download.redis.io/release/redis-5.0.3.tar.gz"RUN tar -xvf redis.tar.gz
以上執行會創建3層鏡像。可簡化為以下格式:
?FROM centosRUN yum -y install wget \&& wget -O redis.tar.gz "http://download.redis.io/release/redis-5.0.3.tar.gz" \&& tar -xvf redis.tar.gz
如上,以&&符號連接命令,這樣執行后,只會創建一層鏡像。
開始構建鏡像
在Dockerfile文件的存放目錄下,執行構建動作。
以下示例,通過目錄下的Dockerfile構建一個nginx:v3(鏡像名稱:鏡像標簽)。
?docker build -t nginx:v3 .
最后的.
代表本次執行的上下文路徑
上下文路徑,是指docker在構建鏡像,有時候想要使用到本機的文件(比如復制),docker build命令得知這個路徑后,會將路徑下的所有內容打包。
解析:由于docker的運行模式是C/S。我們本機是C,docker引擎是S。實際的構建過程是在docker引擎下完成的,所以這個時候無法用到我們本機的文件。這就需要把我們本機指定目錄下的文件一起打包提供給docker引擎使用。如果未說明最后一個參數,那么默認上下文路徑就是Dockerfile所在的位置。
注意:上下文路徑下不要放無用的文件,因為會一起打包發送給docker引擎,如果文件過多會造成過程緩慢。
指令詳解
Dockerfile 指令 | 說明 |
---|---|
FROM | 指定基礎鏡像,用于后續的指令構建。 |
MAINTAINER | 指定Dockerfile的作者/維護者。(已棄用,推薦使用LABEL指令) |
LABEL | 添加鏡像的元數據,使用鍵值對的形式。 |
RUN | 在構建過程中在鏡像中執行命令。 |
CMD | 指定容器創建時的默認命令。(可以被覆蓋) |
ENTRYPOINT | 設置容器創建時的主要命令。(不可被覆蓋) |
EXPOSE | 聲明容器運行時監聽的特定網絡端口。 |
ENV | 在容器內部設置環境變量。 |
ADD | 將文件、目錄或遠程URL復制到鏡像中。 |
COPY | 將文件或目錄復制到鏡像中。 |
VOLUME | 為容器創建掛載點或聲明卷。 |
WORKDIR | 設置后續指令的工作目錄。 |
USER | 指定后續指令的用戶上下文。 |
ARG | 定義在構建過程中傳遞給構建器的變量,可使用 "docker build" 命令設置。 |
ONBUILD | 當該鏡像被用作另一個構建過程的基礎時,添加觸發器。 |
STOPSIGNAL | 設置發送給容器以退出的系統調用信號。 |
HEALTHCHECK | 定義周期性檢查容器健康狀態的命令。 |
SHELL | 覆蓋Docker中默認的shell,用于RUN、CMD和ENTRYPOINT指令。 |
COPY
復制指令,從上下文目錄中復制文件或者目錄到容器里指定路徑。
格式:
?COPY [--chown=<user>:<group>] <源路徑1>... <目標路徑>COPY [--chown=<user>:<group>] ["<源路徑1>",... "<目標路徑>"]
[--chown=<user>:<group>]
:可選參數,用戶改變復制到容器內文件的擁有者和屬組。
<源路徑>
:源文件或者源目錄,這里可以是通配符表達式,其通配符規則要滿足Go的filepath.Match規則。例如:
?COPY hom* /mydir/COPY hom?.txt /mydir/
<目標路徑>
:容器內的指定路徑,該路徑不用事先建好,路徑不存在的話,會自動創建。
ADD
ADD指令和COPY的使用類似(同樣需求,推薦使用COPY)。功能也類似,不同之處如下:
-
優點:在執行<源文件>為tar壓縮文件的話,壓縮格式為gzip,bzip2以及xz的情況下,會自動復制并解壓到<目標路徑>
-
缺點:在不解壓的前提下,無法復制tar壓縮文件。會令鏡像構建緩存失效,從而可能會令鏡像構建變得緩慢。可根據是否需要自動解壓來決定是否使用
CMD
類似于RUN指令,用于運行程序,但二者運行的時間點不同:
-
CMD在docker run時運行
-
RUN是在docker build
作用:為啟動的容器指定默認要運行的程序,程序運行結束,容器也就結束。CMD指令指定的程序可被docker run命令行參數中指定要運行的程序所覆蓋。
注意:如果Dockerfile中存在多個CMD,僅最后一個生效。
格式:
?# Shell格式CMD <shell命令># exec格式CMD ["<可執行文件或命令>", "<param1>", "<param2>", ...]?CMD ["<param1>", "<param2>", ...] #該寫法是為ENTRYPOINT指令指定的程序提供默認參數
推薦使用第二種格式,執行過程比較明確。第一種格式實際上在運行的過程中也會自動轉化成第二種格式運行,并且默認可執行文件是sh。
ENTRYPOINT
類似于CMD指令,但其不會被docker run的命令行參數指定的指令所覆蓋,而且這些命令行參數會被當作參數送給ENTRYPOINT指令指定的程序。
但是,如果運行docker run時使用了--entrypoint選項,將覆蓋ENTRYPOINT指令指定的程序。
優點:在執行docker run的時候可以指定ENTRYPOINT運行所需的參數
注意:如果Dockerfile中如果存在多個ENTRYPOINT指令,進最后一個生效
格式:
?ENTRYPOINT ["<execute>", "<param1>", "<param2>", ..]
可以搭配CMD命令使用:一般是變參才會使用CMD,這里的CMD等于是在給ENTRYPOINT傳參
eg:
假設已通過Dockerfile構建了nginx:test鏡像:
?FROM nginxENTRYPOINT ["nginx", "-c"] # 定參CMD ["/etc/nginx/nginx.conf"] # 變參
不傳參執行:
?docker run nignx:test
容器內會默認運行以下命令,啟動主進程。
?nginx -c /etc/nginx/nginx.conf
傳參運行
?docker run nginx:test -c /etc/nginx/new.conf
容器內會默認運行以下命令,啟動主進程(/etc/nginx/new.conf:假設容器內已有此文件)
?nginx -c /etc/nignx/new.conf
ENV
設置環境變量,定義了環境變量,那么在后續的指令中,就可以使用這個環境變量。
?ENV <key> <value>ENV <key1>=<value1> <key2>=<value2>...
下示例設置NODE_VERSION=7.2.0
,在后續的指令中可以通過$NODE_VERSION
引用:
?ENV NODE_VERSION 7.2.0?RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \&& curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc"
ARG
構建參數,與ENV作用一致。不過作用域不一樣。ARG設置的環境變量僅對Dockerfile內有效,也就是說只有docker build的過程有效,構建好的鏡像內不存在此環境變量。
構建命令docker build
中可以用--build-arg <參數名>=<值>
來覆蓋。
?ARG <參數名>[=<默認值>]
VOLUME
定義匿名數據卷。在啟動容器時忘記掛載數據卷,會自動掛載到匿名卷。
作用:
-
避免重要的數據,因容器重啟而丟失,這是非常致命的。
-
避免容器不斷變大
格式:
?VOLUMN ["<路徑1>", "<路徑2>"...]VOLUMN <路徑>
在啟動容器docker run的時候,我們可以通過-v參數修改掛載點。
EXPOSE
僅僅只是聲明端口。
作用:
-
幫助鏡像使用者理解這個鏡像服務的守護端口,以方便配置映射。
-
在運行時使用隨機端口映射時,也就是docker run -P時,會自動隨機映射EXPOSE的端口。
格式:
?EXPOSE <端口1> [<端口2>...]
WORKDIR
指定工作目錄。用WORKDIR指定的工作目錄,會在構建鏡像的每一層中都存在。以后各層的當前目錄就被改為指定的目錄,如該目錄不存在,WORKDIR會幫你建立目錄。
docker build構建鏡像過程中的每一個RUN命令都是新建的一層。只有通過WORKDIR創建的目錄才會一直存在。
格式:
?WORKDIR <工作目錄>
USER
用于指定執行后續命令的用戶和用戶組,這邊只是切換后續命令執行的用戶(用戶和用戶組必須提前已經存在)。
格式:
?USER <用戶名>[:<用戶組>]
HEALTHCHECK
用于指定某個程序或者指令來監控docker容器服務的運行狀態。
格式:
?HEALTHCHECK [選項] CMD <命令>:設置檢查容器健康狀況的命令HEALTHCHECK NONE:如果基礎鏡像有健康檢查指令,使用這行可以屏蔽掉其健康檢查指令
CMD 后的命令會在容器內執行,返回值決定健康狀態:
-
0(成功):容器標記為
healthy
。 -
1(失敗):容器標記為
unhealthy
。
選項 | 描述 | 默認值 |
---|---|---|
--interval | 檢查間隔時間(支持 s 、m 、h 單位) | 30s |
--timeout | 單次檢查超時時間,超時視為失敗 | 30s |
--start-period | 容器啟動后的初始化時間,此期間內的失敗不計入重試次數(Docker 17.05+) | 0s |
--retries | 連續失敗指定次數后標記為不健康 | 3 |
?HEALTHCHECK --interval=1m --timeout=10s --start-period=30s --retries=3 \CMD curl -f http://localhost/health || exit 1
-
每1分鐘檢查一次,超時10秒。
-
容器啟動后等待30秒開始檢查。
-
連續3次失敗則標記為不健康。
-
使用
curl
檢測/health
端點,失敗返回1。
ONBUILD
用于延遲構建命令的執行。簡單地說,就是Dockerfile里用ONBUILD指定的命令,在本次構建鏡像的過程中不會執行(假設鏡像為test-build)。當有新的Dockerfile使用了之前構建的鏡像FROM test-build,這時執行新鏡像的Dockerfile構建的時候,會執行test-build的Dockerfile里的ONBUILD指定的命令。
格式:
?ONBUILD <其它指令>
LABEL
LABEL指令用來給鏡像添加一些原數組(metadata),以鍵值對的形式,語法如下:
?LABEL <key>=<value> <key>=<value> ...
eg:
?LABEL org.opencontainers.image.authors="runoob"
Docker Compose
Compose簡介
Compose適用于定義和運行多容器Docker應用程序的工具。通過Compose,您可以使用YML文件來配置應用程序需要的所有服務。然后,使用一個命令,就可以從YML文件中創建并啟動所有服務。
Compose使用步驟:
-
使用Dockerfile定義應用程序的環境
-
使用docker-compose.yml定義構成應用程序的服務,這樣它們可以在隔離環境中一起運行
-
最后,執行docker-compose up命令來啟動并運行整個應用程序
使用
準備
創建一個測試目錄
在測試目錄中創建一個名為app.py的文件
?import time?import redisfrom flask import Flask?app = Flask(__name__)cache = redis.Redis(host='redis', port=6379)??def get_hit_count():retries = 5while True:try:return cache.incr('hits')except redis.exceptions.ConnectionError as exc:if retries == 0:raise excretries -= 1time.sleep(0.5)??@app.route('/')def hello():count = get_hit_count()return 'Hello World! I have been seen {} times.\n'.format(count)
在此實例中,redis是應用程序網絡上的redis容器的主機名,該主機使用的端口為6379。
創建另一個名為requirements.txt文件,內容如下:
?flaskredis
創建Dockerfile文件
內容如下:
?FROM python:3.7-alpineWORKDIR /codeENV FLASK_APP app.pyENV FLASK_RUN_HOST 0.0.0.0RUN apk add --no-cache gcc musl-dev linux-headersCOPY requirements.txt requirements.txtRUN pip install -r requirements.txtCOPY . .CMD ["flask", "run"]
FROM python:3.7-alpine
:從Python 3.7映像開始構建鏡像。
WORKDIR /code
:將工作目錄設置為/code
?ENV FLASK_APP app.pyENV FLASK_RUN_HOST 0.0.0.0
設置flask命令使用的環境變量
RUN apk add --no-cache gcc musl-dev linux-headers
:安裝gcc,以便諸如MarkupSafe和SQLAlchemy之類的Python包可以編譯加速
?COPY requirements.txt requirements.txtRUN pip install -r requirements.txt
復制requirements.txt并安裝Python依賴項
COPY . .
:將.
項目中的當前目錄復制到.
鏡像中的工作目錄。
CMD ["flask", "run"]
:容器提供默認的執行命令為:flask run。
創建docker-compose.yml
在測試目錄中創建一個名為docker-compose.yml的文件,然后粘貼以下內容:
?# yaml 配置version: '3'services:web:build: .ports:- "5000:5000"redis:image: "redis:alpine"
該Compose文件定義了兩個服務:web和redis。
web
:該web服務使用從Dockerfile當前目錄中構建的鏡像。然后,它將容器和主機綁定到暴露的端口5000。此示例服務使用Flask Web服務器的默認端口5000。
redis
:該redis服務使用Docker Hub的公共Redis映像。
使用Compose命令構建和運行應用
在測試目錄中,執行以下命令來啟動應用程序:
?docker-compose up
如果你想在后臺執行該服務可以加上-d
參數
?docker-compose up -d
yaml配置指令參考
version
指定本yml依賴于compose哪個版本
例如weba服務,指定為從上下文路徑./dir/Dockerfile
所構建的鏡像:
?version: "3.7"services:webapp:build: ./dir
或者,作為具有在上下文指定的路徑的對象,以及可選的Dockerfile和args:
?version: "3.7"services:webapp:build:context: ./dirdockerfile: Dockerfile-alternateargs:buildno: 1labels:- "com.example.description=Accounting webapp"- "com.example.department=Finance"- "com.example.label-with-empty-value"target: prod
context
:上下文路徑
dockerfile
:指定構建鏡像的Dockerfile文件名
args
:添加構建參數,這是只能在構建過程中訪問的環境變量。
labels
:設置構建鏡像的標簽。
target
:多層構建,可以指定構建哪一層
cap_add, cap_drop
添加或刪除容器擁有的宿主機的內核功能。
?cap_add:- ALL # 開啟全部權限cap_drop:- SYS_PTRACE #關閉ptrace權限
cgroup_parent
為容器指定父cgroup組,意味著將繼承該組的資源限制。
?cgroup_parent: m-executor-abcd
command
覆蓋容器啟動的默認命令。
?command: ["bundle", "exec", "thin", "-p", "3000"]
container_name
?container_name: my-web-container
depends_on
設置依賴關系
docker-compose up
:以依賴性順序啟動服務。在以下實例中,先啟動db和redis,才會啟動web。
docker-compose up SERVICE
:自動包含SERVICE的依賴項。在以下實例中,docker-compose up web還將創建并啟動db和redis。
docker-compose stop
:按依賴關系順序停止服務。在以下實例中,web在db和redis之前停止
?version: "3.7"services:web:build: .depends_on:- db- redisredis:image: redisdb:image: postgres
注意:web服務不會等待redis db完全啟動后才啟動。
由于筆者還未完全熟練使用dockerfile,故只簡單列舉幾個
文章參考:菜鳥編程