【運維腳手架】之docker

語言: CN / TW / HK

以前有句玩笑話,JAVA是跨平臺的,一次編寫,到處編譯!誠然,java的程式在部署方面是比較複雜和難以除錯的,如果是多地部署要考慮的東西很多,而打包成一個映象,連作業系統都是完全統一的,這樣在99%的情況下是可以做到一次編譯到處執行的,用法簡單、非常的爽

一、什麼是docker

引用官方說明:Docker is an open platform for developing, shipping, and running applications. Docker enables you to separate your applications from your infrastructure so you can deliver software quickly. With Docker, you can manage your infrastructure in the same ways you manage your applications. By taking advantage of Docker’s methodologies for shipping, testing, and deploying code quickly, you can significantly reduce the delay between writing code and running it in production.

簡單講就是,Docker讓基礎設施像應用程式般輕鬆管理方便快速進行整合、測試和封裝,極大的減少交付的延誤

Docker原理

前面該吹的都吹了,這邊不講深奧原理(主要也沒翻過原始碼,講不出來),docker其實也是一個虛擬機器的變種,類似更高階的程式,用java術語講,封裝、抽象更具體,作業系統層面的檔案能共用的都共用了,所以整體容量更小,佔用更少資源。

下圖是容器化和虛擬化的結構對比圖,docker的執行單位是容器,執行在docker引擎上,主要依賴linux核心特性,可以部署很多平臺上,但docker engine上只能跑 linux容器!

為什麼使用 Docker

從商業角度來說,主要是快,天下武功唯快不破,這可以解決(忽略)很多問題!

另外,docker的設計思想是一個容器一個應用,最好是無狀態的,這樣在削峰填谷的時候可以全自動的伸縮!

完全微服務的理念,所以幾乎是標配!當然,超密集應用還有更大生態圈,不是僅僅一個docker能解決的!

應在何時使用 Docker

如果開始考慮上微服務、迭代非常迅速,甚至一日多更,完全建議上docker!大不了最終交付改傳統模式即可。

二、怎麼安裝docker

上文講解了docker的設計和使用理念,這邊補充下docker的使用結構

docker結構再分析

借用一下官方的圖,中間是docker引擎和上面的容器應用,左邊是cli客戶端、同樣位於宿主機上,右邊是遠端倉庫(或區域網倉庫) 這裡有幾個概念要補充下: - 容器是docker執行的最小單位,資源來自於映象,與映象的區別在於有差異化檔案,如程式jar、配置資訊等,是有執行時態的資料沉澱,當容器刪除時,內在資料被刪除! - 映象來源於倉庫,分層儲存(複用、減少容量、不深究),最原始的映象只是個小型化的OS,常見的映象在這上面增加應用,形成新的映象,如搭載nginx的web應用映象 - 倉庫,中央公共倉庫來自於官方,因網路質量和資料安全等原因,可在區域網搭建私有化倉庫,常見有官方的Registry和Vmware公司的Harbor等產品。 - 資料卷,前面說了docker的設計理念,希望容器是無狀態的,這些有狀態的資料檔案就通過資料卷掛載到容器中,容器的銷燬、克隆不影響也可複用!

docker安裝

Docker發行版有CE社群和EE商業兩種版本,CE免費支援週期是7個月,建議採用stable穩定版。 要求宿主機核心最低應不小於3.10版本,這邊採用CentOS7最新版示例。

  • 準備好centos伺服器/虛擬機器後,這裡更新系統和docker的源為阿里雲的官方源,並安裝docker-ce、設定開機自啟、關閉防火牆等一系列操作!

```sh cd /etc/yum.repos.d/
rename .repo .repbak ./*

wget -O /etc/yum.repos.d/aliyun-centos7.repo http://mirrors.aliyun.com/repo/Centos-7.repo

wget -O /etc/yum.repos.d/aliyun-centos-docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

yum clean all
yum makecache fast
yum update -y
yum repolist

yum install -y yum-utils device-mapper-persistent-data lvm2
yum install -y docker-ce

systemctl stop firewalld
systemctl disable firewalld
systemctl enable docker
systemctl start docker ``` - 設定阿里雲加速源,方便後續的映象拉取,這裡需要提前到阿里雲註冊,使用專屬加速器地址! - 註冊地址:阿里雲容器映象服務 (aliyun.com)

sh mkdir -p /etc/docker tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://XXXXXXX.mirror.aliyuncs.com"] } EOF systemctl daemon-reload systemctl restart docker docker --version

  • docker-compose安裝 docker compose主要用來稍大一些應用的組合使用,比如web+mysql組合應用,一個檔案搞定所有配置,並方便更新和解除安裝老應用

因網路問題,目前的主流都是使用daocloud的加速方案,DaoCloud/docker-mirror: docker hub mirror, Docker映象加速器 (github.com)

sh curl -L https://get.daocloud.io/docker/compose/releases/download/v2.4.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose

三、拉個web應用玩玩

這邊將做三個不同的場景演示: - 傳統拉映象、掛載html檔案目錄、啟動應用並訪問 - 使用docker file指令碼,打成映象,存放在本地倉庫,並拉取執行,這是製作自己專屬產品映象的方法 - 使用compose指令碼,組合使用,方便後期更換版本、調整配置,更高階的做法! - 最後補充了dockerFile和compose的組合使用! 總算到了翻程式碼的時候了,堅持住!

場景1:hello world

```sh docker pull nginx:stable docker run -it --rm -d -p 8081:80 --name web -d nginx:stable

mkdir -p /usr/local/docker/nginx_docker/html echo "

風裡雨裡,我們在廈門等你!
" > /usr/local/docker/nginx_docker/html/index.html

docker run -it --rm --name web\ -v /usr/local/docker/nginx_docker/html:/usr/share/nginx/html \ -p 8081:80 \ -d nginx:stable

docker stop web ``` image-20211015114029297

場景2:dockerFile

```SH

prepare

docker pull nginx:stable

mkdir -p /usr/local/docker/nginx_docker/html cd /usr/local/docker/nginx_docker/ echo "

hello world
" > /usr/local/docker/nginx_docker/html/index.html

tee Dockerfile <<-'EOF' FROM nginx:stable MAINTAINER linzhihui [email protected] COPY ./html/index.html /usr/share/nginx/html EOF

docker build -t mynginx:v1.0.1 . docker tag mynginx:v1.0.1 mynginx:latest

docker run -it --rm --name web\ -p 8081:80 \ -d mynginx:latest

docker stop web ```

場景3:compose

``` mkdir -p /usr/local/docker/nginx_docker/html

echo "

hello linbaba2
" > /usr/local/docker/nginx_docker/html/index.html

tee /usr/local/docker/nginx_docker/docker-compose.yml <<-'EOF' version: "3.1" services: nginx: image: nginx volumes: - ./html:/usr/share/nginx/html ports: - "8082:80" environment: - NGINX_HOST=foobar.com - NGINX_PORT=80 container_name: nginx EOF

cd /usr/local/docker/nginx_docker/

docker-compose up -d # -d後臺啟動 docker-compose down # 停止容器並移除

docker-compose stop # 停止 docker-compose start # 啟動 docker-compose restart # 重啟 ```

場景4:Dockerfile和compose組合使用

這裡用到了非markdown標準語法,主要是好看,自用,所以截了個圖,供參考!

寫在最後

好的工具、穩定的開發環境可以大幅提高工作效率,作者將自己日常積累的經驗分享出來希望能幫助更多的朋友!

【求評論、求點贊、求收藏】