日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Docker快速入门与使用

發布時間:2023/12/20 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Docker快速入门与使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 學習資料
  • 一、基礎知識
    • 1.1 簡單了解
      • 1.1.1 Docker的應用場景
      • 1.1.2 Docker 優點
      • 1.1.3 Docker和傳統虛擬機的區別
    • 1.2 深入了解
      • 1.2.1 Docker架構
      • 1.2.2 Docker 鏡像
        • Dockerfile
        • 查看倉庫中某個應用的全部標簽
        • 配置docker 倉庫源
      • 1.2.3 Docker容器
      • 1.2.4 數據卷Volumes
      • 1.2.5 使用網絡
        • docker network
  • 二、使用
    • 命令
          • 關于docker run -it -rm XXX中的-rm選項
    • 2.1 VMware Workstation 15 與 Docker兼容問題(Windows)
    • 2.2 CentOS 7 手動安裝Docker
      • 安裝docker-compose
    • 2.3 制作Docker鏡像
    • 2.4 在Docker Hub上共享鏡像
      • 2.4.1 創建Docker Hub賬戶
      • 2.4.2 創建Docker Hub倉庫并推送鏡像到倉庫中
    • 2.5 Docker部署自定義mysql
      • 使用測試數據驗證數據庫是否可用
    • 2.6 Docker 配置mongo

學習資料

  • Docker中文文檔
    推薦

  • Docker Documents
    推薦,原汁原味,更直接

  • 菜鳥教程-Docker

  • 為什么Docker鏡像大小與倉庫中不一致?

  • docker命令

  • Docker查看遠端倉庫中某個應用全部標簽的工具

  • Job for docker.service failed because the control process exited with error code. See
    vim /etc/docker/daemon.json書寫不規范,會導致這個錯誤

  • nsenter命令簡介

  • docker 在宿主機上根據進程PID查找歸屬容器ID

  • docker學習筆記–重基礎使用

  • 使用docker run后狀態為Exited (1)
    配置文件編寫有問題也會導致這個問題,大概來將容器內mysql運行失敗都會導致容器進入這個狀態

  • Docker之Mysql數據持久化
    https://blog.csdn.net/qq_31864653/article/details/90769142

  • “exec: “docker-entrypoint.sh”: executable file not found in $PATH”.解決方法

  • 一、基礎知識

    Docker可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然后發布到任何流行的Linux機器上,也可以實現虛擬化。

    1.1 簡單了解

    Docker 項目的目標是實現輕量級的操作系統虛擬化解決方案。 Docker 的基礎是 Linux 容器(LXC)等技術。
    在 LXC 的基礎上 Docker 進行了進一步的封裝,讓用戶不需要去關心容器的管理,使得操作更為簡便。用戶操作 Docker 的容器就像操作一個快速輕量級的虛擬機一樣簡單。

    1.1.1 Docker的應用場景

    1.Web應用的自動化打包和發布
    2.自動化測試和持續集成、發布
    3.在服務型環境中部署和調整數據庫或其它的后臺應用。
    4.從頭編譯或者擴展現有的OpenShift或Cloud Foundry平臺來搭建自己的PaaS環境。

    1.1.2 Docker 優點

    1.快速、一致的交付應用程序

    2.在任何地方開發、部署和運行任何應用

    Docker是一款針對程序開發人員和系統管理員來開發、部署、運行應用的一款虛擬化平臺。Docker 可以讓你像使用集裝箱一樣快速的組合成應用,并且可以像運輸標準集裝箱一樣,盡可能的屏蔽代碼層面的差異。Docker 會盡可能的縮短從代碼測試到產品部署的時間。

    3.在同一硬件上運行更多工作負載

    1.1.3 Docker和傳統虛擬機的區別


    [翻譯]傳統虛擬機包含:應用、二進制文件/庫和客體操作系統三部分。每一個被虛擬化的應用可能只有幾或幾十MB,同時需要一些二進制文件和庫。但是一個被虛擬化的操作系統卻可能需要幾十GB。
    多個虛擬機之間需要有多個guest os,guest os占用大量的空間。

    [翻譯]這個Docker 引擎上的容器僅包含應用和一些其它的依賴文件。Docker 引擎作為一個獨立進程在主機操作系統的用戶空間(userspace)內運行。每一個容器都可以共享這個Docker 引擎。因此,Docker在具備傳統虛擬機資源隔離和資源分配優勢的基礎上,擁有更高的效率和更好的可移植性。

    1.關于hypervisor:虛擬機監視器,是用來建立與執行虛擬機器的軟件、固件或硬件。被Hypervisor用來執行一個或多個虛擬機器的電腦稱為主體機器(host machine),這些虛擬機器則稱為客體機器(guest machine)。hypervisor提供虛擬的作業平臺來執行客體操作系統(guest operating systems),負責管理其他客體操作系統的執行階段;這些客體操作系統,共同分享虛擬化后的硬件資源。

    2.Guest OS:運行在Guest Machine上的操作系統

    3.Docker Engine 是一個基于虛擬化技術的輕量級并且功能強大的開源容器引擎管理工具。它可以將不同的 work flow 組合起來構建成你的應用。

    4.Docker Hub 可以分享和管理你的images鏡像的一個 Saas 服務。

    1.2 深入了解

    1.2.1 Docker架構

    三個基本概念:鏡像(Mirroring)、容器(Container)、倉庫(Repository)

    Docker 使用客戶端-服務器 (C/S) 架構模式,使用遠程API來管理和創建Docker容器。

    鏡像(Mirroring):一種文件存儲形式,是冗余的一種類型,一個磁盤上的數據在另一個磁盤上存在一個完全相同的副本即為鏡像。舉例:多個文件的集合θ{A1,A2,...,An}\theta\{A_1,A_2,...,A_n\}θ{A1?,A2?,...,An?}打包成鏡像文件,鏡像文件展開后恢復成多個文件的集合θ\thetaθ,前后數據內容完全一致。

    容器(Container):容器是鏡像的實例

    倉庫(Repository):可以看成一個代碼控制中心,用于保存鏡像


    關鍵名詞

    名詞說明
    Docker鏡像Docker 鏡像是用于創建 Docker 容器的模板
    Docker 容器容器是獨立運行的一個或一組應用,是鏡像運行時的實體。
    Docker 客戶端Docker 客戶端通過命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 與 Docker 的守護進程通信。
    Docker 主機(Host)一個物理或者虛擬的機器用于執行 Docker 守護進程和容器。
    Docker RegistryDocker 倉庫用來保存鏡像,可以理解為代碼控制中的代碼倉庫。Docker Hub(https://hub.docker.com) 提供了龐大的鏡像集合供使用。一個 Docker Registry 中可以包含多個倉庫(Repository);每個倉庫可以包含多個標簽(Tag);每個標簽對應一個鏡像。通常,一個倉庫會包含同一個軟件不同版本的鏡像,而標簽就常用于對應該軟件的各個版本。我們可以通過 <倉庫名>:<標簽> 的格式來指定具體是這個軟件哪個版本的鏡像。如果不給出標簽,將以 latest 作為默認標簽。
    Docker MachineDocker Machine是一個簡化Docker安裝的命令行工具,通過一個簡單的命令行即可在相應的平臺上安裝Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。

    1.2.2 Docker 鏡像

    在Docker中,一個只讀層被稱為鏡像。
    Docker使用一個統一的文件系統,Docker進程認為整個文件系統是以讀寫方式掛載的。但是所有的變更都發生在頂層的可寫層,而下層的原始的只讀鏡像文件并未發生變化。
    Docker鏡像是多層存儲結構,鏡像中的每一層都是可繼承、可復用的。

  • 父鏡像
    每一個鏡像都可能依賴于由一個或多個下層的組成的另一個鏡像。通常將下層的那個鏡像成為上層鏡像的父鏡像。

  • 基礎鏡像
    無父鏡像的鏡像被成為基礎鏡像。

  • 鏡像ID
    所有鏡像都是通過一個 64 位十六進制字符串 (內部是一個 256 bit 的值)來標識的。 為簡化使用,前 12 個字符可以組成一個短ID,可以在命令行中使用。短ID還是有一定的 碰撞機率,所以服務器總是返回長ID。

  • 獲取鏡像,使用docker pull <鏡像名稱:鏡像標簽>命令從倉庫中獲取需要的鏡像。
    下載過程中會輸出獲取鏡像每一層的信息

  • sudo docker pull ubuntu:20.10 20.10: Pulling from library/ubuntu 0b4f5d796ad9: Pull complete 59ee7132703b: Pull complete 672e5b34dda8: Pull complete d3af786f5e76: Pull complete Digest: sha256:8b55362d424379a123758b70ddc2c5d3fbc3b5815d110be2a43933fa385672a3 Status: Downloaded newer image for ubuntu:20.10 docker.io/library/ubuntu:20.10

    若默認的官方倉庫下載速度過慢,可以使用docker pull <域名:端口號>/<鏡像名稱:鏡像標簽>指定從某個倉庫下載鏡像
    也可以設置加速源或國內源,方法寫在下面,可以參照

  • 使用docker images顯示本地已有的鏡像
  • REPOSITORY 倉庫名稱 TAG 鏡像標簽 IMAGE ID 鏡像ID CREATED 創建時間 VIRTUAL SIZE 鏡像大小

    鏡像ID唯一標識了鏡像
    TAG信息用來標記同一個倉庫的不同鏡像

    Dockerfile

    Dockerfile 是一個用來構建鏡像的文本文件,文本內容包含了一條條構建鏡像所需的指令和說明,一些元數據(metadata)還包含以該鏡像為基礎運行的容器的行為。
    一般的,Dockerfile 分為四部分:基礎鏡像信息、維護者信息、鏡像操作指令和容器啟動時執行指令。

    基本語法:
    使用#來注釋
    FROM指令告訴 Docker 使用哪個鏡像作為基礎
    接著是維護者的信息
    RUN開頭的指令會在創建中運行,比如安裝一個軟件包。

    FORM指令
    指出使用的模板鏡像,定制鏡像都是在模板鏡像的基礎上進行。
    RUN指令
    用于執行后面跟著的命令行命令,有以下兩種格式:

  • shell 格式:
  • RUN <命令行命令> # <命令行命令> 等同于,在終端操作的 shell 命令。
  • exec格式:
  • RUN ["可執行文件", "參數1", "參數2"] # 例如: # RUN ["./test.php", "dev", "offline"] 等價于 RUN ./test.php dev offline

    Dockerfile中每一條指令都創建鏡像的一層。所以過多無意義的層會導致鏡像膨脹過大。一個鏡像不能超過127層,鏡像層屬性為只讀,但鏡像實例化為容器時該層可讀可寫。

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

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

    -t標記用來添加標簽 <鏡像名稱:鏡像標簽>
    docker tag用于修改鏡像標簽
    docker images列出本地鏡像
    docker push上傳鏡像到倉庫中
    docker save導出鏡像文件到本地
    docker load載入鏡像

    查看倉庫中某個應用的全部標簽

    vim /home/tu/dockertags.sh

    將以下內容放在dockertags.sh文件中

    #!/bin/bash function usage() { cat << HELPdockertags -- list all tags for a Docker image on a remote registry.EXAMPLE: - list all tags for ubuntu:dockertags ubuntu- list all php tags containing apache:dockertags php apacheHELP }if [ $# -lt 1 ]; thenusageexit fiimage="$1" tags=`wget -q https://registry.hub.docker.com/v1/repositories/${image}/tags -O - | sed -e 's/[][]//g' -e 's/"//g' -e 's/ //g' | tr '}' '\n' | awk -F: '{print $3}'`if [ -n "$2" ]; thentags=` echo "${tags}" | grep "$2" ` fi echo "${tags}"

    修改權限,運行腳本,得到輸出

    chmod 755 dockertags.sh ./dockertags.sh ubuntu latest 10.04 12.04 12.04.5 12.10 13.04 13.10 14.04 14.04.1 14.04.2 14.04.3 14.04.4 14.04.5 14.10 15.04 15.10 16.04 16.10 17.04 17.10 18.04 18.10 19.04 19.10 20.04 20.10 artful artful-20170511.1 ... artful-20180706 bionic bionic-20171114 ...bionic-20200526 cosmic cosmic-20180605 ... cosmic-20190719 devel disco disco-20181112 ... disco-20200114 eoan eoan-20190508 ... eoan-20200608 focal focal-20191030 ... focal-20200606 groovy groovy-20200505 groovy-20200609 lucid precise precise-20150212 ... precise-20170331 quantal raring rolling saucy trusty trusty-20150218.1 ...

    配置docker 倉庫源

    vim /etc/docker/daemon.json

    { "registry-mirrors": ["https://7bezldxe.mirror.aliyuncs.com/","https://docker.mirrors.ustc.edu.cn/","https://hub-mirror.c.163.com","https://registry.docker-cn.com"] }

    加載配置文件
    重啟docker

    systemctl daemon-reload systemctl restart docker

    1.2.3 Docker容器

    容器是鏡像的的行為

    • 啟動容器
      兩種情形:一種是基于鏡像新建一個容器并啟動;
      另外一種是將處于終止狀態(stopped)的容器重新啟動。

    • 新建并啟動
      docker run
      示例1:使用ubuntu:14.04鏡像生成一個容器,在容器中執行/bin/echo 'Hello world'

    sudo docker run ubuntu:14.04 /bin/echo 'Hello world' Hello world

    示例2:使用ubuntu:14.04鏡像生成一個容器,在容器中執行/bin/bash,該命令會開啟一個bash終端

    sudo docker run -t -i ubuntu:14.04 /bin/bash root@af8bae53bdd3:/#

    其中,-t選項讓Docker分配一個偽終端(pseudo-tty)并綁定到容器的標準輸入上, -i則讓容器的標準輸入保持打開。

    利用 docker run來創建容器時,Docker 在后臺運行的標準操作包括:

    • 檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載
    • 利用鏡像創建并啟動一個容器
    • 分配一個文件系統,并在只讀的鏡像層外面掛載一層可讀寫層
    • 從宿主主機配置的網橋接口中橋接一個虛擬接口到容器中去
    • 從地址池配置一個 ip 地址給容器
    • 執行用戶指定的應用程序
    • 執行完畢后容器被終止
  • 啟動已終止的容器,docker start
    容器的核心為所執行的應用程序,所需要的資源都是應用程序運行所必需的。除此之外,并沒有其它的資源。可以在偽終端中利用 ps 或 top 來查看進程信息。
  • root@ba267838cc1b:/# psPID TTY TIME CMD1 ? 00:00:00 bash11 ? 00:00:00 ps
  • 守護態運行
    更多的時候,需要讓 Docker 容器在后臺以守護態(Daemonized)形式運行。此時,可以通過添加-d參數來實現。
  • docker run -d ubuntu:20.10 /bin/sh -c "while true; do echo hello world; sleep 1; done" cbb72f51cf163590376fefe8444cbff7f8f44e38518bbf40fb799dcc2f4b0ff7

    容器會返回一個唯一的id,也可以通過docker ps命令來查看容器信息

    docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES cbb72f51cf16 ubuntu:20.10 "/bin/sh -c 'while t…" 14 seconds ago Up 12 seconds

    可以使用docker logs命令獲取容器的輸出信息

    docker logs confident_swanson hello world hello world hello world hello world . . .
  • 終止容器,docker stop
    當Docker容器中指定的應用終結時,容器也自動終止。 例如對于上面只啟動了一個終端的容器,用戶通過 exit 命令或 Ctrl+d 來退出終端時,所創建的容器立刻終止。
  • docker stop confident_swanson confident_swanson

    終止狀態的容器可以使用docker ps -a命令看到。

    docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES cbb72f51cf16 ubuntu:20.10 "/bin/sh -c 'while t…" 3 minutes ago Exited (137) 12 seconds ago confident_swanson 36230771220f ubuntu:20.10 "/bin/echo 'hello wo…" 5 minutes ago Exited (0) 5 minutes ago epic_bhaskara 654a3c5ec3d1 bulletinboard:1.0 "docker-entrypoint.s…" 24 hours ago Exited (0) 13 hours ago bb 7fa85404b035 hello-world "/hello" 27 hours ago Exited (0) 27 hours ago

    處于終止狀態的容器,可以通過docker start命令來重新啟動。

    docker start confident_swanson confident_swansondocker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES cbb72f51cf16 ubuntu:20.10 "/bin/sh -c 'while t…" 5 minutes ago Up 9 seconds confident_swanson 36230771220f ubuntu:20.10 "/bin/echo 'hello wo…" 7 minutes ago Exited (0) 7 minutes ago epic_bhaskara 654a3c5ec3d1 bulletinboard:1.0 "docker-entrypoint.s…" 24 hours ago Exited (0) 13 hours ago bb 7fa85404b035 hello-world "/hello" 27 hours ago Exited (0) 27 hours ago

    docker restart命令會將一個運行態的容器終止,然后再重新啟動。

    6.進入容器
    在使用 -d參數時,容器啟動后會進入后臺。 某些時候需要進入容器進行操作,有很多種方法,包括使用docker attach命令或 nsenter工具等。
    但是使用 attach命令有時候并不方便。當多個窗口同時 attach 到同一個容器的時候,所有窗口都會同步顯示。當某個窗口因命令阻塞時,其他窗口也無法執行操作了。

    nsenter工具在 util-linux 包2.23版本后包含。nsenter可以訪問另一個進程的名字空間。nsenter要正常工作需要有 root 權限。

    # nsenter -V nsenter,來自 util-linux 2.23.2

    為了連接到容器,你還需要找到容器的第一個進程的 PID,可以通過下面的命令獲取。

    docker inspect --format "{{ .State.Pid }}" <container>

    通過這個 PID,就可以連接到這個容器:

    nsenter --target $PID --mount --uts --ipc --net --pid

    示例

    $ sudo docker run -idt ubuntu Unable to find image 'ubuntu:latest' locally latest: Pulling from library/ubuntu a4a2a29f9ba4: Pull complete 127c9761dcba: Pull complete d13bf203e905: Pull complete 4039240d2e0b: Pull complete Digest: sha256:35c4a2c15539c6c1e4e5fa4e554dac323ad0107d8eb5c582d6ff386b383b7dce Status: Downloaded newer image for ubuntu:latest 93bd7a1a1bdf6293519649041fb28d70fcbe493fc70dbe281c6f31fed1499c10 $ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 93bd7a1a1bdf ubuntu "/bin/bash" 48 seconds ago Up 45 seconds fervent_lederberg $ docker inspect --format "{{ .State.Pid }}" fervent_lederberg 21525 $ sudo nsenter --target 21525 --mount --uts --ipc --net --pid root@93bd7a1a1bdf:/#

    解析:

  • docker run -idt ubuntu:
    -t選項讓docker分配一個偽終端并綁定到標準輸入上,-i讓容器的標準輸入保持打開,-i -t通常同時出現。
    -d以守護態運行容器,即容器在后臺運行
  • docker inspect --format "{{ .State.Pid }}" fervent_lederberg:
    docker inspect輸出容器的低級信息,格式是Json
    --format "{{ .State.Pid }}"向輸出結果傳遞參數,只查看Pid信息
    fervent_lederberg容器名,上文通過docker ps命令獲取到的。
    3.nsenter參數詳解
  • nsenter [options] [program [arguments]]options: -t, --target pid:指定被進入命名空間的目標進程的pid -m, --mount[=file]:進入mount命令空間。如果指定了file,則進入file的命令空間 -u, --uts[=file]:進入uts命令空間。如果指定了file,則進入file的命令空間 -i, --ipc[=file]:進入ipc命令空間。如果指定了file,則進入file的命令空間 -n, --net[=file]:進入net命令空間。如果指定了file,則進入file的命令空間 -p, --pid[=file]:進入pid命令空間。如果指定了file,則進入file的命令空間 -U, --user[=file]:進入user命令空間。如果指定了file,則進入file的命令空間 -G, --setgid gid:設置運行程序的gid -S, --setuid uid:設置運行程序的uid -r, --root[=directory]:設置根目錄 -w, --wd[=directory]:設置工作目錄如果沒有給出program,則默認執行$SHELL
  • 使用docker ps命令查看本地的docker 進程

    # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 654a3c5ec3d1 bulletinboard:1.0 "docker-entrypoint.s…" 10 hours ago Up 10 hours 0.0.0.0:8000->8080/tcp bb

    使用docker inspect <NAME|ID>查看容器的信息,返回數據格式是json

    "docker inspect" requires at least 1 argument. See 'docker inspect --help'.Usage: docker inspect [OPTIONS] NAME|ID [NAME|ID...]Return low-level information on Docker objects # docker inspect 654a3c5ec3d1 [{"Id": "654a3c5ec3d12af094cb8a685805fa651bcaa2e1c22c1d957807c667aceaf991","Created": "2020-06-25T05:44:32.169640597Z","Path": "docker-entrypoint.sh","Args": ["npm","start"],"State": {...}} ]

    docker export導出本地上的某個容器
    docker import導入容器快照
    docker rm刪除一個處于終止狀態的容器。如果要刪除一個運行中的容器,可以添加-f參數。Docker 會發送 SIGKILL 信號給容器

    1.2.4 數據卷Volumes

  • 數據卷
    數據卷是一個可供一個或多個容器使用的特殊目錄,它繞過 UFS(unix file system),可以提供很多有用的特性:
    • 數據卷可以在容器之間共享和重用
    • 對數據卷的修改會立馬生效
    • 對數據卷的更新,不會影響鏡像
    • 卷會一直存在,直到沒有容器使用

    *數據卷的使用,類似于 Linux 下對目錄或文件進行 mount。

  • 創建一個數據卷
    在用 docker run命令的時候,使用-v標記來創建一個數據卷并掛載到容器里。在一次 run 中多次使用可以掛載多個數據卷。
    *注意:也可以在 Dockerfile 中使用 VOLUME 來添加一個或者多個新的卷到由該鏡像創建的任意容器。

  • 掛載一個主機目錄作為數據卷
    使用 -v標記也可以指定掛載一個本地主機的目錄到容器中去。
    Docker 掛載數據卷的默認權限是讀寫,用戶也可以通過 :ro指定為只讀。

  • 掛載一個本地主機文件作為數據卷(不推薦!)
    -v標記也可以從主機掛載單個文件到容器中
    *注意:如果直接掛載一個文件,很多文件編輯工具,包括vi或者 sed --in-place,可能會造成文件 inode的改變,從 Docker 1.1 .0起,這會導致報錯誤信息。所以最簡單的辦法就直接掛載文件的父目錄。

  • 數據卷容器
    如果你有一些持續更新的數據需要在容器之間共享,最好創建數據卷容器。
    數據卷容器,其實就是一個正常的容器,專門用來提供數據卷供其它容器掛載的。
    首先,創建一個命名的數據卷容器 dbdata:

  • $ sudo docker run -d -v /dbdata --name dbdata training/postgres echo Data-only container for postgres

    然后,在其他容器中使用 --volumes-from 來掛載 dbdata 容器中的數據卷。

    $ sudo docker run -d --volumes-from dbdata --name db1 training/postgres $ sudo docker run -d --volumes-from dbdata --name db2 training/postgres

    還可以使用多個--volumes-from參數來從多個容器掛載多個數據卷。 也可以從其他已經掛載了數據卷的容器來掛載數據卷。

    $ sudo docker run -d --name db3 --volumes-from db1 training/postgres

    *注意:使用 --volumes-from參數所掛載數據卷的容器自己并不需要保持在運行狀態。

    如果刪除了掛載的容器(包括 dbdata、db1 和 db2),數據卷并不會被自動刪除。如果要刪除一個數據卷,必須在刪除最后一個還掛載著它的容器時使用docker rm -v命令來指定同時刪除關聯的容器。 這可以讓用戶在容器之間升級和移動數據卷。具體的操作將在下一節中進行講解。

  • 利用數據卷容器來備份、恢復、遷移數據卷
    可以利用數據卷對其中的數據進行進行備份、恢復和遷移。

  • 備份
    首先使用 --volumes-from 標記來創建一個加載 dbdata 容器卷的容器,并從本地主機掛載當前到容器的 /backup 目錄。

  • $ sudo docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata

    容器啟動后,使用了 tar 命令來將 dbdata 卷備份為本地的 /backup/backup.tar

    8.恢復
    如果要恢復數據到一個容器,首先創建一個帶有數據卷的容器 dbdata2

    $ sudo docker run -v /dbdata --name dbdata2 ubuntu /bin/bash

    然后創建另一個容器,掛載 dbdata2 的容器,并使用 untar解壓備份文件到掛載的容器卷中。

    $ sudo docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar

    1.2.5 使用網絡

  • 外部訪問容器
    容器中可以運行一些網絡應用,要讓外部也可以訪問這些應用,可以通過 ?P-P?P?p-p?p 參數來指定端口映射。
    當使用 ?P-P?P 標記時,Docker 會隨機映射一個 49000~49900 的端口到內部容器開放的網絡端口。
    -p(小寫的)則可以指定要映射的端口,并且,在一個指定端口上只可以綁定一個容器。支持的格式有ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort

  • 映射所有接口地址
    使用 hostPort:containerPort格式本地的 5000 端口映射到容器的 5000 端口,可以執行

  • $ sudo docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
  • 映射到指定地址的任意端口
    使用 ip::containerPort綁定 localhost 的任意端口到容器的 5000 端口,本地主機會自動分配一個端口。
  • $ sudo docker run -d -p 127.0.0.1::5000 training/webapp python app.py

    還可以使用 udp 標記來指定 udp 端口

    $ sudo docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
  • 查看映射端口配置
    使用 docker port 來查看當前映射的端口配置,也可以查看到綁定的地址
  • $ docker port nostalgic_morse 5000 127.0.0.1:49155.

    注意:

    容器有自己的內部網絡和 ip 地址(使用 docker inspect 可以獲取所有的變量,Docker 還可以有一個可變的網絡配置。)
    -p 標記可以多次使用來綁定多個端口
    例如

    $ sudo docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py
  • 容器互聯
    容器的連接(linking)系統是除了端口映射外,另一種跟容器中應用交互的方式。
    該系統會在源和接收容器之間創建一個隧道,接收容器可以看到源容器指定的信息。

  • 自定義容器命名
    連接系統依據容器的名稱來執行。因此,首先需要自定義一個好記的容器命名。
    雖然當創建容器的時候,系統默認會分配一個名字。自定義命名容器有2個好處:
    自定義的命名,比較好記,比如一個web應用容器我們可以給它起名叫web
    當要連接其他容器時候,可以作為一個有用的參考點,比如連接web容器到db容器
    使用 --name標記可以為容器自定義命名。

  • $ sudo docker run -d -P --name web training/webapp python app.py

    使用 docker ps來驗證設定的命名。

    $ sudo docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES aed84ee21bde training/webapp:latest python app.py 12 hours ago Up 2 seconds 0.0.0.0:49154->5000/tcp web

    也可以使用 docker inspect來查看容器的名字

    $ sudo docker inspect -f "{{ .Name }}" aed84ee21bde /web

    注意:容器的名稱是唯一的。如果已經命名了一個叫 web 的容器,當你要再次使用 web 這個名稱的時候,需要先用docker rm 來刪除之前創建的同名容器。
    在執行 docker run的時候如果添加 --rm標記,則容器在終止后會立刻刪除。注意,--rm和 -d參數不能同時使用。

  • 使用 --link參數可以讓容器之間安全的進行交互。
    下面先創建一個新的數據庫容器。
  • $ sudo docker run -d --name db training/postgres

    刪除之前創建的 web 容器

    $ docker rm -f web

    然后創建一個新的 web 容器,并將它連接到 db 容器

    $ sudo docker run -d -P --name web --link db:db training/webapp python app.py

    此時,db 容器和 web 容器建立互聯關系。

    --link參數的格式為 --link name:alias,其中 name是要鏈接的容器的名稱,alias是這個連接的別名。
    使用 docker ps來查看容器的連接

    $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 349169744e49 training/postgres:latest su postgres -c '/usr About a minute ago Up About a minute 5432/tcp db, web/db aed84ee21bde training/webapp:latest python app.py 16 hours ago Up 2 minutes 0.0.0.0:49154->5000/tcp web

    可以看到自定義命名的容器,db 和 web,db 容器的 names 列有 db 也有 web/db。這表示 web 容器鏈接到 db 容器,web 容器將被允許訪問 db 容器的信息。

    Docker 在兩個互聯的容器之間創建了一個安全隧道,而且不用映射它們的端口到宿主主機上。在啟動 db 容器的時候并沒有使用 -p 和 -P 標記,從而避免了暴露數據庫端口到外部網絡上。

    Docker 通過 2 種方式為容器公開連接信息:

    • 環境變量
    • 更新 /etc/hosts 文件

    使用 env 命令來查看 web 容器的環境變量

    $ sudo docker run --rm --name web2 --link db:db training/webapp env . . . DB_NAME=/web2/db DB_PORT=tcp://172.17.0.5:5432 DB_PORT_5000_TCP=tcp://172.17.0.5:5432 DB_PORT_5000_TCP_PROTO=tcp DB_PORT_5000_TCP_PORT=5432 DB_PORT_5000_TCP_ADDR=172.17.0.5 . . .

    其中 DB_ 開頭的環境變量是供 web 容器連接 db 容器使用,前綴采用大寫的連接別名。

    除了環境變量,Docker 還添加 host 信息到父容器的/etc/hosts的文件。下面是父容器 web 的 hosts 文件

    $ sudo docker run -t -i --rm --link db:db training/webapp /bin/bash root@aed84ee21bde:/opt/webapp# cat /etc/hosts 172.17.0.7 aed84ee21bde . . . 172.17.0.5 db

    這里有 2 個 hosts,第一個是 web 容器,web 容器用 id 作為他的主機名,第二個是 db 容器的 ip 和主機名。 可以在 web 容器中安裝 ping 命令來測試跟db容器的連通。

    root@aed84ee21bde:/opt/webapp# apt-get install -yqq inetutils-ping root@aed84ee21bde:/opt/webapp# ping db PING db (172.17.0.5): 48 data bytes 56 bytes from 172.17.0.5: icmp_seq=0 ttl=64 time=0.267 ms 56 bytes from 172.17.0.5: icmp_seq=1 ttl=64 time=0.250 ms 56 bytes from 172.17.0.5: icmp_seq=2 ttl=64 time=0.256 ms

    用 ping 來測試db容器,它會解析成 172.17.0.5。 *注意:官方的 ubuntu 鏡像默認沒有安裝 ping,需要自行安裝。

    用戶可以鏈接多個父容器到子容器,比如可以鏈接多個 web 到 db 容器上。

    docker network

    docker network create --driver=bridge --subnet=172.20.0.0/16 wkcrm_network

    --driver:設置網絡類型為橋接(bridge)網絡
    --subnet:設置子網網段

    資料:
    docker設置固定ip地址
    https://www.cnblogs.com/xuezhigu/p/8257129.html

    https://docs.docker.com/engine/reference/commandline/network_create/

    docker network create
    https://blog.csdn.net/zhizhuodewo6/article/details/87706638

    二、使用

    命令

  • 設置docker開機自啟
  • systemctl enable docker.service
  • docker ps // 查看所有正在運行容器

  • docker stop containerId // containerId 是容器的ID

  • docker ps -a // 查看所有容器

  • docker ps -a -q // 查看所有容器ID

  • docker stop $(docker ps -a -q) // stop停止所有容器

  • docker rm $(docker ps -a -q) // remove刪除所有容器

  • 關于docker run -it -rm XXX中的-rm選項

    使用-rm標志運行容器對于那些用于非常短暫而只是為了完成某些事情的容器是有好處的,例如,在容器內編譯應用程序,或者只測試它工作的東西,然后你知道它是一個短暫的容器并告訴你的Docker守護進程一旦運行完畢,擦除與之相關的所有內容并保存磁盤空間

    在Docker容器退出時,默認容器內部的文件系統仍然被保留,以方便調試并保留用戶數據。
    但是,對于foreground容器,由于其只是在開發調試過程中短期運行,其用戶數據并無保留的必要,因而可以在容器啟動時設置–rm選項,這樣在容器退出時就能夠自動清理容器內部的文件系統。
    https://blog.csdn.net/taiyangdao/article/details/73076770

    2.1 VMware Workstation 15 與 Docker兼容問題(Windows)

    解決方法:解決VMware Workstation 15 與Device/Credential Guard不兼容的問題

    2.2 CentOS 7 手動安裝Docker

  • 存在就刪除舊版本docker
  • sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine 已加載插件:fastestmirror, langpacks 參數 docker 沒有匹配 參數 docker-client 沒有匹配 參數 docker-client-latest 沒有匹配 參數 docker-common 沒有匹配 參數 docker-latest 沒有匹配 參數 docker-latest-logrotate 沒有匹配 參數 docker-logrotate 沒有匹配 參數 docker-engine 沒有匹配 不刪除任何軟件包
  • 首次安裝Docker Engine-Community之前,需要指定Docker倉庫。之后可以從倉庫安裝和更新Docker
    設置倉庫,首先安裝依賴
  • sudo yum install -y yum-utils \device-mapper-persistent-data \lvm2 已加載插件:fastestmirror, langpacks Loading mirror speeds from cached hostfile* base: mirrors.huaweicloud.com* centos-sclo-rh: mirror.bit.edu.cn* centos-sclo-sclo: mirror.bit.edu.cn* epel: mirrors.yun-idc.com* extras: mirror.bit.edu.cn* updates: mirror.bit.edu.cn 軟件包 yum-utils-1.1.31-54.el7_8.noarch 已安裝并且是最新版本 軟件包 device-mapper-persistent-data-0.8.5-2.el7.x86_64 已安裝并且是最新版本 軟件包 7:lvm2-2.02.186-7.el7_8.2.x86_64 已安裝并且是最新版本 無須任何處理

    使用阿里源地址設置穩定的倉庫

    sudo yum-config-manager \--add-repo \http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 已加載插件:fastestmirror, langpacks adding repo from: http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo grabbing file http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo repo saved to /etc/yum.repos.d/docker-ce.repo
  • 安裝 Docker Engine-Community
    安裝最新版本
  • sudo yum install docker-ce docker-ce-cli containerd.io 已加載插件:fastestmirror, langpacks Loading mirror speeds from cached hostfile ... 更新完畢:docker-ce.x86_64 3:19.03.12-3.el7 docker-ce-cli.x86_64 1:19.03.12-3.el7完畢!
  • 安裝指定版本Docker
    首先查看倉庫內可用版本有哪些
  • yum list docker-ce --showduplicates | sort -r已加載插件:fastestmirror, langpacks 已安裝的軟件包 可安裝的軟件包* updates: mirror.bit.edu.cn Loading mirror speeds from cached hostfile* extras: mirror.bit.edu.cn* epel: mirrors.yun-idc.com docker-ce.x86_64 3:19.03.9-3.el7 docker-ce-stable docker-ce.x86_64 3:19.03.8-3.el7 docker-ce-stable docker-ce.x86_64 3:19.03.7-3.el7 docker-ce-stable ... docker-ce.x86_64 17.03.2.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable* centos-sclo-sclo: mirror.bit.edu.cn* centos-sclo-rh: mirror.bit.edu.cn* base: mirrors.huaweicloud.com

    通過其完整的軟件包名稱安裝特定版本,該軟件包名稱是軟件包名稱(docker-ce)加上版本字符串(第二列),從第一個冒號(:)一直到第一個連字符,并用連字符(-)分隔。例如:docker-ce-18.09.1。

    sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
  • 啟動Docker
  • sudo systemctl start docker
  • 運行 hello-world 鏡像驗證是否正確安裝了 Docker Engine-Community 。
  • 出現docker.io: net/http: TLS handshake timeout.問題的解決方法

    vim /etc/docker/daemon.json

    加入以下內容:

    {"registry-mirrors": ["https://dockerhub.azk8s.cn","https://hub-mirror.c.163.com"] }

    重啟dockersystemctl restart docker,使用docker info看配置是否生效

    參考資料:https://zhuanlan.zhihu.com/p/164920268

    sudo docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 0e03bdcc26d7: Pull complete Digest: sha256:d58e752213a51785838f9eed2b7a498ffa1cb3aa7f946dda11af39286c3db9a9 Status: Downloaded newer image for hello-world:latestHello from Docker! This message shows that your installation appears to be working correctly.To generate this message, Docker took the following steps:1. The Docker client contacted the Docker daemon.2. The Docker daemon pulled the "hello-world" image from the Docker Hub.(amd64)3. The Docker daemon created a new container from that image which runs theexecutable that produces the output you are currently reading.4. The Docker daemon streamed that output to the Docker client, which sent itto your terminal.To try something more ambitious, you can run an Ubuntu container with:$ docker run -it ubuntu bashShare images, automate workflows, and more with a free Docker ID:https://hub.docker.com/For more examples and ideas, visit:https://docs.docker.com/get-started/
  • 運行docker image ls列出下載到計算機上的鏡像
  • 列出hello-world顯示消息后退出的容器(由圖像生成)。如果它仍在運行,則不需要以下--all選項
  • 安裝docker-compose

    pip install docker-compose

    資料:
    https://blog.csdn.net/q0717168/article/details/109361349

    2.3 制作Docker鏡像

  • 通過Git下載一個示例項目
  • git clone https://github.com/dockersamples/node-bulletin-board cd node-bulletin-board/bulletin-board-app
  • 為一個容器定義Dockerfile
    Dockerfile描述了如何為一個容器安裝專有的文件系統,同時也可以包含一些元數據(metadata)來描述如何基于此鏡像運行一個容器。
    Dockerfile示例
  • # 使用官方鏡像作為父鏡像 FROM node:current-slim# 設置工作目錄 WORKDIR /usr/src/app# 將文件從主機復制到當前位置 COPY package.json .# 在鏡像文件系統中運行該命令 RUN npm install# 通知Docker容器在運行時監聽指定的端口 EXPOSE 8080# 在容器中運行指定的命令 CMD [ "npm", "start" ]# 將應用程序的其余源代碼從主機復制到鏡像文件系統 COPY . .
  • 使用docker build命令通過Dockerfile文件構建鏡像
    首先確保當前路徑位于項目執行目錄下。
  • docker build --tag bulletinboard:1.0 . Sending build context to Docker daemon 45.57kB Step 1/7 : FROM node:current-slim current-slim: Pulling from library/node 7d2977b12acb: Pull complete 23e9a36a6e2d: Pull complete 831103f0eed4: Pull complete f172d5646bed: Pull complete 9f1d0c9b6ec5: Pull complete Digest: sha256:4f837156a4bc43b6c8af7195dd7dbfc0b46e6f3515f777e2cb53139dc4faee33 Status: Downloaded newer image for node:current-slim---> 0e2e78467169 ... Step 6/7 : CMD [ "npm", "start" ]---> Running in 5fb8e209296e Removing intermediate container 5fb8e209296e---> 609ae5029141 Step 7/7 : COPY . .---> 2cfe87792e72 Successfully built 2cfe87792e72 Successfully tagged bulletinboard:1.0

    Successfully tagged bulletinboard:1.0看到這個說明鏡像構建成功

  • 基于鏡像來啟動容器
  • docker run --publish 8000:8080 --detach --name bb bulletinboard:1.0

    –publish 要求Docker將主機端口8000上傳入的流量轉發到容器的端口8080。容器具有自己的專用端口集,因此,如果要從網絡訪問某個端口,則必須以這種方式將流量轉發到該端口。否則,作為默認的安全狀態,防火墻規則將阻止所有網絡流量到達您的容器。
    –detach 要求Docker在后臺運行此容器。
    –name 指定一個名稱,在后續命令中,您可以使用該名稱來引用您的容器bb

  • 刪除容器
  • docker rm --force bb

    2.4 在Docker Hub上共享鏡像

    2.4.1 創建Docker Hub賬戶

  • 訪問Docker注冊頁面
  • 創建Docker ID
  • 使用docker login登錄Docker Hub
  • docker login Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one. Username: Password: WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded

    2.4.2 創建Docker Hub倉庫并推送鏡像到倉庫中

  • 在Docker Hub倉庫界面下搜索或創建倉庫
  • 鏡像命名格式必須正確<Your Docker ID>/<Repository Name>:<tag>
    修改鏡像名稱
  • docker tag bulletinboard:1.0 <Your Docker ID>/bulletinboard:1.0
  • 將鏡像推送到Docker Hub
  • docker push <Your Docker ID>/bulletinboard:1.0

    2.5 Docker部署自定義mysql

    在官方倉庫的mysql鏡像頁面也有較為詳細的描述。傳送門

  • 這里采取重新構建鏡像的方式,設置監聽端口后再重新外掛配置文件,構建時需要兩個文件Dockerfile和docker-entrypoint.sh獲取地址
  • 本地新建配置文件/home/mysql_config_volume/my.cnf
    直接外掛配置文件修改端口的方式是不行的,因為鏡像在構建時設置的監聽端口是3306或33060,外掛的配置文件修改端口為別的會出現錯誤,mysql無法啟動,在XXX路徑下確實套接字文件
  • 在docker hub上搜索mysql,選擇版本進行下載docker pull mysql:5.7.30
  • 拉取鏡像到本地docker pull mysql:5.7.30
  • 運行docker run --name mysqldef -e MYSQL_ROOT_PASSWORD=123456 -p 8060:8060 -d mysql:5.7.30
  • docker ps查看運行狀態和id
  • 進入docker查看配置文件位置,拉取配置文件到本地
  • docker cp 95e2bc0c1955:/etc/mysql/my.cnf /home docker cp 95e2bc0c1955:/etc/mysql/cnf.d /home docker cp 95e2bc0c1955:/etc/mysql/conf.d /home docker cp 95e2bc0c1955:/etc/mysql/mysql.cnf /home docker cp 95e2bc0c1955:/etc/mysql/mysql.conf.d /home

    挨個查看后mysql.cnf內有如下內容:

    # Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. # # This program is free software; you can redistribute it and/or modify #... #... #... # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA!includedir /etc/mysql/conf.d/ !includedir /etc/mysql/mysql.conf.d/

    說明該文件是引用/etc/mysql/conf.d/ 和 /etc/mysql/mysql.conf.d/打開后查看,發現有[mysql]字段

    [mysql]

    mysqld.cnf內有如下字段,so,這個就可以作為配置文件

    # Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License, version 2.0, # as published by the Free Software Foundation. # # This program is also distributed with certain software (including # but not limited to OpenSSL) that is licensed under separate terms, # as designated in a particular file or component or in included license # documentation. The authors of MySQL hereby grant you an additional # permission to link the program and your derivative works with the # separately licensed software that they have included with MySQL. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License, version 2.0, for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA# # The MySQL Server configuration file. # # For explanations see # http://dev.mysql.com/doc/mysql/en/server-system-variables.html[mysqld] pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock datadir = /var/lib/mysql #log-error = /var/log/mysql/error.log # By default we only accept connections from localhost #bind-address = 127.0.0.1 # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0

    在復制到本地的mysqld.cnf內加入以下內容:

    #[mysqld]下追加 init_connect='SET collation_connection = utf8_unicode_ci' init_connect='SET NAMES utf8' character-set-server=utf8 collation-server=utf8_unicode_ci skip-character-set-client-handshake port=8060#新增 [client] default-character-set=utf8#新增 [mysql] default-character-set=utf8
  • 根據使用的鏡像mysql:5.7.30的DockerFile文件,進行修改后重新構建鏡像
    我使用的鏡像的dockerfile文件鏈接:傳送門
    修改內容:
  • EXPOSE 3306 33060 改為 EXPOSE 8060文件最下方的 RUN ln -s usr/local/bin/docker-entrypoint.sh /entrypoint.sh # backwards compat 改為 RUN chmod 777 /usr/local/bin/docker-entrypoint.sh \&& ln -s /usr/local/bin/docker-entrypoint.sh /
  • 運行命令docker build --tag tutumysqldef:1.0 .開始構建鏡像
  • 如果Get:5 http://deb.debian.org/debian XXX XXX Packages [XXX kB]速度過慢,可以考慮換源
    在dockerfile同級路徑下創建source.list,在里面添加如下內容

    deb https://mirrors.aliyun.com/debian/ jessie main non-free contrib deb https://mirrors.aliyun.com/debian/ jessie-updates main non-free contrib deb https://mirrors.aliyun.com/debian/ jessie-backports main non-free contrib deb-src https://mirrors.aliyun.com/debian/ jessie main non-free contrib deb-src https://mirrors.aliyun.com/debian/ jessie-updates main non-free contrib deb-src https://mirrors.aliyun.com/debian/ jessie-backports main non-free contrib deb https://mirrors.aliyun.com/debian-security/ jessie/updates main non-free contrib deb-src https://mirrors.aliyun.com/debian-security/ jessie/updates main non-free contrib

    在dockerfile文件下追加mv /etc/apt/sources.list /etc/apt/sources.list.bak \ mv sources.list /etc/apt/這兩行代碼

    FROM debian:buster-slim# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added RUN groupadd -r mysql && useradd -r -g mysql mysqlRUN apt-get update && apt-get install -y --no-install-recommends gnupg dirmngr && rm -rf /var/lib/apt/lists/* \mv /etc/apt/sources.list /etc/apt/sources.list.bak \mv sources.list /etc/apt/

    重新執行構建命令

    ps:構建過程挺費時間的🙃

  • 在看到Successfully built 1586b8bca605 和 Successfully tagged tutumysqldef:1.0說明構建成功!
  • Removing intermediate container 888c469c23b3---> 2d1b737ab012 Step 18/18 : CMD ["mysqld"]---> Running in 7405cd981558 Removing intermediate container 7405cd981558---> 1586b8bca605 Successfully built 1586b8bca605 Successfully tagged tutumysqldef:1.0 [root@iZ8vbbex0a45m3rtafksvkZ mysql_def]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE tutumysqldef 1.0 1586b8bca605 26 seconds ago 448MB

    10.使用命令 docker run -idt -p 8060:8060 --name=tutumysql -e MYSQL_ROOT_PASSWORD=123456 tutumysqldef:1.0先運行測試以下,發現容器正常啟動。

    docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6bb22f5bf373 tutumysqldef:1.0 "docker-entrypoint.s…" 7 seconds ago Up 6 seconds 0.0.0.0:8060->8060/tcp tutumysql 160cc39672e6 scrapinghub/splash:3.5.0 "python3 /app/bin/sp…" 5 days ago Up 5 days 0.0.0.0:8050->8050/tcp reverent_darwin

    停止容器,刪除容器,外掛配置文件、數據卷、日志卷重新運行

  • 本地新建數據卷路徑/home/mysql_def/mysql_data_volume/
  • 本地新建日志卷路徑/home/mysql_def/mysql_logs/message.log,暫時掛不上,后面再找找方法。
  • 將配置文件移動到mv /home/mysql.conf.d /home/mysql_def/
  • 后臺運行mysql并掛載配置文件和本地數據卷、日志卷
  • docker run -idt -p 8060:8060 -v /home/mysql_def/mysql.conf.d/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf -v /home/mysql_def/mysql_data_volume:/var/lib/mysql --name=tutumysql -e MYSQL_ROOT_PASSWORD=123456 tutumysqldef:1.0

    -v /home/mysql_def/mysql_logs/message.log:/var/log/mysql/message.log
    注意:-it參數是必須的,因為容器中啟動mysql后,mysql進程需要一個終端用于交互,-t參數就是在容器中打開一個偽終端,-i參數是打開標準輸入并綁定到偽終端。容器中沒有為mysql分配終端會導致其進入Exited (1)

  • 使用docker ps查看mysql是否啟動成功
  • 524ae1917431047c04d748d37c47fb20e48d0bb23e43f733afb1537d175bc792 docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 524ae1917431 tutumysqldef:1.0 "docker-entrypoint.s…" 4 seconds ago Up 3 seconds 0.0.0.0:8060->8060/tcp tutumysql
  • 使用docker inspect 524ae1917431查看容器內mysql的信息
  • "Name": "/tutumysql","RestartCount": 0,"Driver": "overlay2","Platform": "linux","MountLabel": "","ProcessLabel": "","AppArmorProfile": "","ExecIDs": null,"HostConfig": {"Binds": ["/home/mysql_def/mysql.conf.d/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf","/home/mysql_def/mysql_data_volume:/var/lib/mysql"],"ContainerIDFile": "","LogConfig": {"Type": "json-file","Config": {}},"NetworkMode": "default","PortBindings": {"8060/tcp": [{"HostIp": "","HostPort": "8060"}]},"RestartPolicy": {"Name": "no","MaximumRetryCount": 0},
  • 進入容器docker exec -it 524ae1917431 /bin/bash,進入mysql cmdmysql -u root -p
    成功進入,查看相關配置信息,符合要求!成功!!!
  • Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.7.30 MySQL Community Server (GPL)Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> status; -------------- mysql Ver 14.14 Distrib 5.7.30, for Linux (x86_64) using EditLine wrapperConnection id: 2 Current database: Current user: root@localhost SSL: Not in use Current pager: stdout Using outfile: '' Using delimiter: ; Server version: 5.7.30 MySQL Community Server (GPL) Protocol version: 10 Connection: Localhost via UNIX socket Server characterset: utf8 Db characterset: utf8 Client characterset: utf8 Conn. characterset: utf8 UNIX socket: /var/run/mysqld/mysqld.sock Uptime: 5 min 49 secThreads: 1 Questions: 5 Slow queries: 0 Opens: 105 Flush tables: 1 Open tables: 98 Queries per second avg: 0.014 -------------- mysql> show global variables like 'port'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | port | 8060 | +---------------+-------+ 1 row in set (0.00 sec)

    賦予root用戶權限

    use mysql;GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' IDENTIFIED BY '123456' WITH GRANT OPTION;flush privileges;

    GRANT ALL PRIVILEGES ON . TO ‘root’@’%’ IDENTIFIED BY ‘123456’ WITH GRANT OPTION;
    flush privileges;重新加載權限表
    GRANT:賦權命令
    ALL PRIVILEGES:當前用戶的所有權限
    ON:介詞
    *.*:當前用戶對所有數據庫和表的相應操作權限
    TO:介詞
    ‘root’@’%’:權限賦給root用戶,所有ip都能連接
    IDENTIFIED BY ‘123456’:連接時輸入密碼,密碼為123456
    WITH GRANT OPTION:允許級聯賦權

    參考資料:https://blog.csdn.net/u010953706/article/details/95985946
    參考資料:https://blog.csdn.net/coco3600/article/details/100232625

    撤銷已經賦予用戶的權限
    revoke 跟 grant 的語法差不多,需要將關鍵字 “to” 換成 “from” :
    grant all on *.* to dba@localhost;
    revoke all on *.* from dba@localhost;

    使用測試數據驗證數據庫是否可用

    cd /home git clone git@github.com:datacharmer/test_db.git#將測試數據復制到容器中 docker cp /home/test_db 524ae1917431:/home/docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 524ae1917431 tutumysqldef:1.0 "docker-entrypoint.s…" 3 days ago Up 3 days 0.0.0.0:8060->8060/tcp tutumysql 160cc39672e6 scrapinghub/splash:3.5.0 "python3 /app/bin/sp…" 8 days ago Up 8 days 0.0.0.0:8050->8050/tcp reverent_darwin#進入容器 docker exec -it 524ae1917431 /bin/bash#查看文件是否存在 root@524ae1917431:/# cd /home root@524ae1917431:/home# dir test_db#修改文件權限 chmod 755 /home/test_db#進入mysql mysql -u root -p#執行導入命令 source /home/test_db/employees.sql Query OK, 8 rows affected (0.06 sec)Query OK, 1 row affected (0.00 sec)Database changed +-----------------------------+ | INFO | +-----------------------------+ | CREATING DATABASE STRUCTURE | +-----------------------------+ 1 row in set (0.00 sec)Query OK, 0 rows affected, 6 warnings (0.00 sec) ...... ...... Query OK, 24919 rows affected (0.17 sec) Records: 24919 Duplicates: 0 Warnings: 0Query OK, 7671 rows affected (0.09 sec) Records: 7671 Duplicates: 0 Warnings: 0+---------------------+ | data_load_time_diff | +---------------------+ | 00:00:32 | +---------------------+ 1 row in set (0.00 sec)數據導入成功

    查看本地數據卷如圖,符合預期。

    遠程連接數據庫如圖,符合預期

    參考資料:https://www.cnblogs.com/zst062102/p/11132916.html

    2.6 Docker 配置mongo

  • 訪問docker hub 搜索mongo
    https://hub.docker.com/_/mongo
    docker pull mongo
    獲取鏡像到本地
    該鏡像數據存放路徑:/data/db

  • 外掛數據卷啟動mongo鏡像
    docker run --name some-mongo -v /my/own/datadir:/data/db -d mongo
    docker run -p 27017:27017 --name docker_mongo -v /home/database/mongodb/data1:/data/db -d mongo

  • 進入容器
    docker exec -it ID /bin/bash

  • 輸入以下命令進入 mongo
    mongo

  • 創建用戶
    創建管理員用戶
    db.createUser(
    {
    user: “root”,
    pwd: “123456”,
    roles: [ { role: “userAdminAnyDatabase”, db: “admin” } ]
    }
    )

  • 遠程連接的開啟
    在 mongodb 的容器當中
    修改配置文件
    將配置文件中的
    bindIp: 127.0.0.1
    注釋掉# bindIp: 127.0.0.1
    或者改成bindIp: 0.0.0.0
    即可開啟遠程連接

  • 方法1:
    更新源
    apt-get update
    安裝 vim
    apt-get install vim
    修改 mongo 配置文件
    vim /etc/mongod.conf.orig
    方法2:
    將文件cp到宿主機,修改后在cp到容器里
    docker cp 5277ac7deb96:/etc/mongod.conf.orig /home/database/mongodb/
    vim /home/database/mongodb/mongod.conf.orig
    docker cp /home/database/mongodb/mongod.conf.orig 5277ac7deb96:/etc/mongod.conf.orig

    使用遠程工具連接mongo

    參考資料:https://www.cnblogs.com/xinsen/p/10588767.html

    總結

    以上是生活随笔為你收集整理的Docker快速入门与使用的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。