Docker筆記整理

前序:這裏只是記錄docker的大致常見用法和知識點,更多細節可以查看官方網站(下文會給出網站地址)和其他詳細教程。
大致瞭解Docker
docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發佈到任何流行的Linux機器上,也可以實現虛擬化,容器是完全使用沙箱機制,相互之間不會有任何接口。簡言之,就是可以在Linux上鏡像使用的這麼一個容器。
docker官網,網上也有大量資料這裏就不再過多的解釋。

  • image(鏡像)和container(容器):簡單的比喻Docker Engine(Docker環境)就像JVM,image就像Class文件,container就像Java對象 在這裏插入圖片描述

  • 容器和虛擬機的區別:
    在這裏插入圖片描述

  • 通常docker會怎麼使用?
    在學習過程中容器和虛擬機一起使用的,如下圖所示,當然我們也可以直接在物理機上面安裝docker環境
    在這裏插入圖片描述

準備centos7機器

這裏虛擬機環境的搭建是用vagrant+virtualbox。
先去官網下載virtualbox,因爲virtualbox比較常用所以這裏不再演示。
在這裏插入圖片描述
然後vagrant到官網進行下載(可以用迅雷下載速度快一些),下載完後傻瓜式安裝就行了。(vagrant網上有 教程 這裏就不細說)
在這裏插入圖片描述
在這裏插入圖片描述
如下圖代表安轉成功:
在這裏插入圖片描述

準備好vagrant和virtualbox後,開始基於vagrant+virtualbox定製化自己的centos:
1.vagrant是根據Vagrantfile文件進行centos的安裝。
然後新建一個文件夾,用來放vagrantfile文件,然後在這個文件夾下方用管理員權限運行命令行,如下圖所示
vagrant init centos/7這裏的centos/7就是vagrant遠端鏡像倉庫的鏡像名稱或者在本地直接安裝好鏡像就不用去遠端拉去,和maven是一樣的道理。
在這裏插入圖片描述
這時候你的文件夾內就會出現vagrantfile文件,這相當於是配置文件
在這裏插入圖片描述
2.根據Vagrantfile文件中的配置,得到定製化的centos7系統。
我們可以打開這個文件進行查看,如下圖所示
在這裏插入圖片描述
上面看第13~15行可以看到如果本地有centos/7鏡像則用本地的鏡像,如果沒有的話就會到https://vagrantcloud.com/search上拉去,後面還可以配置其他的,如像第26行網絡端口配置等等,上面的教程都有所以不一一解釋。
然後在Vagrantfile文件內輸入以下配置:
在這裏插入圖片描述
3.這是後你要去網上(http://www.vagrantbox.es/)下載vagrantbox鏡像,如下圖所示,點擊copy然後用迅雷下載就行了。
在這裏插入圖片描述
然後再將鏡像添加到本地

vagrant box add centos/7 E:\......    #這裏centos/7對應你Vagrantflie文件中config.vm.box的名字,然後E:/....對應你下載vagrantfile鏡像所存放的路徑
vagrant box list     #查看你當前有什麼鏡像

在這裏插入圖片描述
4.準備好鏡像後,就開始用該鏡像進行安裝centos,如下圖所示,安裝後你的virtualbox中就會顯示
在這裏插入圖片描述
5.進入虛擬機,當然你也可以用其他方式進入,例如xshell等待(默認賬號密碼都爲vagrant)。
在這裏插入圖片描述
在這裏插入圖片描述
如果要用xshell連接的話,設置如下兩個圖所示,賬號密碼都爲vagrant,你也可以對網絡ip、端口、賬號密碼進行就改。
在這裏插入圖片描述
在這裏插入圖片描述

以上環境就準備好了,接下來就是準備docker

Docker安裝及基本使用

docker產品手冊 ,在這裏你可以查詢到安裝使用等一些教程,可以參考進行使用,下面大致講一下流程:
這裏要說明一下:我目前學習docker遇到的很多問題是權限問題和網絡問題,權限問題一般在執行命令前面加上sudo就可以解決,網絡問題主要是因爲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 http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

在這裏插入圖片描述

安裝docker,這時候就會到上面設置的阿里雲倉庫裏面進行安裝,安裝過程有兩次要輸入,第一次輸入y;第二次輸入j
sudo yum install docker-ce docker-ce-cli containerd.io

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
查看docker版本
在這裏插入圖片描述

然後啓動docker
sudo systemctl start docker
還可以設置開機啓動
sudo systemctl enable docker
停止docker
sudo systemctl stop docker
啓動成功後嘗試一下docker是否成功
sudo docker run hello-world

首先會提示你本地鏡像倉庫中沒有hello-world鏡像,所以會到遠程倉庫中拉去,但是報了錯誤,這是因爲外國官方源國內沒法連接上,具體看這裏的 解決方法 ,下載過慢也可以用這裏面的方法解決。
在這裏插入圖片描述
按照上面的解決方法後執行後再進行測試,如下圖所示:
在這裏插入圖片描述
查看本地鏡像也可以看到多出一個文件,這就代表docker安裝成功
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

這裏說明一下
sudo docker images  查看本地所有鏡像
sudo docker ps 查看運行的容器
sudo docker ps -a 查看所有容器

由上圖可以知道hello-world容器運行後就關閉了,所以只能在sudo docker ps -a中看到。
鏡像和容器這裏大致解釋一下,本地鏡像就好像一個程序的安裝包,然後安裝後變成的程序就好像是容器,所以上面的流程大致就是我們運行hello-world容器時,系統發現本地沒有hello-world容器,所以系統自動去線上拉去鏡像到本地,然後根據鏡像啓動容器,hello-world容器啓動運行後自動關閉。

下面爲官方的圖解:
在這裏插入圖片描述

Docker Images(鏡像)基本操作

由上面我們已經大致瞭解了docker 了,現在先講一下Images(鏡像)。
從上面的hello-world例子我們知道可以從遠端倉庫拉去鏡像,這時候我們可以去 Docker Hub 查看所有的鏡像,如下圖所示:
在這裏插入圖片描述
這裏就查出hello-world的鏡像,你還可以查JDK、MySQL、Tomcat、Redis、Nginx等等。
在這裏插入圖片描述
下圖爲redis,下圖第一個下載數最多的redis爲官方的,下面其他的爲別人在官方的基礎上自定義的,增加了自己的一些設定等等。
在這裏插入圖片描述
然後我們點擊第一個官方,進入後我們可以看到版本等等一些信息,其中latest代表最新的版本
在這裏插入圖片描述
當然我們還可以通過下面的命令去查詢
sudo docker search XXX
在這裏插入圖片描述
然後我們可以通過sudo docker pull XXX把鏡像從遠端倉庫拉去下來,如下圖所示,如果直接sudo docker pull mysql則代表把最新版本的拉去下來,如果後面有加版本號則代表拉去指定的版本。
在這裏插入圖片描述
鏡像的操作命令如下圖所示,我們還可以對鏡像進行刪除等操作,這裏就不再演示:

操作 命令
檢索 sudo docker search 關鍵字 eg:docker search mysql
拉去 sudo docker pull 鏡像名:tag(不加tag表示用最新版本)
列表 sudo docker images或sudo docker image ls
刪除 sudo docker rmi 鏡像id/鏡像名(刪除的鏡像不能有相關容器存在)

Docker Container(容器)基本操作

在容器外的簡單操作

如果有了image(鏡像),那麼就可以基於image(鏡像)創建container(容器)

容器的操作相對於鏡像會麻煩一些,因爲不同的容器執行的命令會有所不同,因爲不同容器執行的命令中參數會有一定的差別。具體命令可以參考官方:https://docs.docker.com/reference/

這裏先展示幾個比較常見的命令,上文也出現過的:

sudo docker ps  		查看運行中的容器
sudo docker ps -a 		查看所有容器
sudo docker start 容器id  		啓動容器
sudo docker stop 容器id 			停止容器
sudo docker rm -f 容器id  		刪除容器

然後是容器創建的命令,這個複雜一點,因爲不同的容器參數不一樣,具體可以查看上面的官方參考

大致的命令爲
docker run  參數  參數值

例如tomcat可以爲
docker run --name mytomcat -d tomcat 		這裏就表示用名爲tomcat的鏡像創建名爲mytomcat的容器,-d表示後臺運行,可去掉就變成前臺運行。

而mysql的命令就變成
docker run --name mysql01 -e MYSQL_ROOT_PASSWORD=123456 -d mysql
或
docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql  		
這裏mysql如果和上面tomcat一樣的寫法就會出錯(運行後自動退出),這是因爲沒有設定密碼。

另外如果你發現出錯了,但是不知道爲什麼可以通過  docker logs 容器id   查看錯誤

在這裏插入圖片描述
端口說明
另外上面的參數出現了端口號,例如docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7中的-p 3306:3306這裏表示宿主機的3306端口(冒號前)映射到容器內容的3306端口(冒號後),具體可以參考:Docker容器內部端口映射到外部宿主機端口 - 運維筆記

深入瞭解容器

上面說的宿主機表示centos7這個虛擬機,而不是物理主機,其實容器也是一個linux系統,自然而然我們也可以進入到容器中
在這裏插入圖片描述

進入到指定的容器中
sudo docker exec -it 容器id/容器名稱 bash

在這裏插入圖片描述
在mysql的docker容器中我們可以查看它的目錄發現其實和centos虛擬機的目錄是一樣的,也是一個linux目錄
在這裏插入圖片描述
從上面可以知道docker容器中也相當於一個linux系統,所以docker容器也有它自己的ip地址等,用一種查詢方法是用上面的命令進入容器中然後跟在centos一樣去使用這個docker容器,例如輸入ip addr就可以查詢出來這個docker容器的ip地址,但是要注意,docker安裝好後是一個簡易的linux系統,所以很多命令沒有安裝,如果你要去用上面ip addr進行查詢的話會提示你-bash:ip:command not found,所以我們用簡單一點的方法在容器外面進行查詢,你可以自己嘗試把docker容器的命令安裝好然後再內部進行一些操作,網上也有教程這裏就不演示(過程會麻煩一些,因爲好多命令都得安裝)。
sudo docker inspect 容器名稱或容器id 就可以查詢到關於容器的一些信息
在這裏插入圖片描述
在這裏插入圖片描述
然後我們嘗試在centos上對docker容器的id進行ping,也發現ping得通
在這裏插入圖片描述
所以從上面得例子我們可以知道鏡像和容器其實底層都是linux操作系統,只不過image只能讀,而container讀寫都可以,container是在image的基礎上運行的一個個可讀可寫的環境。
在這裏插入圖片描述

Image和Container之間的關係以及Dockerfile

我們從前面已經大概瞭解到了兩者的關係,這裏再簡述兩者之間一些其他的關係

  • 我們知道container是通過imgae創建的,但是也可以用container生成imge,例如你在tomcat容器上進行一些修改,然後用這個容器運行下面的命令就可以生成自己定製的tomcat鏡像。
sudo docker container commit 容器id/容器名稱
或者
sudo docker container commit 容器id/容器名稱  設定新生成的鏡像名稱

在這裏插入圖片描述

  • 處理上面那種可以創建自定義的image外,還可以用Dockerfile創建(Dockerfile和Vagrantfile是相識的),即寫一些語法然後得到image,官方的一些image的Dockerfile:https://github.com/docker-library

我們進入官方的github拿去我們想要的Dockerfile文件
在這裏插入圖片描述
點擊mysql,進入後如下圖所示:
在這裏插入圖片描述
選擇5.7版本就可以看到相關的Dockerfile文件,進入後把裏面的內容考取出來
在這裏插入圖片描述
在這裏插入圖片描述
這裏以mysql來簡略的講視一下Dockerfile中的含含義,具體可以看官方文檔https://docs.docker.com/engine/reference/builder/或者網上的教程https://www.runoob.com/docker/docker-dockerfile.html

FROM debian:buster-slim		#From 製作該image的基礎鏡像 layer
RUN groupadd -r mysql && useradd -r -g mysql mysql		#運行一條指令,並且表示新的layer層的創建
ENV GOSU_VERSION 1.12		#常量的設置
VOLUME /var/lib/mysql		#mysql數據庫數據再容器linux系統中所在的目錄
COPY docker-entrypoint.sh /usr/local/bin/		#表示從前一個文件拷貝到後一個目錄
ENTRYPOINT ["docker-entrypoint.sh"]		#設置容器啓動時運行的指令
CMD ["catalina.sh","run"]		#設置容器啓動時運行的指令,加參數
EXPOSE 3306 33060		#暴露在外面的端口是什麼

然後我們嘗試一下用Dockerfile來創建image
在這裏插入圖片描述
在這裏插入圖片描述
開始構建鏡像,其實這裏的原理和上面用容器生產鏡像是一樣的道理
在這裏插入圖片描述
構建成功,查看鏡像並用鏡像來運行容器,查看生成的容器
在這裏插入圖片描述
在這裏插入圖片描述

Image倉庫

上文我們已經講述了可以用Dockerfile來創建自定義的image了,我們也可以將我們自定義的鏡像共享給別人,同時我們也可以將我們的image存儲起來。這就需要我們來搭建自己的image倉庫。
這裏原理其實和github一樣。我們可以在docker hub上面註冊一個賬號,然後通過我們的賬號把我們的自定義鏡像存儲上去,這樣別人也就可以在上面獲取我們自定義的鏡像了。
因爲docker hub國內使用比較慢,我也經常會連接不上,必須用vpn,所以這裏就不進行演示,主要給些命令

首先你必須要有docker hub的賬號
然後你在你本地的centos上用該賬號密碼和docker hub關聯
sudo docker login
然後會讓你輸入用戶名和密碼

在這裏插入圖片描述

然後把你想要放到遠端倉庫的鏡像push上去
sudo docker push XXXX

注意你要push上去的鏡像名稱有規定,必須是“你的賬戶名/鏡像名”這種格式
你可以用下面的語句複製出另起名的鏡像
sudo docker tag XXX  你的賬戶名/XXX

如下圖所示,itcrazy2018/new-centos是由new-centos複製出來的,然後你可以把原來的new-centos刪除點就行了
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
然後你可以用sudo docker pull 賬戶名/鏡像名把你上傳的鏡像從新拉去下來

Docker網絡

docker網絡其實主要涉及ip和端口問題,上面已經講過端口映射的問題,這裏再次系統的整理一遍。
我們查看宿主機的ip,發現多了一個docker0網卡,該網卡的作用是和其他docker容器連接,我們前面已經提到過了其他docker容器的ip地址爲172.17.0.2、172.17.0.3…等等,他們和宿主機在同個網段,所以互相ping的通。
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

但是我們的物理機window想要訪問我們宿主機centos裏面的容器的畫也必須要保證物理機能ping的通宿主機,則時候我們就應該設置虛擬機網絡爲橋接的模式,做如下設置:

  • 修改Vagrantfile文件,設置虛擬機網絡爲橋接。
    在這裏插入圖片描述
  • 然後在物理機上用管理員身份重新設定一下虛擬機,然後虛擬機會重新啓動
    在這裏插入圖片描述
  • 這時候我們再查一下虛擬機,發現多了一個網卡,ip地址和物理機的ip地址是同一個網段,這樣我們就能將虛擬機和物理機連接起來了。 在這裏插入圖片描述
    在這裏插入圖片描述

做完上面的設置後,我們就可以在物理機上訪問虛擬機的docker端口了,例如你虛擬機中的tomcat容器ip地址爲172.17.0.2,端口映射爲8888:8080 (上文講過,即虛擬機的8888端口對應tomcat容器的8080端口)
所以你可以在虛擬機中用localhost:8888或者172.17.0.2:8080訪問到tomcat內容
你也可以在物理機中用192.168.0.124:8888訪問到tomcat內容
所以我們可以從上面所述的知道虛擬機和docker容器的連接方式爲橋接的方式。
在這裏插入圖片描述

同時我們也可以自己來設置docker網絡

比如我們想要部署tomcat集羣,我們可以設定下面的網絡
sudo docker network create --subnet=tomcat-net 172.18.0.1/24

如下圖設置自己的網段
在這裏插入圖片描述
然後還可以用下面的命令查看網段信息(上面有使用同樣的命令過來查詢容器網絡信息),可以看到有這個網段

sudo docker network inspect tomcat-net

在這裏插入圖片描述
另外我們也可以用sudo docker logs 容器名來查看啓動日誌

然後我們可以用下面的語句來指定容器用上面設置的網段
sudo docker run -d -it --name tomcat --net=tomcat-net tomcat

如下圖所示
在這裏插入圖片描述
以上都爲單機形式,單機網絡連接有三種:bridge、host、none
多機形式則有overlay network,這裏就不再演示了,可以自行了解

Docker數據持久化

我們知道容器如果刪除銷燬了,容器裏面的數據就會消失,這樣是不可靠的。這一節就是講docker容器的數據持久化問題,
我們可以將數據保存到centos虛擬機中來保持數據持久化。

在centos中新建一個目錄volume來存放數據,這裏volume是可以讓容器創建的時候可以使用這個volume文件
sudo docker volume create --name v1

在這裏插入圖片描述

查看一下當前v1的信息
sudo docker volume inspect v1

我們可以看到創建時間、路徑等信息
在這裏插入圖片描述

然後我們以mysql爲例子,可以用以下的語句來創建MySQL容器
sudo docker run -d -p 3307:3306 -v v1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --privileged --name mysql1 mysql:5.7
上面主要說兩個,第一 -v表示希望把docker容器中/var/lib/mysql文件中的數據映射到虛擬機v1文件中(v1爲上文所創建的,容器數據存儲/var/lib/mysql中);第二 --privileged表示希望這mysql爲最高優先級

在這裏插入圖片描述
然後我們可以像下圖一樣操作,發現容器和虛擬機兩個文件內容一模一樣
在這裏插入圖片描述
在這裏插入圖片描述
所以容器刪除掉數據還是可以持久化保存的。

這時候可以做一個實驗,在上述容器中的數據庫創建一個表,然後在表中加入數據,然後再把這個容器刪除。雖然容器被刪除掉數據自然也不存在docker中,但是所有數據還是保存再centos的v1中,這個時候我們可以新建一個mysql容器(注意:創建這個新的容器也要用-v v1:/var/lib/mysql參數,這樣新的數據庫就的數據就可以和v1互通),然後我們就會發現新的數據庫中存在之前舊的數據庫的數據(之前舊數據庫創建的那個表)。

Docker Compose

從上面的知識我們已經大致學會使用docker,但是如果我們要使用多個容器,還要進行一些特定網絡的設定等等一些操作,操作起來還是十分麻煩和混亂,而且也不知道容器與容器之間的關係。
所以我們可以使用Docker Compose來幫助我們維護這些容器。
docker compose使用起來和上面的dockerfile還是很相似的,主要是維護docker-compose.yml文件,因爲個人時間有限所以就不這裏擴充了,我推薦可以看官網的手冊菜鳥教程進行學習。

**總結:**學到這裏其實已經基本瞭解了docker的入門知識,但是還是有許多東西可以深入的瞭解自學一下,docker容器技術的運用十分廣泛,包括docker容器搭建微服務架構、CICD等等,大家有空可以去自學。有什麼問題歡迎留言討論,謝謝。

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