
本文是基于windows環境下使用docker的學習文章
其實我也有很長的一段時期在ubuntu系統下開發,很喜歡linux系統的純凈方便,但是當你身邊同事都是使用windows與你交流溝通傳輸資料的時候,使用linux系統開發倒是一件不方便的事情,再加上領導曾說了一句你用windows吧別和同事們不一樣,然后我就一直使用windows了,不過也一直想著回到linux系統的懷抱下,雙系統虛擬機都試過,直到遇到了Docker我才意識到這不就是我一直尋找的windows和linux完美共存的方案么!
Docker的官方概念就不說了,相關的資料很多,如果不了解那就先去網上了解一下吧,這次我將從個人使用的角度去入門Docker,初步做到會用,而不去長篇大論講概念
(資料圖)
張三是個程序員,平時開發需要安裝各種軟件,這次開發的項目需要Redis,沒有Docker之前張三需要先去官網下載Redis,然后發現官網沒有window版本,再幾經搜索在github找到了redis for windows,然后又因為github網絡的問題,緩慢下載下下來,再解壓到某個目錄,然后執行啟動服務命令.有了Docker之后,直接執行一條docker run命令,即可成功,另外開發中還會需要安裝不同版本的mysql,如果直接裝到本機上,首先多個mysql都可能要在系統中注冊服務,配置和環境要隔離出來,卸載的時候也比較麻煩,,如果使用docker直接根據版本拉取鏡像,綁定端口運行即可,不需要的時候直接刪掉容器即可
李四也是程序員,平時需要在linux系統下做一些編譯或者測試,但是因為公司的原因要裝各種window獨占的通訊軟件,外加李四偶爾還想玩個CS:GO,所以他想在window和linux之間無縫切換,最一開始李四想到的是買兩臺筆電,這種想法想想就行了,后來又想到裝雙系統,雙系統切換在于要重啟太不方便,又想到裝vmware虛擬機,vmware其實差不多可以滿足李四的想法了,但是vmware太占內存了,最終李四選擇了在window上使用Docker,需要linux的時候直接run一個linux系統的鏡像即可,linux系統手到擒來,輕量快速都是vmware不可比的
王五還是一個程序員,不過他的工作稍多一些,平時需要部署項目在測試服務器上,沒有docker之前,王五先打包然后手動復制到服務器上,然后進入對應目錄,執行命令啟動項目,有了docker之后,王五打包項目的時候程序就會將鏡像推動到倉庫中,然后通過可視化界面或服務器命令重新拉取重啟項目即可,并且出現問題之后可以通過tag快速回退啟動上一個版本,后來王五又偷懶了,在上邊的基礎集成了自動化,直接提交代碼,服務器自動構建部署運行
林六又是一個程序員,他搭建了一套比較復雜的程序,程序依賴很多服務,同時還有很多配置,每次給別人演示安裝的時候他都需要忙活半天去搭建環境,最后還不一定能成功,這樣時候他總撓撓頭說,在我機子上真能運行,有了docker之后,他把一系列程序通過打成一個docker鏡像,在給別人演示的時候,只要先安裝上docker,然后拉取他的鏡像就可以了
以上都是docker在個人開發上提高效率的案例,我認為學習docker最好就是把docker應用到實際開發生活中來,這樣才能更快更好的理解Docker,下面就基于windows環境開始學習如何使用Docker
電腦性能別太差了不然毫無體驗,檢查windows版本是否為企業版或專業版,并開啟Hyper-v
Windows 10以上,去官網下載??Docker Desktop??,,目前Docker Desktop的體驗非常好,Windows 10以下建議升級win10
注冊docker hub的賬號(僅作登錄Docker Desktop使用),安裝完成后需要登錄Docker,在CMD中運行docker -v 出現版本號即為成功
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Cm8rrMQN-1591522751185)(C:\Users\caokang\AppData\Roaming\Typora\typora-user-images\image-20200603152711962.png)]
下載完成后需要切換成Linux容器類型,右鍵docker托盤圖標,選擇Switch to Linux containers,因為我已經轉換過了,所以這里是Switch to Windows containers
我是用的是阿里云的鏡像源,需要去阿里云注冊賬號,然后在鏡像加速中查看你的加速器地址
修改源地址,右鍵docker托盤圖標->setting->然后按照如圖修改加速源,最后點擊 apply&restart 即可
鏡像(Image):一個文件,里面存放著程序以及運行方式
容器(Container):鏡像運行的實體
倉庫(Repository):鏡像倉庫
標簽(Tag):標識著鏡像的版本
鏡像的查找可通過docker search命令,請在window的cmd窗口或powershell中,不建議在git bash中使用,因為在git bash中會有錯誤提示
C:\Users\xxxx>docker search redisNAME DESCRIPTION STARS OFFICIAL AUTOMATEDredis Redis is an open source key-value store that… 8245 [OK]bitnami/redis Bitnami Redis Docker Image 147 [OK]sameersbn/redis 80 [OK]grokzen/redis-cluster Redis cluster 3.0, 3.2, 4.0, 5.0, 6.0 68......
然后可以根據DESCRIPTION通過NAME選擇鏡像,推薦下載第一個,一般都是官方源關于鏡像的下載: 啟動一個鏡像的時候,如果鏡像不存在,則會先進行pull(下載)操作,你也可以主動pull,這樣docker會把鏡像下載本機,啟動的時候則無需再次下載
docker pull redis
docker run -d --name redis -p 6379:6379 redis
run 創建一個新的容器并運行一個命令-d 后臺運行容器,并返回容器ID,如果不加這個,程序將以前臺啟動,一旦關閉程序也將自動關閉--name 給容器指定一個名稱,建議加,方便以后維護-p 使用方法: [-p 宿主機端口:容器內端口] 說明: 指定端口映射,因為默認情況下容器的網絡與宿主機不互通,通過該參數可把redis的6379端口映射到本機6379端口上
C:\Users\xxxxx>docker search mysqlNAME DESCRIPTION STARS OFFICIAL AUTOMATEDmysql MySQL is a widely used, open-source relation… 9587 [OK]mariadb MariaDB is a community-developed fork of MyS… 3486 [OK]mysql/mysql-server Optimized MySQL Server Docker images. Create… 702 [OK]centos/mysql-57-centos7 MySQL 5.7 SQL database server 76mysql/mysql-cluster Experimental MySQL Cluster Docker images. Cr… 69centurylink/mysql Image containing mysql. Optimized to be link… 61 [OK]
比如我們想安裝mysql5.6的版本,通過search我們也無法得知mysql的具體版本,,最簡單的方法就是去官方hub上查閱,訪問??https://hub.docker.com/_/mysql?tab=tags??,,(也可以使用命令的方式去查找版本號,不過這個需要安裝腳本,以后再說)
這里先下載mysql5.6的鏡像
docker pull mysql:5.6
5.6 , 5.7就是鏡像的tag,tag可以理解為鏡像的名字,如果不加tag,則會下載tag為latest的鏡像
通過鏡像的Description,得知我們需要指定MYSQL_ROOT_PASSWORD才能運行mysql5.6
docker run -d --name mysql56 -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 mysql:5.6
-e 設置環境變量,至于都有什么環境變量供我們去設置,可以通過查閱hub官網的Description標簽頁可以得知
因為安裝mysql5.6已經講宿主機的3306端口分配了,所以需要指定一個新的端口
docker pull mysql:5.7docker run -d --name mysql57 -e MYSQL_ROOT_PASSWORD=root -p 3307:3306 mysql:5.7
可視化操作的話,右鍵docker托盤圖標->Dashboard
命令操作
docker stop mysql56docker rm mysql56
stop 停止一個運行中的容器
rm 刪除一個停止的容器
docker rm -f mysql57
-f 默認情況下 rm 無法刪除正在運行的容器,加 -f 即可強制刪除
后面追加容器id或容器name,因為上面我們通過--name指定了容器名稱,所以這里直接輸入即可,這也是我為什么建議加--name參數指定容器名稱的原因,
如果我們忘記了容器名稱呢?
C:\Users\xxxxx>docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES5a7215cb11e2 redis "docker-entrypoint.s…" 6 hours ago Up 6 hours 0.0.0.0:6379->6379/tcp redisdocker ps 查詢運行中的容器docker ps -a 查詢所有容器
第一列的5a7215cb11e2就是容器id(CONTAINER ID),我們也就可以使用容器id進行對容器的操作
創建兩個數據,再刪除兩個數據庫,對本機的系統沒有造成任何污染,這就是Docker的優點,簡直就是渣男,一旦分手忘得干干凈凈的
剛剛刪除了mysql的容器,一旦再次需要mysql服務,直接run無需下載即可立馬啟動mysql服務,這是因為mysql的鏡像依然在我們本機存儲著,簡直就是渣男,分手了還把對方藏在心底,這次我們要和mysql徹底決裂,那就是刪除鏡像
docker rmi mysql:5.6 docekr image rm mysql:5.6#以上兩條命令操作相同,rmi 是 image rm 簡化版
查詢本機鏡像
docker image lsdocker images#以上兩條命令操作相同,images 是 image ls 簡化版
以安裝centos為例
docker search centosdocker pull centosdocker run -d -it --name centos -v /d/dev/test:/home/test centos
先解釋 -v /d/dev/test:/home/test ,表示將宿主機的D:/dev/test目錄與容器內部的/home/test目錄映射起來,在該目錄下的操作的雙向影響的
在這里D:/dev/test要寫成/d/dev/test的形式
接下來說 -it 是干嘛的
-i:以交互模式運行容器,通常與 -t 同時使用
-t:為容器重新分配一個偽輸入終端,通常與 -i 同時使用;
直接說效果吧,因為容器中沒有一個常駐的前置進程,前置進程運行結束后,容器便自動退出了,所以結合-d -it 就是后臺啟動centos 并保持一個偽終端防止centos自動關閉,也可以使用-itd
容器已經后臺啟動了 ,如何進入容器?
docker exec -it centos /bin/bash
exec 在運行的容器中執行命令
-it 執行一個交互的終端
/bin/bash 選擇執行的bash
exec并不是一個進入容器的命令,而是一個在運行的容器中執行命令的命令,-it標識啟動了一個交互的終端,bash使用/bin/bash,所以上述命令是給了我們一個和容器內部通信的終端
更詳細的區別請看 ??docker run 和 docker exec 的差異??
即使沒有掛載了文件目錄,我們還是可以通過命令用來復制傳輸容器文件
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH將主機/d/dev/test2目錄拷貝到容器centos的/home目錄下。docker cp D:/dev/test2/ centos:/home/將容器centos的/home/test3目錄拷貝到主機的D:/dev/目錄中。docker cp centos:/home/test3 D:/dev/
在這里D:/dev/test形式不要變
??https://www.jianshu.com/p/38a60776b28a??
接下來需要做的是安裝兩個容器wordpress和mysql,并讓wordpress連接mysql數據庫
首先安裝mysql
docker run -d -e MYSQL_ROOT_PASSWORD=root MYSQL_DATABASE=wordpress --name mysql57 mysql:5.7
然后安裝wordpress
docker run -d -p 80:80 --link mysql57:mysql -e WORDPRESS_DB_PASSWORD=root --name wordpress wordpress
分別執行以上兩條命令,然后訪問localhost:80即可打開wordpress安裝界面
首先解釋一下兩條命令
docker run -d -e MYSQL_ROOT_PASSWORD=root MYSQL_DATABASE=wordpress --name mysql57 mysql:5.7# 啟動了一個名為mysql57的容器,并初始化創建數據庫wordpressdocker run -d -p 80:80 --link mysql57:mysql_host -e WORDPRESS_DB_PASSWORD=root -e WORDPRESS_DB_HOST=mysql_host --name wordpress wordpress#啟動wordpress容器,link命令鏈接mysql57容器將它命名為mysql_host,然后指定數據庫的密碼為root,wordpress啟動成功后將會自動連接mysql57容器的wordpress表
命令是簡潔的,兩條命令就立馬啟動好一個wordpress,作為一個新手的我在感慨的時候也是懵逼的,因為我心中想的是:
其實這一點不僅僅是作為一個docker入門學習的痛點,很多技術學習也都是這樣的,既學習的方式都是狼吞虎咽不咀嚼的,學習docker就把常用命令記了下來,在安裝某個容器的時候去百度一下安裝命令,安裝上就完事了,以為自己掌握了,然而下次換了一個新的容器的時候,還是要去網上搜索什么docker xxxx 安裝 這樣的關鍵詞,所以我們要會舉一反三,知其所以然
1 docker學習是可以通過博客文章入門的,可以讓你有迅速的了解
2 繼續提升是離不開官網文檔的,這樣才能了解最新的docker 命令的含義以及參數,有些文章可能已經過時不再支持
3 了解鏡像的詳細配置請翻閱 ??docker hub?? 鏡像的詳情頁,在那里你能找到絕大多數的配置參數
4 學會結合inspect命令查看鏡像啟動的方式,以及進入容器閱讀具體的啟動腳本
其實前三點都已經講過了,前三點幾乎可以整合啟動所有的鏡像,第四點的使用稍后再說
docker run -d -e MYSQL_ROOT_PASSWORD=root MYSQL_DATABASE=wordpress --name mysql57 mysql:5.7# 啟動了一個名為mysql57的容器,并初始化創建數據庫wordpressdocker run -d -p 80:80 --link mysql57:mysql_host -e WORDPRESS_DB_PASSWORD=root -e WORDPRESS_DB_HOST=mysql_host --name wordpress wordpress#啟動wordpress容器,link命令鏈接mysql57容器將它命名為mysql_host,然后指定數據庫的密碼為root,wordpress啟動成功后將會自動連接mysql57容器的wordpress表
再看這里,link命令鏈接mysql57容器將它命名為mysql_host,可以理解為在wordpress容器中通過訪問 http://mysql_host:3306 ,即可訪問mysql57容器的數據庫服務,這里的mysql_host就代表mysql57的ip
上面接觸了一點docker網絡方面的知識,簡單聊一下,使用docker network ls 可以查看當前網絡列表
目前(Docker v18.03),Docker Engine內置支持如下幾種類型的網絡。
host類型host網絡就是Docker宿主機的網絡,是Docker Engine啟動即默認創建的網絡之一。加入到該網絡中的所有容器實例,容器實例與容器宿主機之間沒有網絡隔離,所以容器實例都直接使用宿主機的網絡,擁有與宿主機一樣的IP,使用的是宿主機的端口。(目前僅支持linux ,windows mac 不支持,2020-06-07,未來可能支持)bridge類型Docker Engine啟動即默認創建的網絡之一。bridge網絡的網絡驅動器為bridge,即-d=bridge。該網絡支持在同一個宿主機上的各個容器實例之間的通信。bridge網絡是一個獨立的網絡空間,在網絡空間內部的各個容器實例能夠直接通信。各個容器實例都是連接到一個網橋,即docker0。新創建的容器實例默認就會加入bridge網絡,即容器實例默認連接到docker0。創建容器實例可以通過使用--network指定加入到其他已有的網絡。也可以另外創建一個定制的bridge網絡,創建的bridge網絡會覆蓋默認的bridge網絡。默認的bridge網絡不支持服務的DNS自動發現,即一個容器實例要通過容器實例的name找到容器實例的IP,就無法使用該網絡。定制的bridge網絡,最大的好處是默認即支持服務的自動發現。overlay類型overlay類型的網絡的網絡驅動器為overlay,即**-d=overlay**。該類型的網絡適用于Docker宿主機集群中的各個獨立的容器實例之間通信。為集群中的Docker容器實例提供跨多個Docker Engine的網絡連接。macvlan類型macvlan類型的網絡的網絡驅動器為macvlan,即-d=macvlan。該類型的網絡適用于容器實例需要與宿主機的MAC地址直接通信,無需端口映射,也無需NAT,容器實例的eth0直接與宿主機的物理網卡通信。容器實例可以被賦予公共IP,并從宿主機外部直接訪問。none類型none網絡是一個完全隔離的自治網絡,甚至與Docker宿主機的網絡都不通,必須手工配置網卡后才能夠使用。docker run -d -e MYSQL_ROOT_PASSWORD=root MYSQL_DATABASE=wordpress --name mysql57 mysql:5.7# 啟動了一個名為mysql57的容器,并初始化創建數據庫wordpressdocker run -d -p 80:80 --link mysql57:mysql_host -e WORDPRESS_DB_PASSWORD=root -e WORDPRESS_DB_HOST=mysql_host --name wordpress wordpress#啟動wordpress容器,link命令鏈接mysql57容器將它命名為mysql_host,然后指定數據庫的密碼為root,wordpress啟動成功后將會自動連接mysql57容器的wordpress表
再回看這兩條命令,我們發現運行wordpress要兩條命令并且還要配置,在以后的時候甚至還有更多鏡像,那有沒有簡單的啟動方法呢? 有的,就是使用docker-compose!
Compose 是用于定義和運行多容器 Docker 應用程序的工具。通過 Compose,您可以使用 YML 文件來配置應用程序需要的所有服務。然后,使用一個命令,就可以從 YML 文件配置中創建并啟動所有服務。
Compose 就是一個啟動腳本的程序
新增docker-compose.yml文件,復制內容如下
mysql: container_name: mysql image: mysql:5.7 ports: - "3306:3306" environment: - MYSQL_ROOT_PASSWORD=root - MYSQL_DATABASE=wordpress web: container_name: wordpress image: wordpress links: - "mysql:mysql_host" ports: - "80:80" environment: - WORDPRESS_DB_HOST=mysql_host - WORDPRESS_DB_PASSWORD=root
以上就是兩條命令的整合腳本,在對應目錄下啟動
docker-compose up -d #后臺啟動腳本
兩個鏡像就會作為一組同時被啟動起來了
關閉
docker-compose down
關于docker-compose在此就不做詳細解釋了,以后另開文章詳細說明
最簡單的就是使用別人做好的wordpress mysql整合包,當然這是別人做好了,所以我們才能直接用,如果沒有,還是需要我們自己動手的,這里也就不說了
docker search docker pull docker run docker psdocker startdocker stopdocker rmdocker cpdocker image lsdocker image rm docker-compose up -ddocker-compose downdocker exec
docker network 鏡像之間的網絡通信
docker volume 使用volume保存鏡像數據
docker build 如何使用dockerfile構建鏡像,以及dockerfile語法
docker import/export 導入導出鏡像文件
docker tag 給鏡像打標簽
docker push 搭建私庫并推送鏡像進行部署
docker swarm docker集群環境的設置