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 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鏡像是多層存儲結構,鏡像中的每一層都是可繼承、可復用的。
父鏡像
每一個鏡像都可能依賴于由一個或多個下層的組成的另一個鏡像。通常將下層的那個鏡像成為上層鏡像的父鏡像。
基礎鏡像
無父鏡像的鏡像被成為基礎鏡像。
鏡像ID
所有鏡像都是通過一個 64 位十六進制字符串 (內部是一個 256 bit 的值)來標識的。 為簡化使用,前 12 個字符可以組成一個短ID,可以在命令行中使用。短ID還是有一定的 碰撞機率,所以服務器總是返回長ID。
獲取鏡像,使用docker pull <鏡像名稱:鏡像標簽>命令從倉庫中獲取需要的鏡像。
下載過程中會輸出獲取鏡像每一層的信息
若默認的官方倉庫下載速度過慢,可以使用docker pull <域名:端口號>/<鏡像名稱:鏡像標簽>指定從某個倉庫下載鏡像
也可以設置加速源或國內源,方法寫在下面,可以參照
鏡像ID唯一標識了鏡像
TAG信息用來標記同一個倉庫的不同鏡像
Dockerfile
Dockerfile 是一個用來構建鏡像的文本文件,文本內容包含了一條條構建鏡像所需的指令和說明,一些元數據(metadata)還包含以該鏡像為基礎運行的容器的行為。
一般的,Dockerfile 分為四部分:基礎鏡像信息、維護者信息、鏡像操作指令和容器啟動時執行指令。
基本語法:
使用#來注釋
FROM指令告訴 Docker 使用哪個鏡像作為基礎
接著是維護者的信息
RUN開頭的指令會在創建中運行,比如安裝一個軟件包。
FORM指令
指出使用的模板鏡像,定制鏡像都是在模板鏡像的基礎上進行。
RUN指令
用于執行后面跟著的命令行命令,有以下兩種格式:
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
1.2.3 Docker容器
容器是鏡像的的行為
-
啟動容器
兩種情形:一種是基于鏡像新建一個容器并啟動;
另外一種是將處于終止狀態(stopped)的容器重新啟動。 -
新建并啟動
docker run
示例1:使用ubuntu:14.04鏡像生成一個容器,在容器中執行/bin/echo '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 地址給容器
- 執行用戶指定的應用程序
- 執行完畢后容器被終止
容器的核心為所執行的應用程序,所需要的資源都是應用程序運行所必需的。除此之外,并沒有其它的資源。可以在偽終端中利用 ps 或 top 來查看進程信息。
更多的時候,需要讓 Docker 容器在后臺以守護態(Daemonized)形式運行。此時,可以通過添加-d參數來實現。
容器會返回一個唯一的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容器中指定的應用終結時,容器也自動終止。 例如對于上面只啟動了一個終端的容器,用戶通過 exit 命令或 Ctrl+d 來退出終端時,所創建的容器立刻終止。
終止狀態的容器可以使用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 agodocker 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:/#解析:
-t選項讓docker分配一個偽終端并綁定到標準輸入上,-i讓容器的標準輸入保持打開,-i -t通常同時出現。
-d以守護態運行容器,即容器在后臺運行
docker inspect輸出容器的低級信息,格式是Json
--format "{{ .State.Pid }}"向輸出結果傳遞參數,只查看Pid信息
fervent_lederberg容器名,上文通過docker ps命令獲取到的。
3.nsenter參數詳解
使用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:
然后,在其他容器中使用 --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 目錄。
容器啟動后,使用了 tar 命令來將 dbdata 卷備份為本地的 /backup/backup.tar
8.恢復
如果要恢復數據到一個容器,首先創建一個帶有數據卷的容器 dbdata2
然后創建另一個容器,掛載 dbdata2 的容器,并使用 untar解壓備份文件到掛載的容器卷中。
$ sudo docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar1.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 端口,可以執行
使用 ip::containerPort綁定 localhost 的任意端口到容器的 5000 端口,本地主機會自動分配一個端口。
還可以使用 udp 標記來指定 udp 端口
$ sudo docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py使用 docker port 來查看當前映射的端口配置,也可以查看到綁定的地址
注意:
容器有自己的內部網絡和 ip 地址(使用 docker inspect 可以獲取所有的變量,Docker 還可以有一個可變的網絡配置。)
-p 標記可以多次使用來綁定多個端口
例如
容器互聯
容器的連接(linking)系統是除了端口映射外,另一種跟容器中應用交互的方式。
該系統會在源和接收容器之間創建一個隧道,接收容器可以看到源容器指定的信息。
自定義容器命名
連接系統依據容器的名稱來執行。因此,首先需要自定義一個好記的容器命名。
雖然當創建容器的時候,系統默認會分配一個名字。自定義命名容器有2個好處:
自定義的命名,比較好記,比如一個web應用容器我們可以給它起名叫web
當要連接其他容器時候,可以作為一個有用的參考點,比如連接web容器到db容器
使用 --name標記可以為容器自定義命名。
使用 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參數不能同時使用。
下面先創建一個新的數據庫容器。
刪除之前創建的 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來查看容器的連接
可以看到自定義命名的容器,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 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
設置倉庫,首先安裝依賴
使用阿里源地址設置穩定的倉庫
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-ce)加上版本字符串(第二列),從第一個冒號(:)一直到第一個連字符,并用連字符(-)分隔。例如:docker-ce-18.09.1。
sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io出現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-compose
pip install docker-compose
資料:
https://blog.csdn.net/q0717168/article/details/109361349
2.3 制作Docker鏡像
Dockerfile描述了如何為一個容器安裝專有的文件系統,同時也可以包含一些元數據(metadata)來描述如何基于此鏡像運行一個容器。
Dockerfile示例
首先確保當前路徑位于項目執行目錄下。
Successfully tagged bulletinboard:1.0看到這個說明鏡像構建成功
–publish 要求Docker將主機端口8000上傳入的流量轉發到容器的端口8080。容器具有自己的專用端口集,因此,如果要從網絡訪問某個端口,則必須以這種方式將流量轉發到該端口。否則,作為默認的安全狀態,防火墻規則將阻止所有網絡流量到達您的容器。
–detach 要求Docker在后臺運行此容器。
–name 指定一個名稱,在后續命令中,您可以使用該名稱來引用您的容器bb
2.4 在Docker Hub上共享鏡像
2.4.1 創建Docker Hub賬戶
2.4.2 創建Docker Hub倉庫并推送鏡像到倉庫中
修改鏡像名稱
2.5 Docker部署自定義mysql
在官方倉庫的mysql鏡像頁面也有較為詳細的描述。傳送門
直接外掛配置文件修改端口的方式是不行的,因為鏡像在構建時設置的監聽端口是3306或33060,外掛的配置文件修改端口為別的會出現錯誤,mysql無法啟動,在XXX路徑下確實套接字文件
挨個查看后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我使用的鏡像的dockerfile文件鏈接:傳送門
修改內容:
如果Get:5 http://deb.debian.org/debian XXX XXX Packages [XXX kB]速度過慢,可以考慮換源
在dockerfile同級路徑下創建source.list,在里面添加如下內容
在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:構建過程挺費時間的🙃
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停止容器,刪除容器,外掛配置文件、數據卷、日志卷重新運行
-v /home/mysql_def/mysql_logs/message.log:/var/log/mysql/message.log
注意:-it參數是必須的,因為容器中啟動mysql后,mysql進程需要一個終端用于交互,-t參數就是在容器中打開一個偽終端,-i參數是打開標準輸入并綁定到偽終端。容器中沒有為mysql分配終端會導致其進入Exited (1)
成功進入,查看相關配置信息,符合要求!成功!!!
賦予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快速入门与使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 栈与队列的定义与区别
- 下一篇: html 文字竖排效果