Docker菜鳥教程-硬敲系列


Docker

容器技術/相互隔離,一次部署,多次復用,

建議直接看菜鳥教程,抄的它的

0. Centos安裝

curl -sSL https://get.daocloud.io/docker | sh

1. HelloWorld

docker run ubuntu:15.10 /bin/echo "hello"

  • docker: Docker 的二進制執行文件。
  • run: 與前面的 docker 組合來運行一個容器。
  • ubuntu:15.10 指定要運行的鏡像,Docker 首先從本地主機上查找鏡像是否存在,如果不存在,Docker 就會從鏡像倉庫 Docker Hub 下載公共鏡像。
  • /bin/echo "Hello world": 在啟動的容器里執行的命令

交互式運行容器

docker run -i -t ubuntu:15.10 /bin/bash
  • -t: 在新容器內指定一個偽終端或終端。
  • -i: 允許你對容器內的標准輸入 (STDIN) 進行交互。

exit: 退出容器

后台運行容器

docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
  • -d:后台運行容器,返回一個容器ID

查看容器狀態

docker ps -a

image-20210106114542027

輸出詳情介紹:

CONTAINER ID: 容器 ID。

IMAGE: 使用的鏡像。

COMMAND: 啟動容器時運行的命令。

CREATED: 容器的創建時間。

STATUS: 容器狀態。

狀態有7種:

  • created(已創建)
  • restarting(重啟中)
  • running 或 Up(運行中)
  • removing(遷移中)
  • paused(暫停)
  • exited(停止)
  • dead(死亡)

PORTS: 容器的端口信息和使用的連接類型(tcp\udp)。

NAMES: 自動分配的容器名稱。

查看容器內標准輸出

docker logs 容器ID/容器Name

image-20210106114816281

停止容器

docker stop 容器ID/容器NAME

image-20210106115352243

2. 容器使用

客戶端/命令查看

docker ps --help:查看ps命令的幫助信息

容器使用

a. 獲取鏡像

docker pull ubuntu

b. 啟動容器(交互命令行進入)

docker run -it ubuntu /bin/bash

參數說明:

  • -i: 交互式操作。
  • -t: 終端。
  • ubuntu: ubuntu 鏡像。
  • /bin/bash:放在鏡像名后的是命令,這里我們希望有個交互式 Shell,因此用的是 /bin/bash。

要退出終端,直接輸入 exit:

啟動已停止的容器

docker start 容器ID/容器NAME

后台運行

docker run -itd --name 容器名稱 鏡像名稱 /bin/bash

docker run -itd --name ubuntu-test ubuntu /bin/bash

停止一個容器

docker stop 容器ID/容器Name

重啟

docker restart 容器ID/容器Name

進入容器

在使用 -d 參數時,容器啟動后會進入后台。此時想要進入容器

docker exec -it 容器ID/容器Name /bin/bash

image-20210106121217914

c. 導出/入容器

  • 導出

    docker export 容器ID > 導出文件名稱

    image-20210106121528357

  • 導入(容器導入成鏡像)

    cat ubuntu.zip | docker import - test/ubuntu:v1

    image-20210106121733997

d. 刪除容器

docker rm -f 容器ID/容器NAME

docker container prune 刪除所有終止狀態的容器

image-20210106122100369

e. 運行一個WEB應用

  • docker pull training/webapp # 拉取鏡像

  • # 運行容器
    docker run -d -P training/webapp python app.py
    

參數說明:

  • -d:讓容器在后台運行。
  • -P:將容器內部使用的網絡端口隨機映射到我們使用的主機上。

查看WEB應用

docker ps

image-20210106123004831

Docker 開放了 5000 端口(默認 Python Flask 端口)映射到主機端口 32769 上。

image-20210106123115144

指定端口映射

docker run -d -p 5000:5000 training/webapp python app.py: 容器端口5000 映射到主機端口5000上

  • docker port 容器ID:快捷查看容器端口

image-20210106123423192

查看WEB應用日志

docker logs -f 容器ID/容器NAME

image-20210106123609526

docker top 容器ID/容器Name查看容器內部運行的進程

檢查WEB應用程序

使用 docker inspect 來查看 Docker 的底層信息。它會返回一個 JSON 文件記錄着 Docker 容器的配置和狀態信息。

docker inspect 容器ID/容器NAme

image-20210106124007891

停止WEB應用容器

docker start 容器名稱/容器ID

重啟WEB應用容器

docker start 容器名稱/容器ID

docker ps -l查詢最后一次創建的容器

移除WEB應用容器

docker rm -f 容器ID/容器名稱: 不帶-f 將只能刪除停止運行的容器

3. 鏡像使用

運行容器時,使用的鏡像如果不在本地中存在,docker會自動從鏡像倉庫(docker hub)拉取

列出鏡像列表

docker images

image-20210106135301660

各個選項說明:

  • REPOSITORY:表示鏡像的倉庫源
  • TAG:鏡像的標簽
  • IMAGE ID:鏡像ID
  • CREATED:鏡像創建時間
  • SIZE:鏡像大小

同一倉庫源可以有多個TAG,表示不同倉庫源的版本

指定TAG(版本)docker run -t -i ubuntu:15.10 /bin/bash;如果你不指定一個鏡像的版本標簽,例如你只使用 ubuntu,docker 將默認使用 ubuntu:latest 鏡像。

參數說明:

  • -i: 交互式操作。
  • -t: 終端。
  • ubuntu:15.10: 這是指用 ubuntu 15.10 版本鏡像為基礎來啟動容器。
  • /bin/bash:放在鏡像名后的是命令,這里我們希望有個交互式 Shell,因此用的是 /bin/bash。

獲取一個新的鏡像

docker pull 鏡像名稱:tag名稱(可選)

查找鏡像

docker search httpd

image-20210106140309320

NAME: 鏡像倉庫源的名稱

DESCRIPTION: 鏡像的描述

OFFICIAL: 是否 docker 官方發布

stars: 類似 Github 里面的 star,表示點贊、喜歡的意思。

AUTOMATED: 自動構建。

刪除鏡像

docker rmi 鏡像名稱/鏡像ID

更新鏡像

創建鏡像的第一種方式,需要使用鏡像來創建一個容器

  • docker run -t -i ubuntu:15.10 /bin/bash
  • apt-get update 更改
  • docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2 將更改后的容器打成鏡像

各個參數說明:

  • -m: 提交的描述信息
  • -a: 指定鏡像作者
  • e218edb10161:容器 ID
  • runoob/ubuntu:v2: 指定要創建的目標鏡像名

image-20210106141706965

第二種方式:構建鏡像''我們使用命令 docker build , 從零開始來創建一個新的鏡像。為此,我們需要創建一個 Dockerfile 文件,其中包含一組指令來告訴 Docker 如何構建我們的鏡像。

  • 創建一個Dockfile

    # 指定使用那個鏡像源,這里表示指定centos6.7版本
    FROM    centos:6.7
    MAINTAINER      Fisher "fisher@sudops.com"
    
    # RUN 在鏡像內執行的命令
    RUN     /bin/echo 'root:123456' | chpasswd
    RUN     useradd runoob
    RUN     /bin/echo 'runoob:123456' | chpasswd
    RUN     /bin/echo -e "LANG=\"en_US.UTF-8"">/etc/default/local
    EXPOSE 22
    EXPOSE 80
    CMD /usr/sbin/sshd -D
    
  • 構建

    docker build -t runoob/centos:6.7

    • -t :指定要創建的目標鏡像名
    • . :Dockerfile 文件所在目錄,可以指定Dockerfile 的絕對路徑

設置鏡像標簽

docker tag 容器ID 鏡像源名:標簽名

4. Dockerfile

Dockerfile 是一個用來構建鏡像的文本文件,文本內容包含了一條條構建鏡像所需的指令和說明

定制一個nginx鏡像

# 基於nginx的鏡像
FROM nginx
# 執行命令
RUN echo '本地構建的nginx鏡像'> /usr/share/nginx/html/index.html

image-20210106145228104

2、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 centos
RUN yum install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
# 以上執行會創建 3 層鏡像。可簡化為以下格式:
FROM centos
RUN yum install wget \
  && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
  && tar -xvf redis.tar.gz

開始構建鏡像

docker build -t nginx:v3 ., .表示執行當前目錄下Dockerfile

image-20210106145754257

上下文路徑

上一節中,有提到指令最后一個 . 是上下文路徑,那么什么是上下文路徑呢?

$ docker build -t nginx:v3 .

上下文路徑,是指 docker 在構建鏡像,有時候想要使用到本機的文件(比如復制),docker build 命令得知這個路徑后,會將路徑下的所有內容打包。

解析:由於 docker 的運行模式是 C/S。我們本機是 C,docker 引擎是 S。實際的構建過程是在 docker 引擎下完成的,所以這個時候無法用到我們本機的文件。這就需要把我們本機的指定目錄下的文件一起打包提供給 docker 引擎使用。

如果未說明最后一個參數,那么默認上下文路徑就是 Dockerfile 所在的位置。

注意:上下文路徑下不要放無用的文件,因為會一起打包發送給 docker 引擎,如果文件過多會造成過程緩慢。

指令詳解

  • COPY 從上下文目錄中復制文件/目錄到容器
COPY [--chown=<user>:<group>] <源路徑1>...  <目標路徑>
COPY [--chown=<user>:<group>] ["<源路徑1>",...  "<目標路徑>"]

COPY hom* /mydir/
COPY hom?.txt /mydir/
  • CMD: 類似於RUN指令,用於運行程序

    • CMD 在docker run 時運行。
    • RUN 是在 docker build。

    作用:為啟動的容器指定默認要運行的程序,程序運行結束,容器也就結束。CMD 指令指定的程序可被 docker run 命令行參數中指定要運行的程序所覆蓋。

    注意:如果 Dockerfile 中如果存在多個 CMD 指令,僅最后一個生效。

    格式:

    CMD <shell 命令> 
    CMD ["<可執行文件或命令>","<param1>","<param2>",...] 
    CMD ["<param1>","<param2>",...]  # 該寫法是為 ENTRYPOINT 指令指定的程序提供默認參數
    

EXPOSE

僅僅只是聲明端口。

作用:

  • 幫助鏡像使用者理解這個鏡像服務的守護端口,以方便配置映射。
  • 在運行時使用隨機端口映射時,也就是 docker run -P 時,會自動隨機映射 EXPOSE 的端口。

格式:

EXPOSE <端口1> [<端口2>...]

WORKDIR

指定工作目錄。用 WORKDIR 指定的工作目錄,會在構建鏡像的每一層中都存在。(WORKDIR 指定的工作目錄,必須是提前創建好的)。

docker build 構建鏡像過程中的,每一個 RUN 命令都是新建的一層。只有通過 WORKDIR 創建的目錄才會一直存在。

格式:

WORKDIR <工作目錄路徑>

https://www.runoob.com/docker/docker-dockerfile.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM