主頁 > 後端開發 > docker實戰

docker實戰

2023-03-03 07:23:11 後端開發

docker實戰筆記

一、安裝docker

下面以ubuntu系統舉例:

卸載已有的舊版本docker

$ sudo apt-get remove docker \
               docker-engine \
               docker.io

使用apt安裝最新版docker

$ sudo apt-get update
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

更新apt軟體包快取

$ sudo apt-get update

# 安裝docker-ce
$ sudo apt-get install docker-ce docker-ce-cli containerd.io

啟動docker

# 使用系統命令啟動docker
$ sudo systemctl enable docker
$ sudo systemctl start docker

建立docker用戶組

默認情況下,docker 命令會使用 Unix socket 與 Docker 引擎通訊,而只有 root 用戶和 docker 組的用戶才可以訪問 Docker 引擎的 Unix socket,出于安全考慮,一般 Linux 系統上不會直接使用 root 用戶,因此,更好地做法是將需要使用 docker 的用戶加入 docker 用戶組

# 建立docker用戶組
$ sudo groupadd docker

# 將用戶加入到docker用戶組中
$ sudo usermod -aG docker [$USER 用戶名]

二、docker鏡像【重要】

鏡像是 Docker 的三大組件之一,

Docker 運行容器前需要本地存在對應的鏡像,如果本地不存在該鏡像,Docker 會從鏡像倉庫下載該鏡像,

【重點】

docker鏡像與docker容器的區別

? 鏡像的一個實體稱為容器, 你有一個鏡像,這是你描述的一組圖層, 如果你開始這個鏡像,你有一個運行這個鏡像的容器, 您可以擁有許多相同鏡像的正在運行的容器,

# 查看所有鏡像
docker images

# 查看正在運行的容器
docker ps -a 

獲取鏡像

$ docker pull [選項] [Docker Registry 地址[:埠號]/]倉庫名[:標簽]
# 指定ubuntu版本下載
docker pull ubuntu:18.04
# 下載Ubuntu所有鏡像
docker pull -a ubuntu 
# 下載centos所有鏡像
docker pull -a centos 

docker互動式

// 進入docker互動式 用法和linux命令類似
docker run -it --rm ubuntu bash

列出鏡像

docker image ls

查看鏡像檔案大小

docker system df

洗掉本地鏡像

$ docker image rm [選項] <鏡像1> [<鏡像2> ...]

使用commit理解鏡像

docker commit 命令除了學習之外,還有一些特殊的應用場合,比如被入侵后保存現場等,但是,不要使用 docker commit 定制鏡像,定制鏡像應該使用 Dockerfile 來完成,

簡單來說docker commit就是在原來的鏡像上面進行copy然后形成新的鏡像

docker commit [選項] <容器ID或容器名> [<倉庫名>[:<標簽>]]

# 栗子:
$ docker commit \
    --author "Tao Wang <[email protected]>" \
    --message "修改了默認網頁" \
    webserver \
    nginx:v2
sha256:07e33465974800ce65751acc279adc6ed2dc5ed4e0838f8b86f0c87aa1795214

其中 --author 是指定修改的作者,而 --message 則是記錄本次修改的內容,這點和 git 版本控制相似,不過這里這些資訊可以省略留空,

三、使用dockerfile制作鏡像

? 從剛才的 docker commit 的學習中,我們可以了解到,鏡像的定制實際上就是定制每一層所添加的配置、檔案,如果我們可以把每一層修改、安裝、構建、操作的命令都寫入一個腳本,用這個腳本來構建、定制鏡像,那么之前提及的無法重復的問題、鏡像構建透明性的問題、體積的問題就都會解決,這個腳本就是 Dockerfile

Dockerfile 是一個文本檔案,其內包含了一條條的 指令(Instruction),每一條指令構建一層,因此每一條指令的內容,就是描述該層應當如何構建,

創建dockerfile

$ mkdir mynginx
$ cd mynginx
$ touch Dockerfile

# 寫入腳本
FROM nginx // 指定鏡像
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html

FROM命令

? 所謂定制鏡像,那一定是以一個鏡像為基礎,在其上進行定制,就像我們之前運行了一個 nginx 鏡像的容器,再進行修改一樣,基礎鏡像是必須指定的,而 FROM 就是指定 基礎鏡像,因此一個 DockerfileFROM 是必備的指令,并且必須是第一條指令,

RUN命令

? RUN 指令是用來執行命令列命令的,由于命令列的強大能力,RUN 指令在定制鏡像時是最常用的指令之一,其格式有兩種

  • shell 格式:RUN <命令>,就像直接在命令列中輸入的命令一樣,剛才寫的 Dockerfile 中的 RUN 指令就是這種格式,

    # 執行腳本 單個
    RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
    
  • exec 格式:RUN ["可執行檔案", "引數1", "引數2"],這更像是函式呼叫中的格式,

    FROM debian:stretch
    # 批量執行腳本
    RUN apt-get update
    RUN apt-get install -y gcc libc6-dev make wget
    RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
    RUN mkdir -p /usr/src/redis
    RUN tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1
    RUN make -C /usr/src/redis
    RUN make -C /usr/src/redis install
    

exec格式雖然是批量執行腳本,但是上面腳本創建了七層鏡像,是不合適的,那么正確的寫法是: 使用&&符號進行連接,把原來創建七層鏡像變成了一層

FROM debian:stretch
# '\'是shell腳本的末尾換行符
RUN set -x; buildDeps='gcc libc6-dev make wget' \
    && apt-get update \
    && apt-get install -y $buildDeps \
    && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
    && mkdir -p /usr/src/redis \
    && tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \
    && make -C /usr/src/redis \
    && make -C /usr/src/redis install \
    && rm -rf /var/lib/apt/lists/* \
    && rm redis.tar.gz \
    && rm -r /usr/src/redis \
    && apt-get purge -y --auto-remove $buildDeps

3.1、dockerfile指令詳解【重要】

FORM指令

FROM 系統[:鏡像版本號]
# 指定基礎鏡像,也是必須的!!!
FROM ubuntu

EXPOSE指令

EXPOSE 指令是宣告容器運行時提供服務的埠,這只是一個宣告,在容器運行時并不會因為這個宣告應用就會開啟這個埠的服務,在 Dockerfile 中寫入這樣的宣告有兩個好處,一個是幫助鏡像使用者理解這個鏡像服務的守護埠,以方便配置映射;另一個用處則是在運行時使用隨機埠映射時,也就是 docker run -P 時,會自動隨機映射 EXPOSE 的埠,

# 指定 80埠命令
EXPOSE 80

RUN指令

# 指定下載安裝包并更新軟體包快取
RUN apt-get -qq update

COPY復制檔案

COPY [--chown=<user>:<group>] <源路徑>... <目標路徑>
# 復制/home/test檔案夾下所有檔案到當前目錄
COPY /home/test/** .

CMD指令

CMD 指令的格式和 RUN 相似,也是兩種格式:

shell 格式:CMD <命令>
# 栗子:
CMD echo 'hello world!'
CMD service nginx start

exec 格式:CMD ["可執行檔案", "引數1", "引數2"...]
引數串列格式:CMD ["引數1", "引數2"...],在指定了 ENTRYPOINT 指令后,用 CMD 指定具體的引數,

ENV指令

格式有兩種:

ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...

# 栗子:
ENV VERSION=1.0 DEBUG=on \
    NAME="Happy Feet"

ADD復制檔案(高級用法)

# 與COPY指令類似,復制某個檔案夾下所有檔案到/mydir
ADD --chown=55:mygroup files* /mydir/
ADD --chown=bin files* /mydir/
ADD --chown=1 files* /mydir/
ADD --chown=10:11 files* /mydir/

總結:

# FROM:作為基礎鏡像
FROM ubuntu
# 使用RUN指令下載安裝包等等,連接使用&&
RUN apt-get -qq update \
&& COPY /home/test/** . \
# EXPOST 8080
&& RUN  echo 'hello, dockerfile'

那么鏡像制作完成了,就應該進行構建鏡像

# docker build -t=【tag資訊】 【dockerfile路徑】
docker build [選項] <背景關系路徑/URL/->
# 栗子:
docker build -t nginx:v3 .

四、操作容器

新建并啟動一個容器

# 使用docker run命令攜帶腳本
$ docker run ubuntu /bin/echo 'Hello world'
Hello world

查看正在運行的docker容器資訊

# 查看容器資訊
docker container ls

查看容器日志【重要】

# 查看正在運行的容器
docker ps -a
# 拿到對應的容器id,使用docker logs 查看日志
docker container logs [container ID or NAMES]
# 查看實時日志
docker logs -f [container ID or NAMES]

操作容器(停止、啟動、重啟)

# 1.查看正在運行的容器
docker ps -a

# 2.停止正在運行的容器
docker container stop [容器id]

# 3.啟動正在運行的容器
docker container start [容器id]

# 4.重啟正在運行的容器
docker container restart [容器id]

進入容器

# 命令
docker attach [容器id] / docker exec [容器id]

# 進入容器并啟用偽裝終端
docker exec -it [容器id] bash

匯入匯出容器

# 1.查看容器
docker container ls -a

# 2.匯出容器到本地檔案
docker export [容器id] > ubuntu.tar

# 3.匯入容器
docker import [目錄/http鏈接]

洗掉容器

# 1.查看所有容器
docker container ls

# 2.停止對應容器
docker container stop [容器id]

# 3. 洗掉對應容器
docker container rm [容器id / 容器名]

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/545554.html

標籤:其他

上一篇:SpringMVC基礎原始碼分析(一)

下一篇:跟著廖雪峰學python 006

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more