docker容器化部署應用可以簡化應用的部署流程。假設部署一個應用需要在機器上安裝和配置nginx、tomcat,如果需要新增一臺伺服器,或者切換伺服器,那麼就要重複同樣的操作,安裝nginx、tomcat並配置。容器化部署就是一次配置到處使用,將安裝nginx配置nginx這一系列工作制作成一個映象,在伺服器上通過docker拉取映象並啟動容器即可,基於此實現叢集自動伸縮。
docker入門簡單,用好難,特別是製作映象。隨便做一個映象就是1g大小,這該怎麼用。如果每次部署都要拉1g的映象,想想都可怕。如果在Dockerfile中使用yum安裝一些軟體,build的時間會很長,加上映象太大,傳輸也耗時。應儘量使用安裝包安裝替換yum安裝,以及使用盡量小的基礎映象。
使用Dockerfile構建映象,我們可以理解為,docker基於Dockerfile中的FROM基礎映象,啟動了一個容器,然後在容器中執行Dockerfile中定義的指令碼,執行完成後再打包成映象。
docker的映象是分層的,你可以先定製一個基礎映象,再通過基礎映象去實現差異化定製。比如部署一個java專案,每臺機制都需要jdk,但並不是每臺機器都需要安裝nginx,那麼就可以先製作一個jdk基礎映象。當然,製作jdk基礎映象也是基於更底層的基礎映象,比如centos。然後再基於jdk基礎映象製作nginx映象,再製作應用映象。製作應用映象如果需要用到nginx就可以基於nginx映象,不需要依賴nginx的就可以直接基於jdk映象。
docker的命令不需要記,動動手去試一試就記住了,記不住可以使用docker -help檢視命令。新版本docker將命令規範了,如docker image是映象相關的,docker container是容器相關的,同樣,也可以使用docker container -help來檢視命令幫助。
Docker的埠、網路與容器卷學習docker除了映象製作之外,還需要理解這三點:埠對映、網路模式、容器卷(volume)。
埠對映
將宿主機埠對映到容器的埠,外部通過訪問宿主機埠從而訪問容器內應用。如容器中redis使用的埠是6379,可以將宿主機的10880埠與容器的6379埠對映,外部通過宿主機ip和10880埠訪問容器中的redis。
### 使用映象執行容器### -p 10880:6379 將宿主機10880埠對映到容器6379埠[root@wujiuye01 redis-app]# docker container run -itd --name simple-redis \\ -p 10880:6379 wujiuye/simple-redis:5.0.705676da445839b1f4a1995148b4656d029721503a16d67edad37956fe7ea9f3a### 宿主機訪問容器中的redis[root@wujiuye01 redis-app]# /root/redis/redis-5.0.5/src/redis-cli -p 10880127.0.0.1:10880>
網路模式
docker支援5種網路模式,這裡不做詳細分析,因為我不是很了解。在啟動容器時,可以指定使用哪種網路模式:docker container run --network [網路模式]。
bridge: 預設使用,docket啟動後預設建立一個docker0網橋,預設建立的容器也是新增到這個網橋中。host: 容器不會獲得一個獨立的network namespace,而是與宿主機共用一個。容器卷(volume)
應用部署在一臺伺服器上執行會產生日記,不能隨著容器的刪除而導致日記被刪除,所以需要將容器中的工作目錄與宿主機的目錄對映。或者說mysql容器,容器移除而資料庫檔案不能刪除。docker為我們提供了三種不同的方式將容器卷或宿主機目錄從宿主機掛載到容器中:volume、bind mount、tmpfs。
volumes
docker管理宿主檔案系統的一部分(/var/lib/docker/volumes/容器id)
建立容器卷:docker volume create test-vol檢視容器卷:docker volume inspect test-vol將容器卷掛載到容器的目錄:docker container run -itd --name test --mount src=test-vol,dst=/data/apps/test wujiuye/test:1.0.0--mount src=test-vol,dst=/data/apps/test: 將容器卷掛載到容器的/data/apps/test目錄。
將檔案放到容器的/data/apps/test目錄下,可以在宿主機的/var/lib/docker/volumes/test-vol目錄看到,反過來也是一樣的。如果不指定--mount,預設也是使用volumes,並且容器卷的名稱就是容器id,也是在/var/lib/docker/volume/目錄下。
### 建立容器卷[root@wujiuye01 docker]# docker volume create test-voltest-vol### 檢視容器卷資訊[root@wujiuye01 docker]# docker volume inspect test-vol[ { "CreatedAt": "2020-01-04T17:57:08+08:00", "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/test-vol/_data", "Name": "test-vol", "Options": {}, "Scope": "local" }]### 將容器卷掛載到容器[root@wujiuye01 docker]# docker container run -itd --name test \\ --mount src=test-vol,dst=/data/apps/test wujiuye/test:1.0.0
bind mounts
可以儲存在宿主機系統的任意目錄,宿主機的目錄必須存在。如果宿主機新增磁碟是掛載在/data目錄的,建議使用這種。如使用aws的ec2例項。
docker container run -itd --name test --mount type=bind,src=宿主機目錄,dst=容器目錄 wujiuye/test:1.0.0
將指定的宿主機目錄掛載到容器的指定目錄。將檔案放到<容器指定目錄>下,可以在<宿主機指定目錄>看到,反過來也是一樣的。
tmpfs
掛載儲存在宿主機系統的記憶體中,不會寫入宿主機的檔案系統
Docker的安裝與啟動docker安裝
# 較舊的 Docker 版本稱為 docker 或 docker-engine 。如果已安裝這些程式,請解除安裝它們以及相關的依賴項。sudo yum remove docker \\ docker-client \\ docker-client-latest \\ docker-common \\ docker-latest \\ docker-latest-logrotate \\ docker-logrotate \\ docker-engine# 安裝所需的軟體包。yum-utils 提供了 yum-config-manager ,並且 device mapper 儲存驅動程式需要 device-mapper-persistent-data 和 lvm2sudo yum install -y yum-utils \\ device-mapper-persistent-data \\ lvm2# 設定穩定的倉庫。sudo yum-config-manager \\ --add-repo \\ /file/2020/01/06/20200106001133_29978.jpg.repo 安裝最新版本的 Docker Engine-Community 和 containerdsudo yum install docker-ce docker-ce-cli containerd.io
docker服務啟動與停止
## 停止sudo systemctl stop docker## 啟動sudo systemctl start docker
Docker使用簡單事例
製作一個簡單的redis映象
準備redis安裝包和配置檔案,新建一個Dockerfile檔案,目錄結構如下:
-rw-r--r-- 1 root root 583 Jan 4 18:56 Dockerfile-rw-r--r-- 1 root root 1984203 Jan 4 18:52 redis-5.0.7.tar.gz-rw-r--r-- 1 root root 61797 Jan 4 18:52 redis.conf
編寫Dockerfile檔案,基於centos:7映象
FROM centos:7MAINTAINER wujiuye <[email protected]># 使用ps 命令 :ps -ef|grep redisRUN yum install -y procps# redis安裝包和配置檔案ADD redis-5.0.7.tar.gz /usr/local/redis/COPY redis.conf /usr/local/redis/local-redis.conf# 安裝gccRUN yum install gcc -y# 安裝makeRUN yum install make -y# 編譯redisRUN cd /usr/local/redis/redis-5.0.7 && \\ makeRUN yum clean allEXPOSE 6379# 啟動redisENTRYPOINT /usr/local/redis/redis-5.0.7/src/redis-serverCMD ["/usr/local/redis/local-redis.conf"]
1、COPY、ADD命令的src只能使用相對路徑,需要將檔案拷貝到Dockerfile的同級目錄下2、不要將redis安裝包與redis配置檔案COPY或ADD到容器的掛載目錄下,否則因宿主機的源目錄下沒有這些檔案,容器啟動起來就找不到這些檔案。構建映象時將檔案放在容器的/data/apps/目錄下,而啟動容器時配置宿主機目錄掛載到容器的/data/apps/,docker會將映象中原有的/data/apps/目錄移除,才可以掛載。3、RUM執行多條命令可使用&&符號連線,也可以寫多個RUN構建映象
### 目錄下的檔案[root@wujiuye01 redis-app]# lsDockerfile redis-5.0.7.tar.gz redis.conf### 構建映象[root@wujiuye01 redis-app]# docker image build --tag wujiuye/simple-redis:5.0.7 .....Successfully built 2aab79854763Successfully tagged wujiuye/simple-redis:5.0.7
--tag打標籤,最後的‘.’是Dockerfile檔案所在的位置。
根據映象啟動容器
docker container run \\--rm -itd \\--ulimit nofile=102400:102400 \\--name=simple-redis \\-p 10880:6379 \\ # 可寫多個--mount type=bind,src=/data/redis-app/,dst=/usr/local/redis \\wujiuye/simple-redis:5.0.7
--rm: 如果容器存在則刪除,只是移除容器,正在執行的容器不會停止--name=simple-redis: 給容器取一個名字-itd: -i、-t、-d的結合--ulimit nofile=102400:102400 設定ulimit-p 10880:6379 宿主機與容器的埠對映--mount type=bind,src=...,dst=... 檔案系統為bind mount,src為宿主機的目錄,dst為容器中的目錄檢視容器資訊
[root@wujiuye01 redis-app]# docker container ls### 容器id 使用的映象 容器執行的命令 建立時間 容器狀態 埠資訊 容器名稱CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES05676da44583 wujiuye/simple-redis:5.0.7 "/bin/sh -c /usr/loc…" 6 minutes ago Up 6 minutes 0.0.0.0:10880->6379/tcp simple-redis
將映象push到docker hub
在測試完映象可用之後,可以選擇push到遠端倉庫,也可自己搭建一個映象倉庫。
1)、註冊hub.docker.com賬號,id不要隨便填寫,如:wujiuye2)、建立一個倉庫,如:wujiuye/simple-redis3)、如果需要,將本地的映象打標籤,對應到遠端倉庫,如:docker tag local/test-redis:1.0.5 wujiuye/simple-redis:5.0.7。本地映象與遠端倉庫映象標籤不同時使用。4)、docker login 輸入使用者名稱密碼登陸5)、docker push wujiuye/simple-redis:5.0.7 推送映象至遠端倉庫[root@wujiuye01 redis-app]# docker push wujiuye/simple-redis:5.0.7The push refers to repository [docker.io/wujiuye/simple-redis]dafbadcc43aa: Pushing [==> ] 1.281MB/23.62MB879a0e8874ba: Pushing [=============================> ] 66.96MB/111.8MBccc522a455bc: Pushing [> ] 549.9kB/100.2MB879a0e8874ba: Pushing [================================> ] 73.04MB/111.8MBccc522a455bc: Pushing [> ] 1.107MB/100.2MBff7b8add839d: Pushing [=================> ] 51.75MB/146.8MBdca066a10cae: Pushing [> ] 557.1kB/100.8MB77b174a6a187: Waiting
Other
容器停止
1)、docker kill [容器名]可選引數:--signal: 傳送訊號量2)、docker stop []
刪除容器和映象
1)、刪除所有映象:docker rmi $(docker images -q)2)、刪除所有容器:1)、先停止所有容器:docker stop $(docker ps -a -q)2)、刪除所有容器:docker rm $(docker ps -a -q)
刪除某個映象:
1)、docker image rm [repository,如:wujiuye/simple-redis:5.0.7]2)、docker image rm [映象id]
刪除某個容器:
docker container rm [容器名稱 或 容器id]
來源 Java藝術 | wujiuye