docker學習(二)

玄月九九重又一發表於2020-12-18

4. 構建一個映象

  • 構建hello-world
    docker映象通過Dockerfile構建。
    建立名稱為Dockerfile空白檔案,其中錄入以下內容:
FROM alpine:3.9 
cmd ["echo", "hello world"]

此檔案的意思是,基於alpine:3.9這個微型linux映象構建,並在每次啟動docker映象的時候執行 "echo"命令輸出一
個“hello world”
在Dockerfile所在資料夾使用以下命令構建:

docker build -t glf_hello .

這個命令意思是,以當前目錄為上下文環境,構建出一個名稱為 glf_hello:latest 的docker映象。
完成後,再使用docker images命令檢視:
在這裡插入圖片描述
即可執行此映象:

docker run glf_hello

即可看到如下輸出:
在這裡插入圖片描述

  • 修改nginx映象
    使用run命令來在建立映象時修改映象中的內容,此處run命令執行 echo一段文字來更改nginx的預設首頁內容
FROM nginx 
RUN echo '<h1>hello docker</h1>' > /usr/share/nginx/html/index.html

使用以下命令構建

docker build -t glf_nginx .

執行構建的映象檢視

docker run -d --name=mynginx -p 80:80 glf_nginx

可以看到nginx的預設首頁內容已經更換
在這裡插入圖片描述

  • 構建複雜的jdk映象
    以下為Dockfile內容
FROM centos:7 

ENV JAVA_HOME /opt/jdk 
ENV PATH ${JAVA_HOME}/bin:${PATH} 

COPY jdk1.8.0_121.tar.gz /tmp/jdk1.8.0_121.tar.gz 

RUN mkdir -p "$JAVA_HOME"; \ 
	tar --extract --file /tmp/jdk1.8.0_121.tar.gz --directory "$JAVA_HOME" --strip- components 1; \ 
	rm /tmp/jdk1.8.0_121.tar.gz; 
WORKDIR /opt/jdk

ENV命令來在建立環境變數,這個環境變數會固化在映象中,在構建時和執行映象時都可以使用
COPY命令來將外部環境中的內容複製到docker映象的上下文中,以便在docker中使用
RUN命令來執行具體的建立jdk的過程,主要分為:建立目錄、解壓jdk壓縮包、刪除jdk壓縮包
WORKDIR命令來指定執行映象時預設的目錄

#構建命令 
docker build -t glf_centos_jdk:8 . 
#執行構建成的映象 
docker run -it --rm glf_centos_jdk:8 java -version
  • 將一個容器修改後設定為映象
    我們將一個容器執行起來,修改後再通過commit將其構建成映象
#啟動一個nginx映象,並命名 
docker run -d --name=mynginxdev nginx 
#以互動方式進入容器 
docker exec -it mynginxdev bash 
#將當前日期輸出到index.html中 
date > /usr/share/nginx/html/index.html 
#退出容器 exit #停止容器 
docker stop mynginxdev 
#將容器commit為一個新的映象 
docker commit mynginxdev nginx:glf_build 
#檢視新構建的映象 
docker images|grep nginx

#啟動一個新的映象 
docker run -d -p 8001:80 nginx:glf_build 
#再啟動一個新的映象 
 run -d -p 8002:80 nginx:glf_build 
 #啟動一箇舊的映象 
 docker run -d -p 80:80 nginx

5. 構建一個微服務映象

  • 微服務結構
    我們構建一個簡單的微服務例項,包括一個eureka註冊中心和兩個app。其中註冊中心我們直接做成映象,app直接
    使用jdk映象。
    在這裡插入圖片描述

  • 構建Eureka映象
    先來製作eureka微服務映象,在工作目錄以準備以下檔案:

.
├── config #erueka微服務配置 
│ └── application.properties 
├── Dockerfile #映象構建檔案 
├── eureka.jar #eureka微服務jar包 
└── start.sh #微服務啟動指令碼

Dockerfile內容為:

#基於我們自己在centos中構建的jdk 
FROM glf_centos_jdk:8 
#在容器中建立/data目錄 
RUN mkdir -p /data 
#將eureka的jar包複製進容器 
COPY eureka.jar /data/eureka.jar 
#將配置檔案目錄複製進容器 
COPY config /data/ 
#將啟動指令碼複製進容器 
COPY start.sh /data/start.sh 
#設定預設工作目錄 WORKDIR /data 
#設定啟動命令 
ENTRYPOINT ["sh", "/data/start.sh"]

小知識點CMD和ENTRYPOINT的區別:
CMD配置的內容會被覆蓋
ENTRYPOINT不會被覆蓋

docker run glf_hello 
docker run glf_hello echo "aaa"

啟動指令碼的內容:

#!/bin/sh 
cd /data java -jar eureka.jar

配置檔案config/application.properties檔案內容

server.port=8888 #容器內埠8888 
eureka.instance.hostname=my-eureka-server #主機名 
eureka.client.register-with-eureka=false eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
eureka.server.enableSelfPreservation=false #關閉自我保護

在此目錄構建映象:

#構建 
docker build -t my_eureka . 
#檢視映象 
docker images|grep my_eureka
  • 啟動Eureka服務
    再準備一個資料夾eureka-server,其中放置如下檔案:
.
├── config #erueka微服務配置 
│ └── application.properties 
└── start.sh #啟動指令碼

config資料夾中放置與在構建映象時同樣的配置檔案,以方便增加或修改引數。
start.sh啟動指令碼如下:

#!/bin/sh 
docker run -d --name=server --hostname=my-eureka-server -v /home/glf/server/eureka- server/config:/data/config -p 8000:8888 my_eureka

–name=server 指定啟動後的容器名稱為server
–hostname=my-eureka-server 指定啟動後的容器的主機名為my-eureka-server
-v /home/glf/server/eureka-server/config:/data/config 將外部config目錄對映到容器內來覆蓋預設
-p 8000:8888 將內部的8888埠對映到外部的8000埠

啟動eureka服務

chmod 777 start.sh ./start.sh #檢視啟動後的容器 docker ps #檢視啟動日誌 docker logs -f server
  • 啟動app01微服務
    分析erueka服務的映象,我們會發現只是在Jdk映象中放置了一個jar包,以後jar包一變就需要重新打映象,在一些場
    景下可以太浪費資源(對於需要按照映象進行版本管控或定製化內部較高的情況除外)。對於app01我們不再重新構
    建映象,直接使用jdk映象來啟動。

在工作目錄準備以下目錄及檔案:

.
├── data 
│ ├── app01.jar 
│ └── config 
│ └── application.properties 
└── start.sh

啟動指令碼 :

#!/bin/sh 
docker run -d --name=app01 --hostname=my-app01-client -v /home/glf/server/app01/data:/data --link server:my-eureka-server -p 8001:8888 glf_centos_jdk:8 sh -c "cd /data && java -jar /data/app01.jar"

application.properties檔案,這裡

server.port=8888 
spring.application.name=app01 
eureka.instance.prefer-ip-address=true eureka.client.serviceUrl.defaultZone=http://my-eureka-server:8888/eureka/

prefer-ip-address 需要設定為true,因為沒有在server中link這些app對應的容器,預設是無法通過hostname
即my-app01-client來訪問到app的,但是預設這些容器都在同一個網路中,可以通過ip訪問通
需要注意的時 defaultZone需要寫my-eureka-server,這是通過–link設定的,讓當前容器通過my-eurekaserver這個hostname可以訪問到eureka伺服器

啟動app01:

chmod 777 start.sh ./start.sh 
#檢視啟動後的容器 
docker ps 
#檢視啟動日誌 
docker logs -f server
  • 啟動app02微服務
    與app01相同,只是修改了部分配置。
    目錄結構:
.
├── data │ 
├── app02.jar 
│ └── config 
│ └── application.properties 
└── start.sh

啟動指令碼 start.sh

#!/bin/sh 
docker run -d --name=app02 --hostname=my-app02-client -v /home/glf/server/app02/data:/data --link server:my-eureka-server -p 8002:8888 glf_centos_jdk:8 sh -c "cd /data && java -jar /data/app02.jar"

配置檔案application.properties

server.port=8888 
spring.application.name=app02 
eureka.instance.prefer-ip-address=true 
eureka.client.serviceUrl.defaultZone=http://my-eureka-server:8888/eureka/

啟動完成可以看到eureka兩個服務都註冊上了:
在這裡插入圖片描述

6. 參考資料

CentOS下Docker CE安裝方法: https://docs.docker.com/install/linux/docker-ce/centos/
Docker-hub地址:https://hub.docker.com
Hello-World官方映象的Dockerfile原始碼地址: https://github.com/docker-library/hello-world/tree/master/amd64/hello-world
Dockerfile 官方文件:https://docs.docker.com/engine/reference/builder/
Dockerfile 常用命令介紹:https://www.cnblogs.com/boshen-hzb/p/6400272.html
RabbitMQ官方映象地址: https://hub.docker.com/_/rabbitmq?tab=description

相關文章