Docker的簡單使用(不全)

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鏡像使用

  1. 管理和使用本地Docker主機鏡像

  2. 創建鏡像

列出鏡像
?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鏡像倉庫中下載的鏡像不能滿足我們的需求是,我們可以通過以下兩種方式對鏡像進行更改。

  1. 從已經創建的容器中更新鏡像,并且提交這個鏡像

  2. 使用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

FROMRUN指令作用

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檢查間隔時間(支持 smh 單位)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,故只簡單列舉幾個

文章參考:菜鳥編程

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/81392.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/81392.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/81392.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SALOME源碼分析: 命令系統

本文分析SALOME中命令系統&#xff0c;涉及的知識點包括&#xff0c; MDF框架數據對象模型 注1&#xff1a;限于研究水平&#xff0c;分析難免不當&#xff0c;歡迎批評指正。注2&#xff1a;文章內容會不定期更新。 一、命令對象 1.1 Class Hierarchy 1.2 SUIT_Operation #…

Bootstrap(自助法)??:無需假設分布的統計推斷工具

核心思想?? Bootstrap 是一種??重采樣&#xff08;Resampling&#xff09;技術??&#xff0c;通過在原始數據中??有放回地重復抽樣??&#xff0c;生成大量新樣本集&#xff0c;用于估計統計量&#xff08;如均值、方差&#xff09;的分布或模型性能的不確定性。 ??…

沙箱逃逸(Python沙盒逃逸深度解析)

沙箱逃逸&#xff08;Python沙盒逃逸深度解析&#xff09; 一、沙盒逃逸的核心目標 執行系統命令 通過調用os.system、subprocess.Popen等函數執行Shell命令&#xff0c;例如讀取文件或反彈Shell。 文件操作 讀取敏感文件&#xff08;如/etc/passwd&#xff09;、寫入后門文件…

融智學數學符號體系的系統解讀(之一)

融智學數學符號體系的系統解讀 一、道函數&#xff08;Dao Function&#xff09; 數學表達式&#xff1a; f(x,y,z)0&#xff08;狹義&#xff09; f(x,y,z,ict)0&#xff08;廣義&#xff09; 符號解析&#xff1a; x: 形象思維坐標軸 數學意義: 表征基于感官輸入的多模…

Java 中使用正則表達式

1. 引入包 在使用正則表達式之前,需要引入包: import java.util.regex.Matcher; import java.util.regex.Pattern; 2. 常用模式規則 元字符 :這些是正則表達式中的特殊字符,用于匹配特定的模式。 . :匹配任意單個字符(換行符除外)。例如,a.b 可以匹配 "acb&quo…

cat file.tar.gz | tar -xzf - -C /target/dir兩個減號之間為什么有個空格?是寫錯了嗎?(管道命令后續)

在 tar 命令的參數 -xzf - -C 中&#xff0c;兩個減號&#xff08;-&#xff09;之間的空格是故意保留的語法&#xff0c;沒有寫錯。具體原因如下&#xff1a; 1. -xzf - 的語法解析 -xzf 是 tar 命令的組合參數&#xff1a; x&#xff1a;表示解壓&#xff08;extract&#x…

Linux中的系統延時任務和定時任務與時間同步服務和構建時間同步服務器

延時任務 在系統中我們的維護工作大多數時在服務器行對閑置時進行 我們需要用延遲任務來解決自動進行的一次性的維護 延遲任務時一次性的&#xff0c;不會重復執行 當延遲任務產生輸出后&#xff0c;這些輸出會以郵件的形式發送給延遲任務發起者 在RHEL9中默認系統中的所有普通…

C++之IO流

目錄 一、C語言的輸入與輸出 二、流是什么 三、CIO流 3.1、C標準IO流 3.2、C文件IO流 四、stringstream的簡單介紹 一、C語言的輸入與輸出 C語言中我們用到的最頻繁的輸入輸出方式就是scanf ()與printf()。 scanf(): 從標準輸入設備(鍵盤)讀取數據&#xff0c;并將值存放…

Fedora升級Google Chrome出現GPG check FAILED問題解決辦法

https://dl.google.com/linux/linux_signing_key.pub 的 GPG 公鑰(0x7FAC5991)已安裝 https://dl.google.com/linux/linux_signing_key.pub 的 GPG 公鑰(0xD38B4796)已安裝 倉庫 "google-chrome" 的 GPG 公鑰已安裝&#xff0c;但是不適用于此軟件包。 請檢查此倉庫的…

極光PDF編輯器:高效編輯,輕松管理PDF文檔

在日常工作和學習中&#xff0c;PDF文件的使用越來越普遍。無論是學術論文、工作報告還是電子書籍&#xff0c;PDF格式因其穩定性和兼容性而被廣泛采用。然而&#xff0c;編輯PDF文件往往比編輯Word文檔更加復雜。今天&#xff0c;我們要介紹的 極光PDF編輯器&#xff0c;就是這…

MySQL進階(一)

一、存儲引擎 1. MySQL體系結構 連接層&#xff1a; 最上層是一些客戶端和鏈接服務&#xff0c;主要完成一些類似于連接處理、授權認證、及相關的安全方案。服務器也會為安全接入的每個客戶端驗證它所具有的操作權限 服務層&#xff1a; 第二層架構主要完成大多數的核心服務…

OpenCV 圖形API(67)圖像與通道拼接函數-----水平拼接(橫向連接)兩個輸入矩陣(GMat 類型)函數concatHor()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 該函數用于水平拼接兩個 GMat 矩陣&#xff0c;要求輸入矩陣的行數必須一致: GMat A { 1, 4,2, 5,3, 6 }; GMat B { 7, 10,8, 11,9, 12 }; GM…

1.1 點云數據獲取方式——引言

圖1-1-1點云建筑場景圖 點云數據是指能夠描述外部場景、對象表面的三維空間位置&#xff0c;并具有相關屬性的點集&#xff0c;其每個離散點通常包括三維空間位置&#xff08;x,y,z&#xff09;以及強度、顏色等屬性信息。大量分布的離散點集能夠清晰而直接地描繪場景、對象的3…

[Verilog]跨時鐘域數據傳輸解決方案

跨時鐘域數據傳輸解決方案 摘要:跨時鐘域數據傳輸 (Clock Domain Crossing, CDC) 是 SoC 設計中常見且關鍵的問題,因為現代 SoC 通常包含多個時鐘域,不同模塊可能運行在不同頻率或相位的時鐘下。跨時鐘域傳輸數據時,如果處理不當,可能會導致亞穩態 (Metastability)…

Kotlin與Jetpack Compose的詳細使用指南

Kotlin與Jetpack Compose的詳細使用指南&#xff0c;綜合最新技術實踐和官方文檔整理&#xff1a; 一、環境配置與基礎架構 ?項目創建? 在Android Studio中選擇Empty Compose Activity模板&#xff0c;默認生成包含Composable預覽的MainActivity2要求Kotlin版本≥1.8.0&…

預訂接口優化:使用本地消息表保證訂單生成、庫存扣減的一致性

&#x1f3af; 本文介紹了一種優化預訂接口的方法&#xff0c;通過引入本地消息表解決分布式事務中的最終一致性問題。原先的實現是在一個事務中同時扣減庫存和創建訂單&#xff0c;容易因網絡不穩定導致數據不一致。改進后的方法將業務操作和消息發送封裝在本地事務中&#xf…

計算機網絡——客戶端/服務端,URI與URL的區別,以及TCP/IP核心機制全解析

文章目錄 客戶端/服務端&#xff0c;URI與URL的區別&#xff0c;以及TCP/IP核心機制全解析一、客戶端/服務端通信模型概述二、URI 與 URL 的概念與區別1. URL&#xff08;統一資源定位符&#xff09;2. URI&#xff08;統一資源標識符&#xff09;3. URI 與 URL 的關系 三、SYN…

柔性PZT壓電薄膜多維力傳感器在微創手術機器人的應用

隨著醫療技術的迅速發展&#xff0c;微創手術機器人正在成為外科手術的重要助手。與傳統開放式手術相比&#xff0c;微創手術創傷小、恢復快、感染率低&#xff0c;對手術器械的精細操控性和感知能力提出了更高要求。多維力傳感器作為機器人“觸覺”的核心部件&#xff0c;對提…

SpringAI整合DeepSeek生成圖表

利用Spring-ai-openai集成DeepSeek ①、在DeepSeek開放平臺創建API KEY ②、創建springboot項目&#xff0c;引入spring-ai-openai依賴&#xff0c;創建配置文件&#xff0c;配置deepseek的url和api key ③、具體的實現業務應用 RestController public class ChatD…

xss-lab靶場基礎詳解第1~3關

第一關 我去&#xff0c;還是得多學基礎啊 http://127.0.0.1/xss-labs/level1.php?name<u>a</u> 這個看他的網站源碼&#xff0c;可以看到他沒有過濾&#xff0c;沒有被編碼 然后在name<script>alert(1)</script>&#xff0c;就算過關了 第二關 …