Docker快速入門與使用

學習資料

  1. Docker中文文檔
    推薦

  2. Docker Documents
    推薦,原汁原味,更直接

  3. 菜鳥教程-Docker

  4. 爲什麼Docker鏡像大小與倉庫中不一致?

  5. docker命令

  6. Docker查看遠端倉庫中某個應用全部標籤的工具

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

  8. nsenter命令簡介

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

  10. docker學習筆記–重基礎使用

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

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

  13. “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\}打包成鏡像文件,鏡像文件展開後恢復成多個文件的集合θ\theta,前後數據內容完全一致。

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

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

在這裏插入圖片描述
關鍵名詞

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

1.2.2 Docker 鏡像

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

  1. 父鏡像
    每一個鏡像都可能依賴於由一個或多個下層的組成的另一個鏡像。通常將下層的那個鏡像成爲上層鏡像的父鏡像。

  2. 基礎鏡像
    無父鏡像的鏡像被成爲基礎鏡像。

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

  4. 獲取鏡像,使用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 <域名:端口號>/<鏡像名稱:鏡像標籤>指定從某個倉庫下載鏡像
也可以設置加速源或國內源,方法寫在下面,可以參照

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

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

Dockerfile

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

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

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

  1. shell 格式:
RUN <命令行命令>
# <命令行命令> 等同於,在終端操作的 shell 命令。
  1. 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 << HELP
 
dockertags  --  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 apache
 
HELP
}
 
 
 
if [ $# -lt 1 ]; then
    usage
    exit
fi
 
image="$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" ]; then
    tags=` 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 地址給容器
  • 執行用戶指定的應用程序
  • 執行完畢後容器被終止
  1. 啓動已終止的容器,docker start
    容器的核心爲所執行的應用程序,所需要的資源都是應用程序運行所必需的。除此之外,並沒有其它的資源。可以在僞終端中利用 ps 或 top 來查看進程信息。
root@ba267838cc1b:/# ps
  PID TTY          TIME CMD
    1 ?        00:00:00 bash
   11 ?        00:00:00 ps
  1. 守護態運行
    更多的時候,需要讓 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
. . .
  1. 終止容器,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_swanson

docker 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:/#

解析:

  1. docker run -idt ubuntu:
    -t選項讓docker分配一個僞終端並綁定到標準輸入上,-i讓容器的標準輸入保持打開,-i -t通常同時出現。
    -d以守護態運行容器,即容器在後臺運行
  2. 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

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

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

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

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

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

  4. 數據卷容器
    如果你有一些持續更新的數據需要在容器之間共享,最好創建數據卷容器。
    數據卷容器,其實就是一個正常的容器,專門用來提供數據卷供其它容器掛載的。
    首先,創建一個命名的數據卷容器 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命令來指定同時刪除關聯的容器。 這可以讓用戶在容器之間升級和移動數據卷。具體的操作將在下一節中進行講解。

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

  2. 備份
    首先使用 --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 使用網絡

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

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

$ sudo docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
  1. 映射到指定地址的任意端口
    使用 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
  1. 查看映射端口配置
    使用 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
  1. 容器互聯
    容器的連接(linking)系統是除了端口映射外,另一種跟容器中應用交互的方式。
    該系統會在源和接收容器之間創建一個隧道,接收容器可以看到源容器指定的信息。

  2. 自定義容器命名
    連接系統依據容器的名稱來執行。因此,首先需要自定義一個好記的容器命名。
    雖然當創建容器的時候,系統默認會分配一個名字。自定義命名容器有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參數不能同時使用。

  1. 使用 --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 容器上。

二、使用

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

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

2.2 CentOS 7 手動安裝Docker

  1. 存在就刪除舊版本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 沒有匹配
不刪除任何軟件包

  1. 首次安裝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

  1. 安裝 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

完畢!
  1. 安裝指定版本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
  1. 啓動Docker
sudo systemctl start docker
  1. 運行 hello-world 鏡像驗證是否正確安裝了 Docker Engine-Community 。
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:latest

Hello 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 the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share 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/

  1. 運行docker image ls列出下載到計算機上的鏡像
  2. 列出hello-world顯示消息後退出的容器(由圖像生成)。如果它仍在運行,則不需要以下--all選項

2.3 製作Docker鏡像

  1. 通過Git下載一個示例項目
git clone https://github.com/dockersamples/node-bulletin-board
cd node-bulletin-board/bulletin-board-app
  1. 爲一個容器定義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 . .
  1. 使用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看到這個說明鏡像構建成功

  1. 基於鏡像來啓動容器
docker run --publish 8000:8080 --detach --name bb bulletinboard:1.0

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

  1. 刪除容器
docker rm --force bb

2.4 在Docker Hub上共享鏡像

2.4.1 創建Docker Hub賬戶

  1. 訪問Docker註冊頁面
  2. 創建Docker ID
  3. 使用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-store

Login Succeeded

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

  1. Docker Hub倉庫界面下搜索或創建倉庫
  2. 鏡像命名格式必須正確<Your Docker ID>/<Repository Name>:<tag>
    修改鏡像名稱
docker tag bulletinboard:1.0 <Your Docker ID>/bulletinboard:1.0

  1. 將鏡像推送到Docker Hub
docker push <Your Docker ID>/bulletinboard:1.0

2.5 Docker部署自定義mysql

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

  1. 這裏採取重新構建鏡像的方式,設置監聽端口後再重新外掛配置文件,構建時需要兩個文件Dockerfile和docker-entrypoint.sh獲取地址
  1. 本地新建配置文件/home/mysql_config_volume/my.cnf
    直接外掛配置文件修改端口的方式是不行的,因爲鏡像在構建時設置的監聽端口是3306或33060,外掛的配置文件修改端口爲別的會出現錯誤,mysql無法啓動,在XXX路徑下確實套接字文件
  1. 在docker hub上搜索mysql,選擇版本進行下載docker pull mysql:5.7.30
  2. 拉取鏡像到本地docker pull mysql:5.7.30
  3. 運行docker run --name mysqldef -e MYSQL_ROOT_PASSWORD=123456 -p 8060:8060 -d mysql:5.7.30
  4. docker ps查看運行狀態和id
  5. 進入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
  1. 根據使用的鏡像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 /
  1. 運行命令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 mysql

RUN 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:構建過程挺費時間的🙃

  1. 在看到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

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

  1. 本地新建數據卷路徑/home/mysql_def/mysql_data_volume/
  2. 本地新建日誌卷路徑/home/mysql_def/mysql_logs/message.log,暫時掛不上,後面再找找方法。
  3. 將配置文件移動到mv /home/mysql.conf.d /home/mysql_def/
  4. 後臺運行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)

  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
  1. 使用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
            },
  1. 進入容器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 wrapper

Connection 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 sec

Threads: 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;

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 [email protected]: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: 0

Query 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章