Docker的概念及基本指令学习(从安装、管理、核心概念到docker file 、 服务编排、集群)
Docker的概念及基本指令學習---全
- 一、Docker的安裝(centos7環境下)
- 二、Docker管理
- (1)核心概念:
- (2)Docker鏡像管理(使用官方倉庫)
- (3)Docker容器管理
- (4)Docker網絡管理
- 三、docker file ( 利用docker file 創建一個自己的鏡像,產品給客戶部署 )
- 四、docker 服務編排
- docker-compose命令
- docker compose 網絡管理
- 五、docker CI部署樣例
- 六、docker集群
- (1)Docker Swarm 配置準備以及部署
- (2)管理節點
一、Docker的安裝(centos7環境下)
yum-utils:主要用于倉庫管理,在安裝docker之前需要設置對應的倉庫,所以需要安裝yum-utils工具包
device-mapper:docker使用的自己的存儲管理,所以需要使用device-mapper-persistent-data 以及 lvm2工具包完成內部存儲和物理磁盤分區之間的映射關系管理
docker-ce :docker的主體程序
docker-cli: docker工具
containerd.io:容器管理
二、Docker管理
(1)核心概念:
倉庫, 注冊服務器、鏡像,標簽,容器,Dockerfile,compose file (容器編排)
注意:
hub.docker.com),國內的注冊服務器主要包括阿里云、騰訊云、網易云等。沒有特殊要求的場景下默認使用官網的倉庫最好。
可以理解為 private-docker.com這個服務器下有一個centeros倉庫,這個倉庫中可以包含若干個版本的centOS的鏡像
(2)Docker鏡像管理(使用官方倉庫)
- 在官方市場中查看相關的鏡像有兩種方式:第一可以采用網頁方式登錄 hub.docker.com然后在頁面進行搜索
- 使用docker cli 提供的命令來完成相關操作。
docker search [鏡像的名字] 例如:docker search mysql 查看當前倉庫中mysql鏡像的相關信息。但是需要注意的是,使用docker命令無法查看版本,需要看tag的話要到官方站點來查詢
docker pull [鏡像名稱]:[tag] 例如:docker pull mysql:5.7 docker pull mysql 如果不使用tag 則默認采用最后一個版本
docker images 或 docker image ls 查看當前本地docker中已經下載的鏡像信息
docker rmi 鏡像:tag 刪除一個鏡像(需要注意鏡像如果有容器正在運行,需要先刪除容器后在刪除鏡像)
docker tag 原鏡像名 新鏡像名 拷貝鏡像 原鏡像不需要后可以刪除掉
(3)Docker容器管理
例如:docker run nginx 使用nginx鏡像啟用一個容器(這種啟用方式默認會占用當前終端,用戶無法進行后續操作),為了解決此類問題我們可以附加參數更好地控制容器:
| -d | 讓docker 容器在后臺運行 |
| -P | 使用隨機的宿主機端口映射容器端口 |
| -p | 使用指定端口映射內容端口 -p 宿主機端口:docker 端口 |
| -e 參數名=參數值 | 向容器傳遞參數 |
| -v | 掛載數據目錄 |
| docker logs 容器名 | 展示容器日志 |
| docker logs -f 容器名 | 跟蹤容器日志 |
| docker logs --tail 10 或者 docker logs -n 10 | 從日志的末尾顯示日志 |
| docker logs -t | 顯示日志時間戳 |
| docker logs -t --since=“2021-06-02T13:03:00Z” abc | 顯示指定時間之后的日志 |
| docker logs -t --until=“2021-06-02T13:03:00Z” abc | 顯示指定時間之前的日志 |
| docker logs abc | greap Chrome |
| docker stop 容器名 | 停止容器 |
| docker start 容器名 | 啟動容器 |
| docker pause 容器名 | 暫停一個容器運行 |
| docker unpause 容器名 | 恢復一個容器運行 |
| docker restart 容器名 | 重啟一個容器 |
| docker rm 容器名 | 刪除一個容器 |
(4)Docker網絡管理
使用docker network ls 查看docker目前支持的網絡。當安裝完docker后,默認會創建三個網絡:bridge網絡,host網絡和none網絡。可以使用:
- docker inspect 網絡id 查看每一個網絡的相關配置
- netstat -lnpt 查看目前系統開放的端口
- firewall-cmd --list-ports 查看防火墻開放的端口
docker的四種網絡模式
1.host模式
- 例如使用創建一個host模式的mysql容器 docker run -d -e MYSQL_ROOT_PASSWORD='mysql' --net='host' --name='cslcp_mysql' mysql 在容器外連接mysql使用的ip是linux的ip,端口同樣是linux的端口3306
- 使用docker ps -a的場景下,無法顯示目前正在使用的端口。在這種情況下可以使用docker inspect鏡像名來查看該鏡像開放的端口號。或者使用docker logs 容器名 查看容器啟動日志來查看啟動占用的端口,或者通過docker inspect 容器名來查看容器占用的端口號
- 另外需要注意的問題是,以host模式啟動的容器,需要確保容器使用的端口在宿主機的防火墻中配置過開放策略,否則其他機器無法訪問對應服務。 firewall-cmd --permanent --zone=public --add-port=80/tcp
- 最后,在使用host模式的場景下,可以開啟多個容器,雖然有時候能夠啟動成功,但是當容器運行一段時間后,會發現只有一個能夠運行,其他的都異常關閉了,這是因為端口沖突的原因。至于最后能保留哪一個容器,這個運行的效果不一定。?
2.bridge模式(網橋模式,這是docker的默認網絡模式)
- 使用docker network ls 查看當前的docker開放的網絡
- 使用docker inspect 網絡id 查看網橋的配置,通常docker的橋模式會在宿主機上創建一個叫做docker0的宿主機網絡作為網 橋。可以在宿主機上使用ip addr查看相關的ip。如果不想使用宿主機上默認的ip可以在 /etc/docker/ 目錄中添加 daemon.json 配置文件,在文件中添加{"bip":"192.168.100.1/24"} 配置來修改對應的ip配置。足以在修改上述配置的時候,需要先停止dokcer服務 systemctl stop docker 修改完成后再次啟動docker服務
- 重新啟動docker服務器,再次開啟容器,可以查看容器的ip按照新配置的方案進行ip設置
- 如果不希望使用docker分配的ip地址,可以在啟動的過程中使用
–ip參數來指定容器需要使用的ip地址(需要注意的是默認的橋接模式不允許用戶自定義ip)例如:docker run -itd --name='c6' --network=bridge --ip=192.168.100.7 centos 該命令在指定后會報出異常。
當我們需要使容器與容器進行通信時。可以使用以下策略
靜態配置策略
第一步:創建自定義網絡
docker network create --subnet=192.168.90.0/24 cslcp_network第二步:動容器并加入網絡
docker run -it --name=cslcp_1 --network=csclp_network --ip=192.168.90.5 centos使用link配置策略
docker run -itd --name=c1 centos docker run -itd --name=c2 --link=c1:cnet1 centos進入到centos輸入ping cnet1查看是否連通
docker exec -it c2 bash這種配置的優勢是可以不使用靜態ip,只是使用容器別名就可以直接訪問目標容器,避免了在宿主機中出現ip沖突的問題,缺點是容器有依賴關系,所以被依賴的容器一定需要先啟動,在一個復雜的網絡模型中使用起來比較麻煩。
使用自定義網絡+網絡別名方案(推薦)
第一步:創建自定義網絡
第二步:啟動容器
docker run -itd --name=c1 --network=cslcp_network --network-alias=c1_net centos第三步:通過網絡別名訪問目標容器(進入到centos輸入ping c1_net查看是否連通)
?
3.container模式
使用該模式可以讓多個容器共享同一個ip地址。
4**.none模式**(全部手工配置,在生產環境下一般不使用該種模式,老師就沒講,有想了解的可以去其他帖子看看)
三、docker file ( 利用docker file 創建一個自己的鏡像,產品給客戶部署 )
? 第一部分是基礎鏡像信息
? 第二部分是維護者信息(非必須)
? 第三部分是鏡像的操作指令
? 第四部分是容器啟動的時候需要執行的指令
docker file的編寫
- docker file是一個文本文件,通常該文件起名是Dockerfile,文件中第一部分需要編寫基礎鏡像信息。使用FROM關鍵字,例如 FROM nginx 該語句的含義是指,創建的鏡像文件是基礎鏡像是nginx,隱含的含義是新鏡像也會包含nginx的基礎鏡像所以對于docker鏡像來講鏡像的基礎層都應該是操作系統 - 編寫基礎鏡像后,可以在后面跟鏡像的維護人信息,MAINTAINER <用戶名 用戶郵箱>
- 第三部分需要編寫針對目前讀寫容器進行的操作指令,需要注意的是,每一條指定都會改變鏡像,所以每一條指定都會生成新的進行層,在工作中,鏡像的層級盡量要少,鏡像層多了后,會耗費較大的存儲空間。常用的指定包括
1) RUN run指定代表在當前的容器層的shell中要執行的命令,例如在容器中創建一個文件夾(RUN mkdir /root/docker/content)。需要注意的是,每一次執行RUN指令都會需改當前的容器層狀態,所以每次修改都會在當前容器中產生新的層,在生產活動中,就一個較為合理的使用建議是,鏡像的層次盡量的少,所以建議在容器中采用&&號來連接多個需要RUN的指令,如果指令過長可以使用 “\”進行換行操作。RUN命令的執行時機是在構建鏡像的時候。在build時候執行
2) EXPOSE 該指定代表容器運行之后向外開放的端口號。例如 EXPOSE 80 代表默認情況下,使用該鏡像創建容器的時候,容器向宿主機開放80端口,如果需要向宿主機開放多個端口,可以直接寫為 EXPOSE 90 80 1010
*** 3)*** ENV 設置docker容器的環境變量,在使用鏡像啟動容器的時候,我們有可能需要向容器中傳遞一些啟動參數,這時候ENV就可以用來實施這個任務。在Dockerfile中,可以使用ENV MY_NAME=value的形式來設置名字叫做MY_NAME的環境變量,并賦予其初始值value,如果在啟動容器的時候,需要改變其值,可以使用-e參數來進行重新指定,ENV設置的環境變量,在生效后,將會一直存在。想要觀察環境變量的值,可以在容器啟動后,進入容器后使用env命令來進行查看。此外,也可以在容器之外,使用 docker inspect命令來查看。在dockerfile中,聲明了一個環境變量之后,可以使用 $環境變量的方式來進行引用
4) COPY在構建鏡像的時候,如果需要將外部的文件拷貝的鏡像內部,則可以使用COPY命令。命令格式為 COPY 宿主機文件 容器內地址。在生產環境下,有一個比較好的實施方式是,將需要拷貝的內容全部放到一個文件夾中,然后再dockerfile所在的目錄進行鏡像構建,盡量控制context的范圍內的文件大小,因為在構建的過程中,docker需要將context中的所有文件都發送到docker的守護進程中,所以如果context內的文件太多,會造成構建鏡像過大以及構建過程過長的問題。ADD和COPY相仿,它能夠將宿主機的tar壓縮包解壓陳文件搞到鏡像中。也可以下載宿主機沒有的
5) USER通常指定為root賬號。
6) WORKDIR,該指定會改變從WORKDIR指定之后的RUN以及CMD等相關指定的當前目錄,例如 WORKDIR /root/web 則代表之后的指令的工作目錄從root目錄變更為/root/web目錄。
7) VOLUME在構建鏡像的時候,我們可以通過VOLUMN來給鏡像指定一個掛載目標,在鏡像內可以使用掛載目標直接訪問在宿主機上的文件,如果沒有指定掛載內容,則直接訪問宿主機之內的內容。掛載目錄或者是掛載文件可以在創建容器的時候使用-v參數來指定。 VOLUME可以接收一個數組型的參數,如果需要多個掛載點,可以在數組內直接聲明。具體語法 VOLUME ["/root/vol","/root/tt"]
8) CMD,該指令與RUN的書寫模式基本一致,但是她是在docker容器啟動的時候需要執行的命令,在dockerfile中只能有一個CMD,如果寫了多個也只會執行最后一個。在run或start執行。。demon off 守護模式關閉,進入當前控制臺相當于沒有-it
例如:
四、docker 服務編排
- docker 服務編排也叫docker compose,它的出現是應來解決使用docker部署大型應用的業務場景的問題。通常在生產環境中,使用docker部署一個應用需要使用多個容器,例如部署前端、后端、依賴服務、數據庫等。如果每個容器都需要手工使用shell來啟動則效率過于低下,所以在這樣的場景中,我們可以采用docker compose來進行docker容器的編排工作。
第一步:下載docker compose
curl -L https://github.com/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose第二步:修改docker compose讓其有可執行權限
chmod 744 /usr/local/bin/docker-compose第三步:測試
docker-compose -version第四部:docker-compose.yml文件的編寫
在docker-compose.yml文件中可以編寫相關的配置屬性,用來管理compose的構建過程,主要的屬性包括:
1)version 代表compose文件格式版本,按照官網的實例,建議目前采用‘3.9’版本
2)services 該屬性是compose文件中的核心屬性,在該屬性之下,可以配置compose啟動的各種服務。主要是需要compose啟動的各種容器信息。也是compose文件中主要的開發內容。
常用屬性:
| image | 當前服務使用什么鏡像文件 |
| ports | 當前容器需要映射的端口信息 - ”8080:80“ |
| enviroments | 當前鏡像需要傳遞的參數 |
| volumes | 當前鏡像的掛在點 |
| tty:true | 代表使用-it模式啟動服務 |
| build | 指定dockerfile所在的路徑,當使用docker compose編排一個容器,而且該容器需要構建的時候需要使用該參數 |
| container_name | 指定編排容器的名稱 |
| restart:always | 在docker服務重啟后,該容器是否自動重啟 |
| depends_on: 服務名 | 設定服務依賴關系,通過該配置可以決定服務的啟動順序 |
| env_file | 指定配置文件 |
| context | 指定上下文 |
| dockerfile | 指定需要使用的dockerfile文件 |
3)networks
例子1:在service中配置簡單的服務信息,編寫compose文件,啟動一個nginx容器
version: '3.9' services:my_nginx:image: "nginx"ports:- "8080:9090"volumes:- "/root/docker_vol/web/dist:/usr/share/nginx/html:ro"- "/root/docker_vol/web/conf/nginx.conf:/etc/nginx/nginx.conf:ro"- 使用docker-compose up命令 啟動容器編排,需要注意的是,容器啟動成功后,默認會占用當前的終端用來輸出日志信息。我們可以重新打開一個終端,使用docker ps命令查看,發現docker中多了一個容器名字叫做 **my_nginx_1.這就是compose替我們啟動的容器。
- 在上面的例子中,my_nginx是一個服務的名字,也可以理解為是生成容器名字的其中一部分,image屬性代表要使用什么鏡像,ports 代表需要映射的端口,前邊是宿主機的端口,而后面是容器內的端口。volumns代表要進行的文件掛載。
- 此外,使用docker network ls命令可以發現,compose啟動后,自動給我們創建了一個網絡,通過 docker inspect 命令發現使用當前compose文件啟動的容器默認都加入到了,新創建的網絡中。
例子2:在tomcat-compose文件中構建一個服務,在本地docker中不存在有對應的鏡像
version: '3.9'services:my_tomcat:image: "tomcat"- 如果在compose中包含本地docker中不存在的鏡像,則在運行compose的過程中會自動下載對應的鏡像。理論上在一臺安裝有docker以及docker
- compose的宿主機上,在保證網絡暢通的前提下,我們只需要依靠docker-compose文件就可以直接安裝對應的系統。
- 此外,在當前的例子中,我們將compose文件認為的修改為
tomcat-compose.yml,如果不使用默認的文件名,則需要在執行docker-compose up命令的時候加上 -f 參數,手工指定對應的yml文件。
例子3:一次啟動多個容器
version: '3.9'services:my_tomcat:image: "tomcat"my_nginx:image: "nginx"ports:- "8080:9090"volumes:- "/root/docker_vol/web/dist:/usr/share/nginx/html:ro"- "/root/docker_vol/web/conf/nginx.conf:/etc/nginx/nginx.conf:ro"docker-compose命令
? 在之前的例子中,我們使用了docker-compose up命令來啟動一個容器編排,接下來,我們詳細了解一下,在docker-compose中常用的命令以及參數使用
常用參數:
-f 默認docker-compose會在當前文件夾下詢招Dockercompose.yml文件,如果需要自定義文件名,可以使用-f 文件名 形式來指定
-p 指定項目名稱 指定項目后,通過compoose創建的所有容器都會自動添加項目名稱前綴
-v 查看當前docker-compose的版本信息
docker compose 默認的環境變量為.env,在其中我們可以使用對應的鍵值對模式給compose傳遞值 --env-file 參數可以動態制動compose需要使用的配置文件位置
常用參數: `
| -d | 后臺運行 |
| –force-recreate | 強制更新已經存在的容器 |
| –remove-orphans | 刪除在compose文件中沒有定義的容器,通常使用在修改了compose文件的場景下使用服務名 單獨啟動compose中的某一個服務,如果服務存在依賴,則被依賴的服務也會被啟動 |
| docker-compose down | 刪除對應的容器,網絡服務 |
| docker-compose stop | 停止compose對應的所有服務 |
| docker-compose start | 啟動所有的服務容器 |
| docker-compose ps | 查看與當前compse相關的服務容器 |
| -q | 只列出id值,其他值不顯示 |
| docker-compose logs | 讀取日志信息 |
| docker-compose pull | 拉取服務對應的鏡像 |
| docker-compose build | 構建compose中的所有鏡像、 |
| docker-compose images | 查看所有的鏡像信息 |
| docker-compose config | 查看配置文件信息 |
| docker-compose restart | 重啟服務 |
| docker-compose exec 服務名 | 進行指定服務的容器 |
| docker-compose rm | 刪除所有已經停止的服務容器 |
| 以上命令涉及到某個服務的時候均可以通過:命令:服務名對相應的服務進行操作 | 看左面 |
docker compose 網絡管理
以及docker inspect 網絡id 進行相關的查詢。
定義一個網絡,并在服務中使用networks屬性加入一個自定義網絡。這時候有三種結果,如果所有的服務都加入到了自定義網絡,則docker,會創建自定義網絡,并將所有的服務容器添加到對應的網絡中,如果沒有任何服務聲明加入自定義網絡,則docker會創建默認網絡,然后將容器添加到默認網絡,而不會創建自定義網絡,如果有的服務聲明添加到自定義網絡,而有的服務沒有聲明,則docker會創建兩個網絡,一個是自定義網絡,而另一個是默認網絡,并將對應的容器添加到對應的網絡中。
當compose啟動成功后可以直接使用ping 訪問服務名
五、docker CI部署樣例
記得先創建掛載出去的文件夾,網上教學據說不創建也能用,但是可能是我自己環境原因不太行,所以就提前創建好了。整套流程用的是LDAP(管理賬號用的)+ heimdall(門戶站點)+gitlab (代碼倉庫)+ jenkins (持續構建、流水線)+redmine(飯票)+ sonar (代碼質量檢測工具)+nextcloud(網盤) 部分功能持續更新中......
version: '3.1'services:hs-ldap:image: osixia/openldap:latesthostname: hs-ldaprestart: alwaysports:- "10001:389"volumes:- /home/docker_vol/openldap/slapd/database:/var/lib/ldap- /home/docker_vol/openldap/slapd/config:/etc/ldap/slapd.d- /etc/localtime:/etc/localtime:roenvironment:- LDAP_ORGANISATION=jn- LDAP_DOMAIN=jn.com- LDAP_ADMIN_PASSWORD=P@ssword- LDAP_CONFIG_PASSWORD=P@ssword- TZ=Asia/Shanghairedmine:image: redminerestart: alwaysports:- "10003:3000"volumes:- /home/docker_vol/redmine/files:/usr/src/redmine/files- /home/docker_vol/redmine/log:/usr/src/redmine/log- /home/docker_vol/redmine/data:/home/redmine/data- /home/docker_vol/redmine/config/configuration.yml:/usr/src/redmine/config/configuration.yml- /home/docker_vol/redmine/plugins:/usr/src/redmine/plugins- /etc/localtime:/etc/localtime:roenvironment:REDMINE_DB_MYSQL: dbREDMINE_DB_PASSWORD: schoolcloudREDMINE_SECRET_KEY_BASE: supersecretkeyREDMINE_DB_ENCODING: utf8db:image: mysql:5.7restart: alwaysports:- "10010:3306"command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_civolumes:- /home/docker_vol/redmine/mysql/data:/var/lib/mysql- /home/docker_vol/redmine/mysql/conf:/etc/mysql/conf.d- /etc/localtime:/etc/localtime:roenvironment:MYSQL_ROOT_PASSWORD: schoolcloudMYSQL_DATABASE: redmineTZ: Asia/Shanghaidb_nextcloud:image: mysql:5.7restart: alwaysports:- "10011:3306"command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_civolumes:- /home/docker_vol/nextcloud/mysql/data:/var/lib/mysql- /home/docker_vol/nextcloud/mysql/conf:/etc/mysql/conf.d- /etc/localtime:/etc/localtime:roenvironment:MYSQL_ROOT_PASSWORD: schoolcloudMYSQL_PASSWORD: schoolcloudMYSQL_DATABASE: nextcloudMYSQL_USER: nextcloudTZ: Asia/Shanghaidevops-nextcloud:image: nextcloudrestart: alwaysports:- "10002:80"volumes:- /home/docker_vol/nextcloud/html1:/var/www/html- /etc/localtime:/etc/localtime:roenvironment:REDMINE_DB_MYSQL: db_nextcloudREDMINE_DB_PASSWORD: schoolcloudREDMINE_SECRET_KEY_BASE: supersecretkeyREDMINE_DB_ENCODING: utf8heimdall:image: linuxserver/heimdallrestart: alwayscontainer_name: heimdallenvironment:- PUID=1000- PGID=1000- TZ=Asia/Shanghaivolumes:- /home/docker_vol/heimdall/config:/configports:- 80:80- 443:443restart: unless-stoppedgitlab:privileged: trueimage: gitlab/gitlab-cerestart: alwaysports:- "5443:443"- "82:82"- "2222:22"volumes:- /home/docker_vol/gitlab/config:/etc/gitlab- /home/docker_vol/gitlab/data:/var/opt/gitlab- /home/docker_vol/gitlab/logs:/var/log/gitlabtty: truejenkins:privileged: truetty: trueimage: jenkins/jenkins:2.289.1-lts-centos7restart: alwaysports:- "9302:8080"- "50000:50000"volumes:- /home/docker_vol/jenkins:/var/jenkins_home- /var/run/docker.sock:/var/run/docker.socksonarqube:restart: alwaysimage: sonarqubetty: trueenvironment:- SONAR_ES_BOOTSTRAP_CHECKS_DISABLE=trueports:- "9000:9000"六、docker集群
(1)Docker Swarm 配置準備以及部署
(2)管理節點
? Active:節點目前處于空閑狀態,可以被指派新的任務
? Pause:節點目前處于不可接受新任務的狀態,但目前的任務可以繼續執行
? Drain:節點目前處于不可接受新任務的狀態,并且停止目前正在執行的任務
? Down:廢棄的節點
? docker node update --availability drain manager 將管理節點調整為不接受新任務,也不再執行新任務的狀態(專做管理)docker node update --availability drain work01
? docker swarm leave (工作節點) 讓當前節點離開集群,離開后在管理端 節點的狀態變成down狀態。
? docker swarm leave --force (管理節點)解散集群
? docker node rm 節點名稱 刪除一個節點(只能刪除down狀態的節點)
? docker service create --replicas 2 --name cslcp_web -p18080:80 nginx 創建服務
? docker service ls 查看當前的集群中有那些服務
? docker service ps 服務名 查看有那些節點為當前服務提供支持
? docker service scale cslcp_web=3 修改服務節點數量
? docker service rm cslcp_web 刪除所有的服務節點
制作整理不易,以上內容均為原創(參考了部分官方文檔和老師整理的案例)。如要引用請附上本文鏈接,如有疑問可以在評論區暢所欲言,作者看到會第一時間回復,歡迎交流!
總結
以上是生活随笔為你收集整理的Docker的概念及基本指令学习(从安装、管理、核心概念到docker file 、 服务编排、集群)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTML5标准制定完成,浏览器大战能消停
- 下一篇: NodeJs(尚硅谷视频学习笔记)