從實戰開始,零基礎Docker入門教程

2023-01-03 16:28:01 來源:51CTO博客

前提

本文是基于windows環境下使用docker的學習文章

其實我也有很長的一段時期在ubuntu系統下開發,很喜歡linux系統的純凈方便,但是當你身邊同事都是使用windows與你交流溝通傳輸資料的時候,使用linux系統開發倒是一件不方便的事情,再加上領導曾說了一句你用windows吧別和同事們不一樣,然后我就一直使用windows了,不過也一直想著回到linux系統的懷抱下,雙系統虛擬機都試過,直到遇到了Docker我才意識到這不就是我一直尋找的windows和linux完美共存的方案么!

Docker的官方概念就不說了,相關的資料很多,如果不了解那就先去網上了解一下吧,這次我將從個人使用的角度去入門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

安裝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 即可

開始Docker

基本概念

鏡像(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

安裝Redis

docker run -d --name redis -p 6379:6379 redis

run 創建一個新的容器并運行一個命令-d 后臺運行容器,并返回容器ID,如果不加這個,程序將以前臺啟動,一旦關閉程序也將自動關閉--name 給容器指定一個名稱,建議加,方便以后維護-p 使用方法: [-p 宿主機端口:容器內端口] 說明: 指定端口映射,因為默認情況下容器的網絡與宿主機不互通,通過該參數可把redis的6379端口映射到本機6379端口上

安裝兩個Mysql

mysql5.6
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.7

因為安裝mysql5.6已經講宿主機的3306端口分配了,所以需要指定一個新的端口

docker pull mysql:5.7docker run -d --name mysql57 -e MYSQL_ROOT_PASSWORD=root -p 3307:3306  mysql:5.7
卸載mysql5.6

可視化操作的話,右鍵docker托盤圖標->Dashboard

命令操作

docker stop mysql56docker rm mysql56

stop 停止一個運行中的容器

rm 刪除一個停止的容器

docker rm -f mysql57

-f 默認情況下 rm 無法刪除正在運行的容器,加 -f 即可強制刪除

后面追加容器id或容器name,因為上面我們通過--name指定了容器名稱,所以這里直接輸入即可,這也是我為什么建議加--name參數指定容器名稱的原因,

如果我們忘記了容器名稱呢?

查詢docker容器
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 簡化版

安裝linux系統

以安裝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,并讓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網絡方面的知識,簡單聊一下,使用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-compose
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在此就不做詳細解釋了,以后另開文章詳細說明

使用image

最簡單的就是使用別人做好的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集群環境的設置

標簽: 啟動成功 可以使用

上一篇:Lnmp搭建zabbix運維監控系統
下一篇:RestTemplate Module|休息模板模塊