最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Dockerfile和docker-compose使用詳解

 更新時(shí)間:2024年11月06日 11:18:24   作者:LKIDTI數(shù)據(jù)  
Dockerfile用于構(gòu)建鏡像,包含指令和說(shuō)明,使用FROM開(kāi)始構(gòu)建,WORKDIR設(shè)置工作目錄,RUN執(zhí)行命令,COPY拷貝文件,EXPOSE暴露端口,CMD指定容器啟動(dòng)命令,docker-compose用于管理多容器,通過(guò)docker-compose.yml配置,支持多服務(wù)實(shí)例,可設(shè)定服務(wù)依賴和環(huán)境變量,支持掛載卷

Dockerfile和docker-compose詳解

一、Dockerfile

1. Dockerfile簡(jiǎn)介

Dockerfile是一個(gè)用來(lái)構(gòu)建鏡像的文本文件, 文本內(nèi)容包含了一條條構(gòu)建鏡像所需的指令和說(shuō)明。

例如我們要在含python3的centos鏡像基礎(chǔ)上安裝vim,可以這么寫(xiě)。

FROM centos:python3
RUN yum -y install vim

這里的FROM表示從哪個(gè)鏡像開(kāi)始構(gòu)建,可以是本地已有的鏡像,也可以是dockerhub或者私域的鏡像。

2. 構(gòu)建鏡像

在Dockerfile文件的存放目錄下, 執(zhí)行構(gòu)建動(dòng)作

# 1. nginx表示鏡像名稱, v3表示版本
# 2. 最后的.表示Dockerfile相對(duì)終端執(zhí)行環(huán)境的相對(duì)路徑
docker build -t centos:python3 .  

3. Dockerfile命令

(1)FROM

定制的鏡像都是基于FROM的鏡像, 后續(xù)的操作都是基于該鏡像做的操作

(2)WORKDIR

官方文檔的說(shuō)明,WORKDIR的作用是為RUN, COPY等指令設(shè)置工作目錄,相當(dāng)于cd到那個(gè)目錄,然后執(zhí)行對(duì)應(yīng)的指令。

如果沒(méi)有設(shè)置WORKDIR,它會(huì)自動(dòng)創(chuàng)建,默認(rèn)是/,如果是從其他鏡像開(kāi)始構(gòu)建的,那么WORKDIR就是其他鏡像。

The WORKDIR instruction sets the working directory for any RUN, CMD, ENTRYPOINT, COPY and ADD instructions that follow it in the Dockerfile. If the WORKDIR doesn’t exist, it will be created even if it’s not used in any subsequent Dockerfile instruction.

WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
輸出就是/a/b/c

(3)RUN

用于執(zhí)行后面跟著的命令行命令

RUN <命令行命令>   # 命令行命令 等同于在終端操作的shell命令

例如前面的

RUN yum -y install vim

注意,在RUN命令中有路徑時(shí),指的是容器外的相對(duì)路徑,而不是容器內(nèi)的路徑,因?yàn)樗藭r(shí)還只是構(gòu)建鏡像。

(4)COPY

將宿主機(jī)的文件拷貝到鏡像中。

由于它是構(gòu)建鏡像時(shí)的命令,因此它會(huì)將文件寫(xiě)入到鏡像中,只要是由該鏡像創(chuàng)建的容器,都會(huì)有拷貝過(guò)去的文件,這是它和掛載的不同。

FROM centos:vim-python3
RUN yum -y install vim
COPY python/ /lkidti/
CMD python3 /lkidti/http_server.py
  • 源路徑src:宿主機(jī)內(nèi)的路徑,是相對(duì)Dockerfile的路徑,不能用絕對(duì)路徑。例如寫(xiě)成/home/lkidti/python,這種寫(xiě)法是不對(duì)的,因?yàn)閐ockerfile會(huì)把它翻譯成 dockerfile路徑+/home/lkidti/python。
  • 目的路徑dest:容器內(nèi)的路徑,用的是絕對(duì)路徑,或者是相對(duì)workdir的路徑。

(5)EXPOSE

暴露端口,這個(gè)命令的作用參見(jiàn)官方文檔。

The EXPOSE instruction does not actually publish the port. It functions as a type of documentation between the person who builds the image and the person who runs the container, about which ports are intended to be published

expose命令的作用并不會(huì)去暴露端口,而是作為構(gòu)建鏡像的開(kāi)發(fā)人員和運(yùn)行容器的開(kāi)發(fā)人員之間一個(gè)“接口文檔”,構(gòu)建鏡像的開(kāi)發(fā)人員告訴運(yùn)行容器的開(kāi)發(fā)人員,該鏡像監(jiān)聽(tīng)哪個(gè)端口。

因?yàn)閷?duì)于運(yùn)行容器的開(kāi)發(fā)人員來(lái)說(shuō),它可能接觸不到源碼,不清楚該鏡像能暴露哪個(gè)端口,expose命令能幫助他了解到。

例如redis鏡像。

[lkidti@hecs-300320 ~]$ docker run -id redis:latest
Unable to find image 'redis:latest' locally
latest: Pulling from library/redis
c7ae2cc6d9d5d2fee1aefbea14014bb42806b45c60b7d6a1cf3313d5367ae895
[lkidti@hecs-300320 ~]$ docker ps
CONTAINER ID   IMAGE          COMMAND                   CREATED         STATUS         PORTS                                                  NAMES
c7ae2cc6d9d5   redis:latest   "docker-entrypoint.s…"   5 seconds ago   Up 3 seconds   6379/tcp                                               awesome_cori

它這里就暴露了6379端口,因此我們需要在運(yùn)行的時(shí)候通過(guò)-p來(lái)做端口映射,來(lái)保證通過(guò)訪問(wèn)宿主機(jī)來(lái)訪問(wèn)容器。

(6)CMD

在鏡像構(gòu)建好后,用鏡像啟動(dòng)容器時(shí)(docker run)會(huì)執(zhí)行的命令。

當(dāng)在Dockerfile中寫(xiě)了CMD時(shí),如果在用docker run或者docker-compose啟動(dòng)容器時(shí),又再加了啟動(dòng)命令,此時(shí)執(zhí)行的是docker run或者docker-compose的命令,如果沒(méi)有加,執(zhí)行的就是Dockerfile中的命令。

  • 例子1:docker run加了命令/bin/bash
[lkidti@hecs-300320 ~]$ docker run -id centos:python-vim /bin/bash
9a25fca7d79046bf693e95e2836744a5d973b12dc25adefe9b78e7e56e56df8f
[lkidti@hecs-300320 ~]$ docker ps
CONTAINER ID   IMAGE               COMMAND                   CREATED         STATUS         PORTS                                                  NAMES
9a25fca7d790   centos:python-vim   "/bin/bash"               4 seconds ago   Up 3 seconds                                                          nice_mendel
33d744b8729a   mysql:latest        "docker-entrypoint.s…"   8 hours ago     Up 8 hours     0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql
  • 例子2:docker run中不加命令
[lkidti@hecs-300320 ~]$ docker run -id centos:python-vim
dba629df688a0fb326d7e1c668fe4393673ca3f1789dd7a9e666fcd9344990d7
[lkidti@hecs-300320 ~]$ docker ps
CONTAINER ID   IMAGE               COMMAND                   CREATED         STATUS         PORTS                                                  NAMES
dba629df688a   centos:python-vim   "/bin/sh -c 'python3…"   5 seconds ago   Up 4 seconds                                                          vigorous_solomon
33d744b8729a   mysql:latest        "docker-entrypoint.s…"   8 hours ago     Up 8 hours     0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql

二、docker-compose

1.簡(jiǎn)介

用于構(gòu)建和啟動(dòng)多容器工具, 通過(guò)docker-compose.yml來(lái)配置項(xiàng)目需要的所有服務(wù), 然后docker-compose up啟動(dòng)所有服務(wù)

2.多服務(wù)實(shí)例

(1)文件準(zhǔn)備

新建一個(gè)目錄:

mkdir composetest
cd composetest

新建一個(gè)app.py文件

# composetest/app.py
import time
?
import redis
from flask import Flask
?
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
?
def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)
?
@app.route('/')
def hello():
    count = get_hit_count()
    return 'Hello World! I have been seen {} times.\n'.format(count)

新建一個(gè)requirements.txt,里面包含如下內(nèi)容

# composetest/requirements.txt
flask
redis

新建一個(gè)Dockerfile

# syntax=docker/dockerfile:1
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]

新建一個(gè)docker-compose.yml

services:
  web:
    build: .
    ports:
      - "8000:5000"
  redis:
    image: "redis:alpine"

(2)啟動(dòng)服務(wù)

docker compose up # 注意,最新版本可以不要中間的"-"

此時(shí)應(yīng)該會(huì)看到兩個(gè)服務(wù)都啟動(dòng)起來(lái)了

CONTAINER ID   IMAGE             COMMAND                  CREATED          STATUS          PORTS                                                  NAMES
b69ccfb85c03   composetest-web   "flask run"              12 minutes ago   Up 12 minutes   0.0.0.0:8000->5000/tcp, :::8000->5000/tcp              composetest-web-1
ea71df663f36   redis:alpine      "docker-entrypoint.s…"   12 minutes ago   Up 12 minutes   6379/tcp                                               composetest-redis-1

(3)訪問(wèn)服務(wù)

在服務(wù)器內(nèi)部執(zhí)行

curl http://127.0.0.1:5000

可以看到輸出

Hello World! I have been seen 1 times.

由于是在服務(wù)器上部署,還可以在瀏覽器中訪問(wèn)http://121.36.104.55:8000/,也是一樣的輸出。

注意,要開(kāi)放8000端口。

3. docker-compose的service

(1)service和container

在上面的例子,web實(shí)際上指的是一個(gè)服務(wù),而不是一個(gè)容器。參考https://stackoverflow.com/a/35585573/10844937

A service can be run by one or multiple containers. With docker you can handle containers and with docker-compose you can handle services.

service可以由一個(gè)或多個(gè)container組成。

docker一般來(lái)操作container,docker-compose一般來(lái)操作service。

可以在docker- compose中指定scale參數(shù)來(lái)指定container的個(gè)數(shù),例如

services:
  web:
    build: .
    scale: 4
  redis:
    image: "redis:alpine"

此時(shí)會(huì)有4個(gè)container

?  composetest git:(master) ? docker ps                  
CONTAINER ID   IMAGE             COMMAND                  CREATED          STATUS          PORTS      NAMES
f17412bbb248   composetest-web   "flask run"              15 seconds ago   Up 5 seconds    5000/tcp   composetest-web-4
ded649c4cec8   composetest-web   "flask run"              15 seconds ago   Up 5 seconds    5000/tcp   composetest-web-3
642b05b9c66e   composetest-web   "flask run"              15 seconds ago   Up 5 seconds    5000/tcp   composetest-web-2
7732ae7c78c8   composetest-web   "flask run"              16 seconds ago   Up 5 seconds    5000/tcp   composetest-web-1
1cf0b1c34972   redis:alpine      "docker-entrypoint.s…"   10 minutes ago   Up 10 minutes   6379/tcp   composetest-redis-1

在docker-compose中,必須有service name,而不必有container name,如果沒(méi)有container name,那么container name=<當(dāng)前工作路徑名>,這里的sequence number是從1開(kāi)始的。

(2)service的廣泛應(yīng)用

非常重要的一點(diǎn): service name 可以廣泛的被應(yīng)用

在nginx中,可以看到proxy_pass http://web:8000;這樣的表示式,這里的web就是指的service name

在django的settings中,可以看到數(shù)據(jù)的配置如下,這里的db指的也是service name

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'orthanc',
        'HOST': 'db',
        'PORT': 5432,
        'USER': 'lkidti',
        'PASSWORD': '4a53e4f5c42fd5a31890860b204472c5'
    }
}

4. docker-compose的指令

(1)image

如果本地有鏡像, 直接用本地鏡像; 如果沒(méi)有, 采用dockerhub的。

version: "3.7"
services:
  webapp:
    build:
      context: ./dir  # Dockerfile的路徑
      dockerfile: Dockerfile-alternate  # Dockerfile的名字
      args:
        buildno: 1  # Dockerfile構(gòu)建鏡像時(shí)候的參數(shù),在構(gòu)建時(shí)候的環(huán)境變量

(2)build

build: 是指通過(guò)Dockerfile來(lái)構(gòu)建。當(dāng)一個(gè)yaml文件中,既有image又有build時(shí),它的順序如下:

首先看本地是否有鏡像,如果有,用本地的鏡像

本地如果沒(méi)有,嘗試從dockerhub拉。

如果dockerhub拉不到,則用build參數(shù)中指定的Dockerfile來(lái)構(gòu)建鏡像。

services:
  backend:
    image: awesome/database
    build:
      context: backend  # 相對(duì)docker-compose的子目錄
      dockerfile: ../backend.Dockerfile  # dockerfile文件名

(3)depends_on

告訴docker-compose當(dāng)前服務(wù)啟動(dòng)之前先要把depends_on指定的服務(wù)啟動(dòng)起來(lái)才行

(4)environment

environment變量可以在構(gòu)建鏡像過(guò)程中,在Dockerfile中去使用。

也可以在已構(gòu)建好的鏡像制作出的容器中使用,在容器的終端中輸入env即可查找到所有的環(huán)境變量。

可以用如下的python代碼拿到具體的環(huán)境變量。

import os
os.environ.get('DEBUG')

(5)volume

docker的掛載主要有兩種方式

  • bind mount(全路徑的主機(jī)目錄):將主機(jī)的目錄mount到container中,這種方式主機(jī)的目錄路徑必須為全路徑,否則docker會(huì)將其當(dāng)做volume處理。這種方式有一個(gè)不好的地方: windows和linux的目錄結(jié)構(gòu)不一樣,那么此時(shí)我們是沒(méi)法在不同的系統(tǒng)去寫(xiě)一個(gè)主機(jī)的目錄來(lái)兼容的。
  • volume(非全路徑的主機(jī)目錄):volume和bind mount不同之處在于,volume的主機(jī)目錄是被docker管理的,都在主機(jī)的/var/lib/docker/volumes目錄下,這個(gè)目錄的權(quán)限非常嚴(yán)格,即使是用sudo都不能打開(kāi)(cd)。將my-volume掛載到container中的/mydata目錄: docker run -it -v my-volume:/mydata alpine sh,它會(huì)在主機(jī)下創(chuàng)建/var/lib/docker/volumes/my-volume/_data目錄,如果該目錄不存在,那么docker會(huì)先創(chuàng)建然后再掛載。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Docker基礎(chǔ)學(xué)習(xí)之?dāng)?shù)據(jù)管理

    Docker基礎(chǔ)學(xué)習(xí)之?dāng)?shù)據(jù)管理

    我們?cè)谑褂肈ocker 的時(shí)候,會(huì)產(chǎn)生很多數(shù)據(jù),比如web服務(wù)器啊,數(shù)據(jù)庫(kù)之類的,有時(shí)我們還需要備份或復(fù)制這些數(shù)據(jù),這就需要涉及到Docker的數(shù)據(jù)管理了。這篇文章就給大家詳細(xì)的介紹Docker的數(shù)據(jù)管理,感興趣的朋友們可以參考借鑒,下面來(lái)一起看看吧。
    2016-10-10
  • docker Compose部署springboot+vue前端端分離

    docker Compose部署springboot+vue前端端分離

    本文主要介紹了docker Compose部署springboot+vue前端端分離,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Docker和宿主機(jī)之間如何共享文件

    Docker和宿主機(jī)之間如何共享文件

    這篇文章主要介紹了Docker和宿主機(jī)之間如何共享文件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Docker容器遷移之導(dǎo)入和導(dǎo)出容器方式

    Docker容器遷移之導(dǎo)入和導(dǎo)出容器方式

    這篇文章主要介紹了Docker容器遷移之導(dǎo)入和導(dǎo)出容器方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • docker-compose之基本語(yǔ)法解讀

    docker-compose之基本語(yǔ)法解讀

    這篇文章主要介紹了docker-compose之基本語(yǔ)法解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 簡(jiǎn)單談?wù)凞ocker鏡像的使用方法

    簡(jiǎn)單談?wù)凞ocker鏡像的使用方法

    本次分享從個(gè)人的角度,講述對(duì)于Docker鏡像的使用方法,包括了從從Docker Hub或者其他鏡像源安裝Docker鏡像,從Image file安裝Docker鏡像,從Docker file制作Docker鏡像,有需要的小伙伴可以參考下
    2016-10-10
  • Centos Docker的安裝教程

    Centos Docker的安裝教程

    本文介紹了在yum環(huán)境下安裝Docker的具體步驟,包括卸載舊版本、安裝依賴、配置鏡像源、更新索引、安裝和驗(yàn)證Docker,并說(shuō)明了卸載Docker的方法
    2025-10-10
  • Docker容器鏡像加載及底層基本原理深入解析

    Docker容器鏡像加載及底層基本原理深入解析

    這篇文章主要為大家介紹了Docker容器鏡像加載及底層基本原理深入分析,讓大家能夠有更深入的理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-03-03
  • docker容器無(wú)法訪問(wèn)宿主機(jī)端口的解決

    docker容器無(wú)法訪問(wèn)宿主機(jī)端口的解決

    這篇文章主要介紹了docker容器無(wú)法訪問(wèn)宿主機(jī)端口的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11
  • docker mysql鏡像因?yàn)榕渲梦募霈F(xiàn)錯(cuò)誤一直提示重啟的解決

    docker mysql鏡像因?yàn)榕渲梦募霈F(xiàn)錯(cuò)誤一直提示重啟的解決

    這篇文章主要介紹了docker mysql鏡像因?yàn)榕渲梦募霈F(xiàn)錯(cuò)誤一直提示重啟的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11

最新評(píng)論

繁昌县| 乐陵市| 资源县| 凤庆县| 胶州市| 通州区| 济宁市| 麦盖提县| 福建省| 乌鲁木齐县| 冀州市| 乐平市| 香河县| 盖州市| 南昌市| 宜章县| 鄂尔多斯市| 思茅市| 纳雍县| 林周县| 岗巴县| 兴海县| 静海县| 兴隆县| 郯城县| 古浪县| 三原县| 阿拉善右旗| 龙海市| 集贤县| 同江市| 赤峰市| 晋城| 和林格尔县| 佳木斯市| 梨树县| 黄大仙区| 盐亭县| 安图县| 吴忠市| 宜昌市|