分享一些我自己的docker使用經驗
一、mydocker
上手docker可以在windows上裝一個虛擬機器管理工具,模擬Linux下的環境,非常方便。
部署docker涉及到pull images
,需要訪問部署於國外的映象伺服器(訪問極慢),國內有很多docker的映象伺服器,選一個用萬事大吉,這裡安利個阿里的:
阿里雲映象加速器:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
要完成映象的相關配置:
在/etc/docker/daemon.json
,檔案末尾增加如下內容
{
"registry-mirrors": ["https://你的ID.mirror.aliyuncs.com"]
}
二、docker架構
docker從遠端倉庫中下載映象到本地,生成容器實體執行
-
映象(Image):Docker 映象(Image),就相當於是一個 root 檔案系統。比如官方映象 ubuntu:16.04 就包含了 完整的一套 Ubuntu16.04 最小系統的 root 檔案系統。
-
容器(Container):映象(Image)和容器(Container)的關係,就像是物件導向程式設計中的類和物件一樣, 映象是靜態的定義,容器是映象執行時的實體。容器可以被建立、啟動、停止、刪除、暫停等。
-
倉庫(Repository):倉庫可看成一個程式碼控制中心,用來儲存映象。
三、docker命令
3.1.程式相關命令
程式daemon操作docker的命令
啟動docker服務:
systemctl start docker
停止docker服務:
systemctl stop docker
重啟docker服務:
systemctl restart docker
檢視docker服務狀態:
systemctl status docker
設定開機啟動docker服務:
systemctl enable docker
3.2.映象相關命令
映象命令包括如下內容:檢視映象、搜尋映象 、拉取映象 、刪除映象
檢視映象: 檢視本地所有的映象
docker images
docker images –q # 檢視所用映象的id
搜尋映象:從網路中查詢需要的映象
docker search 映象名稱
docker search redis #查詢redis映象
拉取映象:從Docker倉庫下載映象到本地,映象名稱格式為名稱:版本號,如果版本號不指定則是最新的版本 lastest。
如果不知道映象版本,可以去docker hub 搜尋對應映象檢視。
https://hub.docker.com/
docker pull 映象名稱
docker pull redis #下載最新版本redis
docker pull redis:5.0 #下載5.0版本redis
刪除映象: 刪除本地映象
docker rmi 映象id # 刪除指定本地映象
# 例如:docker rmi aa27923130e6(imageId)
# 例如:docker rmi redis:5.0(imageName+imageTag)
docker images -q #檢視所有的映象列表
docker rmi `docker images -q` # 刪除所有本地映象
3.3.容器相關命令
檢視容器、建立容器、進入容器、啟動容器、停止容器、刪除容器、檢視容器資訊
檢視一個命令可以帶哪些引數組合,可以在命令後加上--help
檢視容器
docker ps # 檢視正在執行的容器
docker ps –a # 檢視所有容器
docker ps –a # 檢視所有容器id
docker ps --help # 檢視引數提示
建立並啟動容器
docker run 引數
引數說明:
- -i:保持容器執行。通常與 -t 同時使用。加入it這兩個引數後,容器建立後自動進入容器中,退出容器後,容 器自動關閉。
- -t:為容器重新分配一個偽輸入終端,通常與 -i 同時使用。
- -d:以守護(後臺)模式執行容器。建立一個容器在後臺執行,需要使用docker exec 進入容器。退出後,容器不會關閉。
- -it 建立的容器一般稱為互動式容器,-id 建立的容器一般稱為守護式容器
- –name:為建立的容器命名。
docker run -it --name=c1 centos:7 /bin/bash #建立互動式容器(/bin/bash預設也可以不寫)
docker run -id --name=c2 centos:7 #建立守護式容器
注意:互動式容器,exit後容器自動關閉,守護式容器會在後臺執行
進入容器
docker exec -it c2 /bin/bash #進入容器,進入的時候不能省略
docker exec -it 49d63fdf81d4 /bin/bash #進入容器
停止容器
docker stop 容器名稱
docker stop 容器id
啟動容器
docker start 容器名稱
刪除容器:如果容器是執行狀態則刪除失敗,需要停止容器才能刪除
docker rm 容器名稱
docker rm 容器id
檢視容器資訊
docker inspect 容器名稱
刪除所有容器
docker rm `docker ps -aq`
四、Docker容器的資料卷
4.1 資料卷概念及作用
Docker 容器刪除後,在容器中產生的資料還在嗎?不在了
Docker 容器和外部機器可以直接交換檔案嗎?不可以
容器之間想要進行資料互動?
資料卷概念
-
資料卷是宿主機中的一個目錄或檔案
-
當容器目錄和資料卷目錄繫結後,對方的修改會立即同步
-
一個資料卷可以被多個容器同時掛載
-
一個容器也可以被掛載多個資料卷
資料卷的作用
- 容器資料持久化
- 外部機器和容器間接通訊
- 容器之間資料交換
4.2 配置資料卷
建立啟動容器時,使用 –v 引數 設定資料卷
docker run ... –v 宿主機目錄(檔案):容器內目錄(檔案) ...
注意事項:
- 容器目錄必須是絕對路徑
- 如果宿主機目錄或容器內目錄不存在,會自動建立
- 可以用多個
-v
掛載多個資料卷
- 演示資料卷持久化
建立c1掛載/root/data到/root/data_container
docker run -it --name=c1 -v /root/data:/root/data_container centos:7 /bin/bash
- 演示一個容器掛載多個資料卷
docker run -it --name=c2 \
-v ~/data2:/root/data2 \
-v ~/data3:/root/data3 \
centos:7
- 兩個容器掛載同一個資料卷
docker run -it --name=c3 -v /root/data:/root/data_container centos:7 /bin/bash
docker run -it --name=c4 -v /root/data:/root/data_container centos:7 /bin/bash
4.3 配置資料卷容器
多容器進行資料交換,多個容器掛載同一個資料卷容器,完成資料互動
1.建立啟動c3資料卷容器,使用 –v 引數 設定資料卷
docker run -it --name=c3 -v /volume centos:7 /bin/bash
這裡沒有指定宿主機目錄,預設生成一個宿主機目錄
docker inspect c3 #檢視c3
2.建立啟動 c1 c2 容器,使用 –-volumes-from 引數 設定資料卷
docker run -it --name=c1 --volumes-from c3 centos:7 /bin/bash
docker run -it --name=c2 --volumes-from c3 centos:7 /bin/bash
使用 c3資料卷容器建立c1,c2,這時即使c3關閉不影響c3,c4互動
4.3 資料卷小結
1.資料卷概念
- 宿主機的一個目錄或檔案,可以是目錄掛載目錄,也可以是檔案掛載檔案
2.資料卷作用
- 容器資料持久化
- 客戶端和容器資料交換
- 容器間資料交換
3.資料卷容器
- 建立一個容器,掛載一個目錄,讓其他容器繼承自該容器( --volume-from )。
- 通過簡單方式實現資料卷配置
五、Docker應用部署
5.1.MySQL部署
分析
- 容器內的網路服務和外部機器不能直接通訊
- 外部機器和宿主機可以直接通訊
- 宿主機和容器可以直接通訊
- 當容器中的網路服務需要被外部機器訪問時,可以將容器中提供服務的埠對映到宿主機的埠上。外部機 器訪問宿主機的埠,從而間接訪問容器的服務。
- 這種操作稱為:埠對映
1.搜尋mysql映象
docker search mysql
2.拉取mysql映象
docker pull mysql:5.6
3.建立容器,設定埠對映、目錄對映
# 在/root目錄下建立mysql目錄用於儲存mysql資料資訊
mkdir ~/mysql
cd ~/mysql
docker run -id \
-p 3307:3306 \
--name=c_mysql \
-v $PWD/conf:/etc/mysql/conf.d \
-v $PWD/logs:/logs \
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.6
- 引數說明:
- ***-p 3307:3306:***將容器的 3306 埠對映到宿主機的 3307 埠。
- ***-v $PWD/conf:/etc/mysql/conf.d:***將主機當前目錄下的 conf/my.cnf 掛載到容器的 /etc/mysql/my.cnf。配置目錄
- ***-v $PWD/logs:/logs:***將主機當前目錄下的 logs 目錄掛載到容器的 /logs。日誌目錄
- ***-v $PWD/data:/var/lib/mysql :***將主機當前目錄下的data目錄掛載到容器的 /var/lib/mysql 。資料目 錄
- ***-e MYSQL_ROOT_PASSWORD=123456:***初始化 root 使用者的密碼。
4.進入容器,操作mysql
docker exec -it c_mysql /bin/bash
mysql -uroot -p123456
show databases;
create database db1;
5.使用外部機器連線容器中的mysql
5.2.Tomcat部署
1.搜尋tomcat映象
docker search tomcat
2.拉取tomcat映象
docker pull tomcat
3.建立容器,設定埠對映、目錄對映
# 在/root目錄下建立tomcat目錄用於儲存tomcat資料資訊
mkdir ~/tomcat
cd ~/tomcat
docker run -id --name=c_tomcat \
-p 8080:8080 \
-v $PWD:/usr/local/tomcat/webapps \
tomcat
- 引數說明:
- ***-p 8080:8080:***將容器的8080埠對映到主機的8080埠
- ***-v $PWD:/usr/local/tomcat/webapps:***將主機中當前目錄掛載到容器的webapps
4.在tomcat主機下建立一個web應用
以後我們部署的應用想要往tomcat裡部署,只要往宿主機中的資料卷中放即可
[root@docker-cry001 tomcat]# mkdir test
[root@docker-cry001 tomcat]# cd test
[root@docker-cry001 test]# vi index.html
5.使用外部機器訪問tomcat
http://192.168.122.133:8080/test/index.html
5.3.Nginx部署
Nginx經常用於做反向代理和負載均衡,經常需要修改配置檔案,故需要建立配置檔案的資料卷對映
1.搜尋nginx映象
docker search nginx
2.拉取nginx映象
docker pull nginx
3.建立容器,設定埠對映、目錄對映
# 在/root目錄下建立nginx目錄用於儲存nginx資料資訊
mkdir ~/nginx
cd ~/nginx
mkdir conf
cd conf
# 在~/nginx/conf/下建立nginx.conf檔案,貼上下面內容
vim nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
docker run -id --name=c_nginx \
-p 80:80 \
-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \
-v $PWD/logs:/var/log/nginx \
-v $PWD/html:/usr/share/nginx/html \
nginx
- 引數說明:
- ***-p 80:80:***將容器的 80埠對映到宿主機的 80 埠。
- ***-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf:***將主機當前目錄下的 /conf/nginx.conf 掛載到容 器的 :/etc/nginx/nginx.conf。配置目錄
- ***-v $PWD/logs:/var/log/nginx:***將主機當前目錄下的 logs 目錄掛載到容器的/var/log/nginx。日誌目 錄
4.在nginx主機下建立一個web應用
以後我們部署的應用想要往tomcat裡部署,只要往宿主機中的資料卷中放即可
[root@docker-cry001 tomcat]# mkdir test
[root@docker-cry001 tomcat]# cd test
[root@docker-cry001 test]# vi index.html
5.使用外部機器訪問nginx
http://192.168.122.133/
5.4.Redis部署
1.搜尋redis映象
docker search redis
2.拉取redis映象
docker pull redis:5.0
3.建立容器,設定埠對映
docker run -id --name=c_redis -p 6379:6379 redis:5.0
4.使用外部機器連線redis
./redis-cli.exe -h 192.168.220.12 -p 6379
keys *
set name cry
get name
六、Dockerfile
Dockerfile是一種映象製作的主要方法
6.1. Docker映象原理
linux作業系統組成部分:
- 程式排程子系統
- 程式通訊子系統
- 記憶體管理子系統
- 裝置管理子系統
- 檔案管理子系統
- 網路通訊子系統
- 作業控制子系統
Linux檔案系統由bootfs和rootfs兩部分組成
- bootfs:包含bootloader(引導載入程式)和 kernel(核心)
- rootfs: root檔案系統,包含的就是典型 Linux 系統中的/dev,/proc,/bin,/etc等標準目錄和檔案
- 不同的linux發行版,bootfs基本一樣,而rootfs不同,如ubuntu,centos等
docker映象原理
- Docker映象是由特殊的檔案系統疊加而成
- 最底端是 bootfs,並使用宿主機的bootfs
- 第二層是 root檔案系統rootfs,稱為base image
- 然後再往上可以疊加其他的映象檔案
- 統一檔案系統(Union File System)技術能夠將不同的層整合成一個檔案系統,為這些層提供了一個統一的 視角,這樣就隱藏了多層的存在,在使用者的角度看來,只存在一個檔案系統。
- 一個映象可以放在另一個映象的上面。位於下面的映象稱為父映象,最底部的映象成為基礎映象。
- 當從一個映象啟動容器時,Docker會在最頂層載入一個讀寫檔案系統作為容器
現在我們可以解決幾個問題:
1.Docker 映象本質是什麼?
- 是一個分層檔案系統
2.Docker 中一個centos映象為什麼只有200MB,而一個centos作業系統的iso檔案要幾個個G?
- Centos的iso映象檔案包含bootfs和rootfs,而docker的centos映象複用作業系統的bootfs,只有rootfs和其 他映象層。
3.Docker 中一個tomcat映象為什麼有600MB,而一個tomcat安裝包只有70多MB?
- 由於docker中映象是分層的,tomcat雖然只有70多MB,但他需要依賴於父映象和基礎映象,所有整個對外 暴露的tomcat映象大小600多MB
6.2. 映象製作
6.2.1 容器轉映象
可寫容器 => 新的映象(不包括資料卷中資料) => 壓縮 => 解壓出另一個映象
docker commit 容器id 映象名稱:版本號
docker save -o 壓縮檔名稱 映象名稱:版本號
docker load –i 壓縮檔名稱
# 建立tomcat映象
docker run -id --name=c_tomcat \
-p 8080:8080 \
-v $PWD:/usr/local/tomcat/webapps \
tomcat
# 進入tomcat映象
docker exec -it c_tomcat /bin/bash
#建立a.txt b.txt
cd ~
touch a.txt b.txt
#容器轉映象
docker commit cef7695e0773 cry_tomcat:1.0
#壓縮映象
docker save -o cry_tomcat.tar cry_tomcat:1.0
#刪除原來映象
docker rmi cry_tomcat:1.0
#從壓縮檔案載入映象
docker load -i cry_tomcat.tar
#產生映象
docker run -it --name=new_tomcat cry_tomcat:1.0 /bin/bas
#進入檢視內容
docker exec -it c_tomcat /bin/bash
#可以看到a.txt b.txt存在,而webapps/test不存在
6.2.2 dockerfile
概念
- Dockerfile 是一個文字檔案
- 包含了一條條的指令
- 每一條指令構建一層,基於基礎映象,最終構建出一個新的映象
- 對於開發人員:可以為開發團隊提供一個完全一致的開發環境
- 對於測試人員:可以直接拿開發時所構建的映象或者通過Dockerfile檔案構建一個新的映象開始工作了
- 對於運維人員:在部署時,可以實現應用的無縫移植
參考Dochub網址:https://hub.docker.com ,比如centos和nginx映象
一、我們可以自定義一個centos7映象
要求:
- 預設登入路徑為 /usr
- 可以使用vim
實現步驟
- 定義父映象:FROM centos:7
- 定義作者資訊:MAINTAINER cry cry@cry.cn
- 執行安裝vim命令: RUN yum install -y vim
- 定義預設的工作目錄:WORKDIR /usr
- 定義容器啟動執行的命令:CMD /bin/bash
- 通過dockerfile構建映象:docker bulid –f dockerfile檔案路徑 –t 映象名稱:版本 .
#具體程式碼
mkdir ~/docker-files
cd ~/docker-files
vim centos_dockerfile
dockerfile具體內容
FROM centos:7
MAINTAINER cry <cry@cry.cn>
RUN yum install -y vim
WORKDIR /usr
CMD ["/bin/bash"]
#構建多個命令可以這樣寫: CMD ["/bin/bash","",""]
build
docker build -f ./centos_dockerfile -t cry_centos:1 .
- -f:映象檔案
- -t:新映象名
- . 定址路徑
#進入看效果
docker run -it --name=c2 cry_centos:1
二、我們可以自行釋出一個springboot專案練練手
-
定義父映象:FROM java:8
-
定義作者資訊:MAINTAINER cry cry@163.com
-
將jar包新增到容器: ADD springboot.jar app.jar
-
定義容器啟動執行的命令:CMD [“java”,"-jar",“app.jar”]
-
通過dockerfile構建映象:docker bulid –f dockerfile檔案路徑 –t 映象名稱:版本 .
FROM java:8 MAINTAINER cry <cry@163.com> ADD springboot.jar app.jar CMD ["java","-jar","app.jar"]
build
docker build -f ./springboot_dockerfile -t app .
啟動容器
docker run -id -p 9000:8080 app
#如果不指定名字, docker會自己隨機分配一個名字
七、服務編排
7.1. 概念
微服務架構的應用系統中一般包含若干個微服務,每個微服務一般都會部署多個例項,如果每個微服務都要手動啟動停止,維護的工作量會很大。來看下我們日常工作:
- 要從Dockerfile build image 或者去dockerhub拉取image
- 要建立多個container
- 要管理這些container(啟動停止刪除)
通過服務編排可以大量簡化上面的工作***服務編排:按照一定的業務規則批量管理容器***
7.2. Docker Compose
Docker Compose是一個編排多容器分散式部署的工具,提供命令集中管理容器化應用的完整開發週期,包括服務構建,啟動和停止。
7.2.1 安裝Docker Compose
# Compose目前已經完全支援Linux、Mac OS和Windows,在我們安裝Compose之前,需要先安裝Docker。下面我 們以
編譯好的二進位制包方式安裝在Linux系統中。
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# 設定檔案可執行許可權
chmod +x /usr/local/bin/docker-compose
# 檢視版本資訊
docker-compose -version
7.2.2 解除安裝Docker Compose
# 二進位制包方式安裝的,刪除二進位制檔案即可
rm /usr/local/bin/docker-compose
7.3 編排nginx+springboot
需求:使用nginx反向代理到springboot應用
1.建立docker-compose目錄
mkdir ~/docker-compose
cd ~/docker-compose
2.編寫 docker-compose.yml 檔案
version: '3'
services:
nginx:
image: nginx
ports:
- 80:80
links:
- app
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
app:
image: app
expose:
- "8080"
3.建立./nginx/conf.d目錄
mkdir -p ./nginx/conf.d
4.在./nginx/conf.d目錄下編寫app.conf檔案
server {
listen 80;
access_log off;
location / {
proxy_pass http://app:8080/hello;
}
}
5.在~/docker-compose 目錄下使用docker-compose 啟動容器
docker-compose up -d # -d表示已守護模式啟動
6.測試訪問
http://192.168.122.130/hello
7.停止
docker-compose down
相關文章
- Xray使用的一些經驗分享(xray+burp的使用)
- 使用Docker部署Python應用的一些經驗總結DockerPython
- 我的一些學習經驗:ONVIF
- Git 工作流的一些經驗分享Git
- docker學習系列16使用過程的一些經驗總結Docker
- 我的公眾號寫作經驗分享
- Polymer使用經驗分享
- 分享做為獨立開發者的一些經驗
- 給同學們分享一些面試經驗面試
- 分享一些 Kafka 消費資料的小經驗Kafka
- 關於啟用 HTTPS 的一些經驗分享HTTP
- 關於啟用 HTTPS 的一些經驗分享(二)HTTP
- 經驗分享 ----------
- 經驗分享
- OB導數工具使用經驗分享
- 與你分享我在開發專案管理中的一些經驗 之測試管理薦專案管理
- 4年使用經驗,總結Django一些開發經驗Django
- 經驗&教訓分享:我的第一個機器學習專案機器學習
- docker初體驗:docker 自己定製映象Docker
- 分享一些閱讀Java相關框架原始碼的經驗Java框架原始碼
- docker 的一些使用Docker
- iOS 經驗分享iOS
- 微博紅包:大規模Docker叢集實踐經驗分享Docker
- 來自萬智牌設計師的經驗分享:限制自己的設計
- 經驗分享:我們如何使用AWS構建無伺服器架構 - hypertrack伺服器架構
- 就業寒冬,最終拿到5個offer的一些經驗分享就業
- 6條經過驗證的創業經驗分享創業
- 產品經理的面試經驗分享面試
- 優步分享基於Apache Kafka的Presto使用經驗ApacheKafkaREST
- docker使用經驗總結(三、Docker compose基礎應用)Docker
- 分享彼此的優化經驗優化
- Android開發之ListView使用經驗分享AndroidView
- 分享抖音交流經驗
- 一些Java學習經驗分享,幫助你更好更快入門Java
- 分享自己經常用到的刷系統工具
- 使用七牛雲端儲存的一些經驗總結
- 關於Flutter空安全的一些使用經驗和理解Flutter
- 使用K8s的一些經驗和體會K8S