Docker概述
**本人博客網站 **IT小神 www.itxiaoshen.com
Docker是一個用於開發、發布和運行應用程序的開放平台。Docker使您能夠將應用程序與基礎設施分離開來,以便快速交付軟件。使用Docker,您可以以與管理應用程序相同的方式管理基礎設施。通過利用Docker快速發布、測試和部署代碼的方法,您可以顯著減少編寫代碼和在生產環境中運行代碼之間的延遲。
docker為什么會出現
簡單的說就是我們開發軟件是需要部署還包括基礎環境如mysql、redis、jdk和基礎數據等,且還需重復部署很多台服務器,部署環境又有開發環境、測試環境、預生產環境、正式線上環境等,從開發-測試-運維都是很費力費時,特別是由於環境依賴等問題有時需要耗費較大時間解決,有了docker可以把上面問題解決,docker圖標上面就有集裝箱圖標,這個比喻很恰當,docker將所有內容存在集裝箱內,搬運至任何地方;而docker的核心思想也就是打包裝箱,每個箱子之間互相隔離,而docker也是利用隔離機制將服務器利用到極致。
docker能做什么
- 開發人員在本地編寫代碼,並使用Docker容器與同事分享他們的工作成果。
- 使用Docker將應用程序推入測試環境,並執行自動和手動測試。
- 當開發人員發現錯誤時,可以在開發環境中修復它們,並將它們重新部署到測試環境中進行測試和驗證。
- 測試完成后,向客戶獲取修復就像將更新后的映像推入生產環境一樣簡單。
在DevOps時代可以更快的交付和部署,docker容器是直接運行在宿主機上,沒有自己的內核和硬件,所以運行很輕便,每個容器間是互相隔離的,都有自己文件系統不影響;docker可以打包鏡像發布實現一鍵運行,使用docker我們可以像搭積木一樣增加一層層鏡像實現,docker是內核級別的虛擬化,比虛擬機更少的抽象層,一台物理機上可以運行很多的容器示例,可以把服務器性能壓榨到極致。
docker歷史
2010年,幾個大胡子年輕人在舊金山成立了一家做 PaaS 平台的公司,起名為dotCloud,專注於LXC容器化技術,docker剛誕生沒有引起行業的主體,剛開始發展不太如意。2013年10月 dotCloud 公司更名為 Docker 股份有限公司,2014年8月 Docker 宣布把平台即服務的業務「dotCloud」出售給位於德國柏林的平台即服務提供商「cloudControl」,dotCloud 的歷史告一段落
2013年docker開源,越來越多人發現docker這個寶藏,與虛擬機技術vmware相比,vmware鏡像經常是幾個G,啟動要幾分鍾,而docker非常輕巧,docker直接運行鏡像就可以了,秒級啟動服務,太厲害了
docker架構基本組成
Docker使用客戶-服務器架構。Docker客戶端與Docker守護進程對話,后者負責構建、運行和分發Docker容器。Docker客戶端和守護進程可以運行在同一個系統上,或者您可以將一個Docker客戶端連接到一個遠程Docker守護進程。Docker客戶端和守護進程使用REST API通過UNIX套接字或網絡接口進行通信。另一個Docker客戶端是Docker Compose,它允許您使用由一組容器組成的應用程序。
- Docker daemon:Docker守護進程(dockerd)監聽Docker API請求,管理Docker對象,如鏡像、容器、網絡和卷。一個守護進程也可以與其他守護進程通信來管理Docker服務。
- Docker client:Docker客戶端(Docker)是許多Docker用戶與Docker交互的主要方式。當您使用諸如docker run之類的命令時,客戶端將這些命令發送給dockerd,由dockerd執行這些命令。docker命令使用docker API。Docker客戶端可以與多個守護進程通信。
- Docker registries:Docker注冊表存儲Docker鏡像。Docker Hub是一個任何人都可以使用的公共注冊表,Docker默認配置為在Docker Hub上查找映像。您甚至可以運行自己的私有注冊表。
- Images:鏡像是一個只讀模板,包含創建Docker容器的說明。通常,一個鏡像基於另一個鏡像,並進行一些額外的定制。例如,您可以構建一個基於ubuntu鏡像的鏡像,但是安裝Apache web服務器和您的應用程序,以及使您的應用程序運行所需的配置細節。
- Containers:容器是鏡像的可運行實例。您可以使用Docker API或CLI創建、啟動、停止、移動或刪除容器。您可以將容器連接到一個或多個網絡,為其附加存儲,甚至根據其當前狀態創建新鏡像。
簡單理解,docker宿主機是docker核心引擎,用於下載鏡像和運行容器,鏡像就好比我們Java中的類,而容器就是類New出來的對象;docker registry如docker hub 就好比maven中央倉庫,用於存放制作好的docker鏡像,也支持本地私有部署如docker harbor,可以通過docker push或docker pull 進行上傳或下載鏡像;而docker client就是我們操作docker宿主機的一個命令行工具
底層技術
Docker是用Go編程語言編寫的,並利用了Linux內核的若干特性來交付其功能。Docker使用名為名稱空間的技術來提供名為容器的獨立工作區。當您運行一個容器時,Docker會為該容器創建一組名稱空間。這些名稱空間提供了一個隔離層。容器的每個方面都運行在一個單獨的名稱空間中,它的訪問僅限於該名稱空間。
安裝Docker環境
[docker安裝官網地址](https://docs.docker.com/engine/install/centos/)
詳細參考官網,官網有非常詳細安裝說明
#如果安裝過docker刪除已安裝docker版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
#安裝最新版本的docker核心引擎、命令行客戶端、容器
sudo yum install docker-ce docker-ce-cli containerd.io
#如果要安裝特定版本的Docker引擎,請在repo中列出可用的版本,然后選擇並安裝
yum list docker-ce --showduplicates | sort -r
sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
#啟動docker
sudo systemctl start docker
#運行hello-world容器
sudo docker run hello-world
安裝完畢后檢查下版本和測試hello-world如有如下顯示就可以盡情使用單機版的docker了,注意這個只是單機的玩具,如果想要在單機編排運行容器得使用docker-compose,如果要用到docker集群得使用docker swarm。
所以我們再安裝docker-compose,docker-compose安裝非常簡單,直接將docker-compose可行性文件拷貝到系統的/usr/local/bin,然后通過sudo chmod +x /usr/local/bin/docker-compose賦予執行文件權限即可,docker-compose可執行文件可到docker的GitHub去獲取;我的虛擬機是CentOS Linux release 8.3.2011,所以我們選擇這里選擇Docker for Linux安裝,
配置阿里雲鏡像
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://f9dk003m.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Docker命令
docker 文檔
幫助命令
docker verison
docker info
docker --help
常用命令
docker images
--all , -a 顯示所有鏡像
--digests 顯示摘要
--filter , -f 條件過濾輸出
--format 使用Go模板打印漂亮的圖像
--no-trunc 不截斷輸出
--quiet , -q 只顯示圖像id
docker search mysql --no-trunc //查找鏡像
docker pull tomcat //拉取鏡像,如果不寫tag就是默認latest即最新版本,比如要指定安裝mysql5.7則在后面直接:5.7即可,下面有很多Pull complete則代表的是一層層的鏡像進行分層下載,這個也是docker image的核心,屬於聯合文件系統
docker run --name nginx-test -p 8080:80 -d nginx //運行容器,如果本地沒有image鏡像文件則會先執行pull拉取鏡像,--name為容器名字用於區分容器,-p有幾種寫法,這里是一種,前面的對外暴露8080端口,外部要訪問容器80端口則是通過宿主機的8080端口映射實現,映射容器內部端口80,nginx默認配置端口為80, -d后台運行;其他還有很多參數如-it使用交互式方式運行,進入容器查看內容,--rm是停止容器后直接刪除容器數據
我的docker宿主機為192.168.3.117 訪問8080
docker ps //查看運行容器 加-a則查詢全部容器
docker images //顯示全部鏡像
docker push //上傳鏡像,上傳鏡像需要先執行登錄
docker login //docker倉庫地址 -u 用戶名 -p 密碼,退出
docker login out //退出登錄
docker create //創建一個新的容器,和run的差別就是不啟動容器
docker start //啟動容器編號或名稱
docker stop //停止容器編號或名稱
docker restart //重啟容器編號或名稱
docker kill //殺掉編號的容器
docker pause //暫停容器
docker unpause //取消暫停容器
docker rm //刪除容器編號或名稱,不能刪除運行中容器,可以先執行stop后再刪除
docker rmi //刪除鏡像編號,刪除該鏡像得先刪除該鏡像所有的容器-f可以刪除多個容器,如果全部刪除docker rmi -f $(docker images -aq)
docker cp //可以從宿主機拷貝容器,也可以從容器拷貝宿主機
docker top //查看容器內的top命令
docker build //通過Dockerfile只做鏡像-t 鏡像名稱 然后路徑 .為當前路徑
docker commit //提交當前鏡像為新的鏡像
docker save //保存一個鏡像為tar包
docker tag //給docker中的鏡像打標簽
docker load //從一個tar包加載鏡像
docker history //展示一個鏡像的形成歷史
docker diff //查看容器的變化
docker import //導出容器的內容流到一個tar歸檔文件tar歸檔文件
docker export //從一個tar歸檔文件tar歸檔文件導入創建為一個新的文件鏡像
docker logs -ft --tail 10 97d71a3ecb35 //查看容器的日志 -ft顯示日志 --tail 日志顯示行數
docker exec -it 97d71a3ecb35 /bin/bash //進入容器內部 -it使用交互式方式運行,容器內執行exit退出
docker attach 97d71a3ecb35 //連接到正在運行中的容器,容器輸出會打印控制台,ctrl+c終端退出容器也會停止
docker inspect 97d71a3ecb35 //查看容器/鏡像的元數據如容器的主機配置、掛載、網絡設置
部署ES
docker-hub官網 需要注冊docker的賬號,頁面搜索 elasticsearch,要部署其他軟件也是類似操作
ES需要暴露端口較多,十分占用內存,數據需要放到安全目錄,--net somenetwork進行網絡配置,這些后面我們詳細說明,這里只是引入概念入門理解
docker network create somenetwork //創建用戶定義的網絡(用於連接到連接到同一網絡的其他服務(如Kibana))
docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.14.0 //運行Elasticsearch
docker stats //查看容器的物理資源使用情況
訪問ES 9200端口,這個是暴露ES RESTful接口端口號,http://192.168.3.117:9200/
我們通過-e設置虛擬機參數修改ES運行的內存
[root@localhost ~]# docker stop 0daa832636720daa83263672[root@localhost ~]# docker rm 0daa83263672[root@localhost ~]# docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms516m -Xmx1024m" elasticsearch:7.14.0 //運行Elasticsearch
Docker 鏡像
什么是鏡像
鏡像是一種輕量級,可執行的獨立軟件包,用來打包軟件運行環境和基於環境開發的軟件,它包含運行某個軟件所需的所有內容,包括代碼、運行時庫,環境變量和配置文件, 所有的應用,直接打包docker鏡像,就可以直接跑起來
如何得到鏡像呢
- 從遠程倉庫下載
- 別人拷貝給你
- 本地commit鏡像,可以獲取對於鏡像配置,比如安裝基礎的命令和工具操作系統鏡像,安裝一個標准大數據節點鏡像
- 自己通過Dockerfile制作一個鏡像
鏡像加載原理
- UnionFS(聯合文件系統) :Union(聯合文件系統)是一種分層,輕量級並且高性能的文件系統,它支持對文件系統的修改作為一次提交來層層的疊加,同時可以將不同目錄掛載到同一個虛擬文件系統下(unite several directories into a single virtual filesystem). Union文件系統是Docker 鏡像的基礎,鏡像可以通過分層來進行繼承,基於基礎鏡像,可以制作一種具體的應用鏡像。一次同時加載多個文件系統,但從外面看起來,只能看到一個文件系統,聯合加載會把各層文件系統疊加起來,這樣最終的文件系統會包含所有的底層的文件和目錄
- Docker鏡像加載原理:docker的鏡像實際上由一層一層的文件系統組成,這種層級的文件系統UnionFS,bootfs(boot file system)主要包含bootloader 和kernel, bootloader 主要是引導加載kernel, Linux剛啟動的時候會加載bootfs文件系統,在Docker鏡像的最底層是bootfs. 這一層與我們典型的Linux/Unix系統是一樣的,包含boot加載器和內核,當boot加載完成之后整個內核就都在內存中了,此時內存的使用權已由bootfs轉交給內核,此時系統也會卸載bootfs
rootfs(root file system) ,在bootfs之上,包含的就是典型的Linux系統 中 /dev 、/proc 、 /bin, /etc等標准目錄和文件。rootfs就是各種不同的操作系統發行版,比如Ubuntu,CentOS等等。平時我們安裝進虛擬機的CentOS都好幾個G,而Docker這里才209M,對於一個精簡的OS , rootfs可以很小,只需要包含最基本的命令,工具和程序庫就可以了,因為底層直接用宿主機的內核,自己只需要提供rootfs就可以了,由此可見對於不同的Linux發行版,bootfs基本是一致的,rootfs會有差別,因此不同的發行生版可以公用bootfs
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-sA3YOxBS-1629904012586)(image-20210825135001005.png)]
- docker分層鏡像:一個鏡像有很多層,前面我們執行pull、run、inspect命令就有看到,docker分層最大作用就是實現資源共享,Docker鏡像都是只讀的,當容器啟動時,一個新的可寫層被加載到鏡像的頂部,這一層就是我們通常說的容器層,容器之下都叫鏡像層。
容器數據卷
定義
docker 的理念將應用和環境打包成一個鏡像, 如果數據都在容器中,那么我們容器被刪除,數據就會丟失! 怎樣可以把容器數據持久化
比如Mysql,docker設計了一個容器之間數據共享技術,Docker容器中產生的數據同步到本地 ---------這就是數據卷技術,目錄的掛載,將我們容器的目錄,掛載到Linux上面!簡單說就是容器的持久化和同步操作,容器間也是可以數據共享的
如何使用數據卷
一種方式是可以直接通過命令docker run -v方式掛載 ,掛載三種形式,也可以通過Dockerfile文件來實現掛載,這個下一小節再說
docker run -d -P --name nginx-itxs01 -v /etc/nginx nginx //匿名掛載
docker run -d -P --name nginx-itxs02 -v my_nginx:/etc/nginx nginx //具名掛載
docker run -d -P --name nginx-itxs03 -v /home/docker/root:/etc/nginx nginx //指定路徑掛載!
掛載后我們便可以實現從宿主機上修改nginx.conf配置文件實現配置更改,放置頁面實現靜態資源的更新
Dockerfile
Dockerfile了解
Dockerfile 就是用來構建docker鏡像的構建文件!通過這個腳本可以生成鏡像,鏡像是一層一層的,一個個的命令,每個命令都是一層!
先手工寫一個簡單Dockerfile並build成鏡像,可以看到在容器內掛載兩個目錄
通過docker inspect也可以查看到掛載信息,如果在宿主機或者容器內修改掛載目錄下的內容,兩邊都會數據同步
常用命令
FROM--------------- # 基礎鏡像,一切從這里開始構建
MAINTAINER---- # 鏡像是誰寫的,姓名+郵箱
RUN --------------- # 鏡像構建的時候需要運行的命令
ADD --------------- # 步驟:tomcat鏡像,這個tomcat壓縮包,添加內容
WORKDIR--------- #鏡像的工作目錄
VOLUME---------- #掛載的目錄
EXPOST----------- # 保留端口配置
CMD----------------- # 指定這個容器啟動的時候要運行的命令,只有最后一個會生效,可被替代
ENTRYPOINT---- # 指定這個容器啟動的時候要運行的命令,可以追加命令
ONBUILD----------- # 當構建一個被繼承 DockerFile 這個時候就會運行 ONBUILD 的命令,觸發指令
COPY-----------------# 類似ADD 將我們文件拷貝到鏡像中
ENV-------------------# 構建的時候設置環境變量
數據卷容器
volumes-from 容器間傳遞共享
當我們在使用docker容器的時候,會產生一系列的數據文件,這些數據文件在我們關閉docker容器時是會消失的,但是其中產生的部分內容我們是希望能夠把它給保存起來另作用途的,Docker將應用與運行環境打包成容器發布,我們希望在運行過程鍾產生的部分數據是可以持久化的的,而且容器之間我們希望能夠實現數據共享。通俗地來說,docker容器數據卷可以看成使我們生活中常用的u盤,它存在於一個或多個的容器中,由docker掛載到容器,但不屬於聯合文件系統,Docker不會在容器刪除時刪除其掛載的數據卷。
docker run -itd --name itsx_docker1 itxs/centos1 //第一個容器docker run -itd --name itsx_docker2 --volumes-from itsx_docker1 itxs/centos1 docker run -itd --name itsx_docker3 --volumes-from itsx_docker1 itxs/centos1
itsx_docker2和itsx_docker3都掛載,可以在itsx_docker2和itsx_docker3容器內查看到之前建的兩個文件
刪除itsx_docker1容器,在itsx_docker2和itsx_docker3容器內仍然可以查看到之前建的兩個文件,實現容器之間的數據同步,刪除itsx_docker2,itsx_docker3容器內仍然可以查看到之前建的兩個文件,因此容器之間配置信息的傳遞,數據卷的生命周期一直持續到沒有容器使用它為止,但是一旦你持久化到了本地,這個時候,本地的數據是不會刪除的
因此比如想實現Mysql數據同步就可以用這種方法實現
//-e 設置mysql root密碼
docker run -d -p 3308:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql1 mysql:8.0
docker run -d -p 3304:3306 l -e MYSQL_ROOT_PASSWORD=123456 --name mysql2 --volumes-from mysql1 mysql:8.0
Dockerfile構建步驟
- 編寫一個dockfile文件,dockfile是一個構建文件,定義了一切的步驟,也即是源代碼,dockerfile是面向開發的,我們以后要發布項目,做鏡像,就需要編寫dockfile文件!Docker鏡像逐漸成為企業交付的標准,開發人員也必須掌握
- 每個保留關鍵字(指令)都是必須是大寫字母
- 執行從上到下順序執行
-
表示注釋
- 每一個指令都會創建提交一個新的鏡像層,並提交!
- docker build 構建成了一個鏡像 ,-f指定dockerfile文件,默認為當前目錄下的Dockerfile,-t .在當前目錄 ,通過DockFile 構建生成的鏡像,最終發布和運行的產品
- docker run 運行鏡像,容器就是鏡像運行起來提供服務器
- docker push 發布鏡像(DockerHub 、Docker Harbor、阿里雲鏡像倉庫)
1、每個保留關鍵字(指令)都是必須是大寫字母
2、執行從上到下順序執行
3、#表示注釋
4、每一個指令都會創建提交一個新的鏡像層,並提交!
5、dockerfile是面向開發的,我們以后要發布項目,做鏡像,就需要編寫dockfile文件!Docker鏡像逐漸成為企業交付的標准,開發人員也必須掌握
研究官方
從docker-hub查找鏡像,並通過官方說明鏈接到GitHub地址,比如我們查找centos鏡像
FROM scratch
ADD CentOS-8-Container-8.1.1911-20200113.3-layer.x86_64.tar.xz /
LABEL org.label-schema.schema-version="1.0" \
org.label-schema.name="CentOS Base Image" \
org.label-schema.vendor="CentOS" \
org.label-schema.license="GPLv2" \
org.label-schema.build-date="20200114" \
org.opencontainers.image.title="CentOS Base Image" \
org.opencontainers.image.vendor="CentOS" \
org.opencontainers.image.licenses="GPL-2.0-only" \
org.opencontainers.image.created="2020-01-14 00:00:00-08:00"
CMD ["/bin/bash"]
Docker Hub中, 幾乎絕大部分的鏡像都是從這個基礎鏡像過來的 FROM scratch, 然后配置需要的軟件和配置來進行的構建。
上面centos不能執行vim和ifconfig命令,我們制作一個鏡像,編寫Dockerfile文件,內容如下,然后編譯鏡像,運行容器使用vim和ifconfig命令查看成功
FROM centos
MAINTAINER itxiaoshen@aaa.com
ENV MYPATH /uer/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo “----finish----”
CMD /bin/bash
docker build -t itxs/centos-tools . //編譯鏡像
Tomcat鏡像
- 准備Dockerfile,打包jdk和tomcat,設置jdk環境變量,指定容器內端口
FROM centos
MAINTAINER itxiaoshen@aaa.com
COPY readme.txt /uer/local/readme.txt
ADD jdk-8u11-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.40.tar.gz /usr/local
RUN yum -y update --nogpgcheck
RUN yum -y makecache --nogpgcheck
RUN yum -y install vim --nogpgcheck
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_11
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.40
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.40
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.40/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.40/bin/logs/catalina.out
- 編譯鏡像和運行容器
docker build -t itxs-tomcat .
docker run -d -p 8081:8080 --name itxstomcat1 -v /home/docker/data/tomcat/test:/usr/local/apache-tomcat-9.0.40/webapps/test -v /home/docker/data/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.40/logs itxs-tomcat
- 訪問測試,由於有掛載可以直接在宿主機下制作一個靜態頁面放在tomcat webapps/test網站下,然后通過暴露端口和頁面地址訪問測試
Docker網絡
網絡基礎
-
通過命令ip addr查看本地ip地址,我們發現除了本機回環地址和內網地址外,還多了一個網卡:Docker0,這是Docker服務啟動后自動生成的。
-
之前我們從docker inspect 命令可以查看容器網絡配置包括容器主機名和IP地址,docker宿主機和docker容器之間網絡是連通的,可以在宿主機直接ping同容器的內網地址,並且容器和容器之間是也是可以互相ping通的,容器1→Docker0→容器2
-
原理:我們每啟動一個docker容器,docker就會給容器分配一個默認的可用ip,我們只要安裝了docker,就會有一個網卡docker0(bridge)。網卡采用橋接模式,並使用veth-pair技術(veth-pair就是一堆虛擬設備接口,成對出現,一段連着協議,一段彼此相連,充當一個橋梁)
-
docker中的所有網絡接口都是虛擬的 ,轉發效率高。刪除容器后,對應的網橋也隨之刪除。
網絡命令
docker run -d -P --link 容器名/id 鏡像名/id //直接使用容器名是無法ping通容器內部的,這時我們可以在容器啟動命令中加入一個選項:--link,使得我們可以根據容器名來訪問容器,但是如果反向就不可以ping通,這是因為--link的本質是把需要連接的容器名/id寫入啟動容器的配置文件中,即增加了一個ip和容器名/id的映射,實現原理也是往容器里系統/etc/hosts文件增加解析記錄,--link使用場景較少,已不推薦
docker network ls //列出所有網絡
docker中的網絡模式有:bridge:橋接(docker默認);none:不配置網絡 ;host:和宿主機共享網絡
docker run 命令默認帶有一個參數--net bridge,此處的bridge指的就是docker0。如果我們不想使用docker0,那就可以自己創建一個新的網絡
docker network create --driver bridge --subnet 192.168.9.0/16 --gateway 192.168.9.1 testnet
只要兩個容器啟動時都通過 --net,選用了同一個已創建的網絡,不同容器間即可通過ip地址或容器名/id連通:
那如果兩個容器--net使用不同網絡,那我們則需要通過docker network connect命令打通容器與網絡之間的連接:最終ping通
[root@localhost centos-tool]# docker run -d --name nginx-test1 --net bridge nginx
75cc2e3d857ace3798e9e853b49fff66e3bdd87eaaba0d770a853ecf16242102
[root@localhost centos-tool]# docker run -d --name nginx-test2 --net testnet nginx
63e4a23762b01f7b30092d83cf268f6282d57d26e14eb67f54a9bf3c372e498a
apt-get update
apt-get install inetutils-ping //容器內安裝ping命令
Docker 進階(花絮)
前面學習單個容器的操作,如果我們微服務是幾十上百個且服務與服務之間也有依賴關系,應該怎么處理?docker compose容器編排就能輕松解決這些問題
還有如果服務需要部署到多台物理機上哪又應該怎么辦,docker swarm作為docker官方集群管理可用來解決這些問題,后面還有docker stack 、docker config、docker secret 等;docker swarm適合於十幾台內的小型集群規模應用,大規模集群應用即線上環境我們則直接是使用K8S,所以關於容器編排我們后續以K8S作為重點學習對象
docker進階我們會先從官方Docker Compose官網 的入門案例入手,這里先踩個花絮,下次再見